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 */ 999355ec05SMatthew G. Knepley PetscErrorCode (*monitordestroy[MAXOPTIONSMONITORS])(void **); /* 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 106c5b5d8d5SVaclav Hapla /* list of options which preceed 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; 127c5b5d8d5SVaclav Hapla if (!value) value = ""; 1289355ec05SMatthew G. Knepley if (options->monitorFromOptions) PetscCall(PetscOptionsMonitorDefault(name, value, source, NULL)); 1299355ec05SMatthew G. Knepley for (PetscInt i = 0; i < options->numbermonitors; i++) PetscCall((*options->monitor[i])(name, value, source, options->monitorcontext[i])); 1303ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 131e5c89e4eSSatish Balay } 132e5c89e4eSSatish Balay 1332d747510SLisandro Dalcin /*@ 1342d747510SLisandro Dalcin PetscOptionsCreate - Creates an empty options database. 135e5c89e4eSSatish Balay 1361c9f3c13SBarry Smith Logically collective 1371c9f3c13SBarry Smith 138e5c89e4eSSatish Balay Output Parameter: 1392d747510SLisandro Dalcin . options - Options database object 140e5c89e4eSSatish Balay 141e5c89e4eSSatish Balay Level: advanced 142e5c89e4eSSatish Balay 143811af0c4SBarry Smith Note: 144811af0c4SBarry Smith Though PETSc has a concept of multiple options database the current code uses a single default `PetscOptions` object 145811af0c4SBarry Smith 146811af0c4SBarry Smith Developer Notes: 147811af0c4SBarry Smith We may want eventually to pass a `MPI_Comm` to determine the ownership of the object 148811af0c4SBarry Smith 149811af0c4SBarry Smith This object never got developed after being introduced, it is not clear that supporting multiple `PetscOptions` objects is useful 1501c9f3c13SBarry Smith 151db781477SPatrick Sanan .seealso: `PetscOptionsDestroy()`, `PetscOptionsPush()`, `PetscOptionsPop()`, `PetscOptionsInsert()`, `PetscOptionsSetValue()` 152e5c89e4eSSatish Balay @*/ 153d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsCreate(PetscOptions *options) 154d71ae5a4SJacob Faibussowitsch { 15539a651e2SJacob Faibussowitsch PetscFunctionBegin; 15639a651e2SJacob Faibussowitsch PetscValidPointer(options, 1); 1572d747510SLisandro Dalcin *options = (PetscOptions)calloc(1, sizeof(**options)); 15839a651e2SJacob Faibussowitsch PetscCheck(*options, PETSC_COMM_SELF, PETSC_ERR_MEM, "Failed to allocate the options database"); 1593ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1602d747510SLisandro Dalcin } 1612d747510SLisandro Dalcin 1622d747510SLisandro Dalcin /*@ 1632d747510SLisandro Dalcin PetscOptionsDestroy - Destroys an option database. 1642d747510SLisandro Dalcin 165811af0c4SBarry Smith Logically collective on whatever communicator was associated with the call to `PetscOptionsCreate()` 1661c9f3c13SBarry Smith 1672d747510SLisandro Dalcin Input Parameter: 168811af0c4SBarry Smith . options - the `PetscOptions` object 1692d747510SLisandro Dalcin 1703de2bfdfSBarry Smith Level: advanced 1712d747510SLisandro Dalcin 172db781477SPatrick Sanan .seealso: `PetscOptionsInsert()`, `PetscOptionsPush()`, `PetscOptionsPop()`, `PetscOptionsInsert()`, `PetscOptionsSetValue()` 1732d747510SLisandro Dalcin @*/ 174d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsDestroy(PetscOptions *options) 175d71ae5a4SJacob Faibussowitsch { 176362febeeSStefano Zampini PetscFunctionBegin; 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 205b4205f0bSBarry Smith Notes: 206811af0c4SBarry Smith Use `PetscOptionsPop()` to return to the previous default options database 2071c9f3c13SBarry Smith 208811af0c4SBarry Smith The collectivity of this routine is complex; only the MPI ranks that call this routine will 2091c9f3c13SBarry Smith have the affect of these options. If some processes that create objects call this routine and others do 2101c9f3c13SBarry Smith not the code may fail in complicated ways because the same parallel solvers may incorrectly use different options 2111c9f3c13SBarry Smith on different ranks. 212b4205f0bSBarry Smith 213811af0c4SBarry Smith Developer Note: 214811af0c4SBarry Smith Though this functionality has been provided it has never been used in PETSc and might be removed. 215811af0c4SBarry Smith 2163de2bfdfSBarry Smith Level: advanced 2173de2bfdfSBarry 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 232811af0c4SBarry Smith Logically collective on whatever communicator was associated with the call to `PetscOptionsCreate()` 233b4205f0bSBarry Smith 2343de2bfdfSBarry Smith Level: advanced 2353de2bfdfSBarry Smith 236db781477SPatrick Sanan .seealso: `PetscOptionsPop()`, `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 26894ef8ddeSSatish Balay /*@C 2697cd08cecSJed Brown PetscOptionsValidKey - PETSc Options database keys must begin with one or two dashes (-) followed by a letter. 2703fc1eb6aSBarry Smith 271447722d5SBarry 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 2803fc1eb6aSBarry Smith @*/ 281d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsValidKey(const char key[], PetscBool *valid) 282d71ae5a4SJacob Faibussowitsch { 283f603b5e9SToby Isaac char *ptr; 2847c5db45bSBarry Smith 28596fc60bcSBarry Smith PetscFunctionBegin; 2862d747510SLisandro Dalcin if (key) PetscValidCharPointer(key, 1); 287dadcf809SJacob Faibussowitsch PetscValidBoolPointer(valid, 2); 2882d747510SLisandro Dalcin *valid = PETSC_FALSE; 2893ba16761SJacob Faibussowitsch if (!key) PetscFunctionReturn(PETSC_SUCCESS); 2903ba16761SJacob Faibussowitsch if (key[0] != '-') PetscFunctionReturn(PETSC_SUCCESS); 2912d747510SLisandro Dalcin if (key[1] == '-') key++; 2923ba16761SJacob Faibussowitsch if (!isalpha((int)key[1])) PetscFunctionReturn(PETSC_SUCCESS); 2932d747510SLisandro Dalcin (void)strtod(key, &ptr); 2943ba16761SJacob Faibussowitsch if (ptr != key && !(*ptr == '_' || isalnum((int)*ptr))) PetscFunctionReturn(PETSC_SUCCESS); 2952d747510SLisandro Dalcin *valid = PETSC_TRUE; 2963ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 29796fc60bcSBarry Smith } 29896fc60bcSBarry Smith 2999355ec05SMatthew G. Knepley PetscErrorCode PetscOptionsInsertString_Private(PetscOptions options, const char in_str[], PetscOptionSource source) 300d71ae5a4SJacob Faibussowitsch { 301d06005cbSLisandro Dalcin MPI_Comm comm = PETSC_COMM_SELF; 302d06005cbSLisandro Dalcin char *first, *second; 3039c9d3cfdSBarry Smith PetscToken token; 304e5c89e4eSSatish Balay 305e5c89e4eSSatish Balay PetscFunctionBegin; 3069566063dSJacob Faibussowitsch PetscCall(PetscTokenCreate(in_str, ' ', &token)); 3079566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token, &first)); 30896fc60bcSBarry Smith while (first) { 309d06005cbSLisandro Dalcin PetscBool isfile, isfileyaml, isstringyaml, ispush, ispop, key; 3109566063dSJacob Faibussowitsch PetscCall(PetscStrcasecmp(first, "-options_file", &isfile)); 3119566063dSJacob Faibussowitsch PetscCall(PetscStrcasecmp(first, "-options_file_yaml", &isfileyaml)); 3129566063dSJacob Faibussowitsch PetscCall(PetscStrcasecmp(first, "-options_string_yaml", &isstringyaml)); 3139566063dSJacob Faibussowitsch PetscCall(PetscStrcasecmp(first, "-prefix_push", &ispush)); 3149566063dSJacob Faibussowitsch PetscCall(PetscStrcasecmp(first, "-prefix_pop", &ispop)); 3159566063dSJacob Faibussowitsch PetscCall(PetscOptionsValidKey(first, &key)); 316d06005cbSLisandro Dalcin if (!key) { 3179566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token, &first)); 318d06005cbSLisandro Dalcin } else if (isfile) { 3199566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token, &second)); 3209566063dSJacob Faibussowitsch PetscCall(PetscOptionsInsertFile(comm, options, second, PETSC_TRUE)); 3219566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token, &first)); 322d06005cbSLisandro Dalcin } else if (isfileyaml) { 3239566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token, &second)); 3249566063dSJacob Faibussowitsch PetscCall(PetscOptionsInsertFileYAML(comm, options, second, PETSC_TRUE)); 3259566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token, &first)); 326d06005cbSLisandro Dalcin } else if (isstringyaml) { 3279566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token, &second)); 3289355ec05SMatthew G. Knepley PetscCall(PetscOptionsInsertStringYAML_Private(options, second, source)); 3299566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token, &first)); 330d06005cbSLisandro Dalcin } else if (ispush) { 3319566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token, &second)); 3329566063dSJacob Faibussowitsch PetscCall(PetscOptionsPrefixPush(options, second)); 3339566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token, &first)); 3349db968c8SJed Brown } else if (ispop) { 3359566063dSJacob Faibussowitsch PetscCall(PetscOptionsPrefixPop(options)); 3369566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token, &first)); 337d06005cbSLisandro Dalcin } else { 3389566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token, &second)); 3399566063dSJacob Faibussowitsch PetscCall(PetscOptionsValidKey(second, &key)); 34096fc60bcSBarry Smith if (!key) { 3419355ec05SMatthew G. Knepley PetscCall(PetscOptionsSetValue_Private(options, first, second, NULL, source)); 3429566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token, &first)); 34396fc60bcSBarry Smith } else { 3449355ec05SMatthew G. Knepley PetscCall(PetscOptionsSetValue_Private(options, first, NULL, NULL, source)); 34596fc60bcSBarry Smith first = second; 34696fc60bcSBarry Smith } 347e5c89e4eSSatish Balay } 348e5c89e4eSSatish Balay } 3499566063dSJacob Faibussowitsch PetscCall(PetscTokenDestroy(&token)); 3503ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 351e5c89e4eSSatish Balay } 352e5c89e4eSSatish Balay 3539355ec05SMatthew G. Knepley /*@C 3549355ec05SMatthew G. Knepley PetscOptionsInsertString - Inserts options into the database from a string 3559355ec05SMatthew G. Knepley 3569355ec05SMatthew G. Knepley Logically Collective 3579355ec05SMatthew G. Knepley 3589355ec05SMatthew G. Knepley Input Parameters: 3599355ec05SMatthew G. Knepley + options - options object 3609355ec05SMatthew G. Knepley - in_str - string that contains options separated by blanks 3619355ec05SMatthew G. Knepley 3629355ec05SMatthew G. Knepley Level: intermediate 3639355ec05SMatthew G. Knepley 3649355ec05SMatthew G. Knepley The collectivity of this routine is complex; only the MPI ranks that call this routine will 3659355ec05SMatthew G. Knepley have the affect of these options. If some processes that create objects call this routine and others do 3669355ec05SMatthew G. Knepley not the code may fail in complicated ways because the same parallel solvers may incorrectly use different options 3679355ec05SMatthew G. Knepley on different ranks. 3689355ec05SMatthew G. Knepley 3699355ec05SMatthew G. Knepley Contributed by Boyana Norris 3709355ec05SMatthew G. Knepley 3719355ec05SMatthew G. Knepley .seealso: `PetscOptionsSetValue()`, `PetscOptionsView()`, `PetscOptionsHasName()`, `PetscOptionsGetInt()`, 3729355ec05SMatthew G. Knepley `PetscOptionsGetReal()`, `PetscOptionsGetString()`, `PetscOptionsGetIntArray()`, `PetscOptionsBool()`, 3739355ec05SMatthew G. Knepley `PetscOptionsName()`, `PetscOptionsBegin()`, `PetscOptionsEnd()`, `PetscOptionsHeadBegin()`, 3749355ec05SMatthew G. Knepley `PetscOptionsStringArray()`, `PetscOptionsRealArray()`, `PetscOptionsScalar()`, 3759355ec05SMatthew G. Knepley `PetscOptionsBoolGroupBegin()`, `PetscOptionsBoolGroup()`, `PetscOptionsBoolGroupEnd()`, 3769355ec05SMatthew G. Knepley `PetscOptionsFList()`, `PetscOptionsEList()`, `PetscOptionsInsertFile()` 3779355ec05SMatthew G. Knepley @*/ 3789355ec05SMatthew G. Knepley PetscErrorCode PetscOptionsInsertString(PetscOptions options, const char in_str[]) 3799355ec05SMatthew G. Knepley { 3809355ec05SMatthew G. Knepley PetscFunctionBegin; 3819355ec05SMatthew G. Knepley PetscCall(PetscOptionsInsertString_Private(options, in_str, PETSC_OPT_CODE)); 3823ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 3839355ec05SMatthew G. Knepley } 3849355ec05SMatthew G. Knepley 3853fc1eb6aSBarry Smith /* 3863fc1eb6aSBarry Smith Returns a line (ended by a \n, \r or null character of any length. Result should be freed with free() 3873fc1eb6aSBarry Smith */ 388d71ae5a4SJacob Faibussowitsch static char *Petscgetline(FILE *f) 389d71ae5a4SJacob Faibussowitsch { 3905fa91da5SBarry Smith size_t size = 0; 3915fa91da5SBarry Smith size_t len = 0; 3925fa91da5SBarry Smith size_t last = 0; 3930298fd71SBarry Smith char *buf = NULL; 3945fa91da5SBarry Smith 39502c9f0b5SLisandro Dalcin if (feof(f)) return NULL; 3965fa91da5SBarry Smith do { 3975fa91da5SBarry Smith size += 1024; /* BUFSIZ is defined as "the optimal read size for this platform" */ 3986e0c8459SSatish Balay buf = (char *)realloc((void *)buf, size); /* realloc(NULL,n) is the same as malloc(n) */ 3995fa91da5SBarry Smith /* Actually do the read. Note that fgets puts a terminal '\0' on the 4005fa91da5SBarry Smith end of the string, so we make sure we overwrite this */ 401e86f3e45SDave May if (!fgets(buf + len, 1024, f)) buf[len] = 0; 4023ba16761SJacob Faibussowitsch PetscCallAbort(PETSC_COMM_SELF, PetscStrlen(buf, &len)); 4035fa91da5SBarry Smith last = len - 1; 4045fa91da5SBarry Smith } while (!feof(f) && buf[last] != '\n' && buf[last] != '\r'); 40508ac41f7SSatish Balay if (len) return buf; 4065fa91da5SBarry Smith free(buf); 40702c9f0b5SLisandro Dalcin return NULL; 4085fa91da5SBarry Smith } 4095fa91da5SBarry Smith 410d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscOptionsFilename(MPI_Comm comm, const char file[], char filename[PETSC_MAX_PATH_LEN], PetscBool *yaml) 411d71ae5a4SJacob Faibussowitsch { 412be10d61cSLisandro Dalcin char fname[PETSC_MAX_PATH_LEN + 8], path[PETSC_MAX_PATH_LEN + 8], *tail; 413e5c89e4eSSatish Balay 414be10d61cSLisandro Dalcin PetscFunctionBegin; 415362febeeSStefano Zampini *yaml = PETSC_FALSE; 4169566063dSJacob Faibussowitsch PetscCall(PetscStrreplace(comm, file, fname, sizeof(fname))); 4179566063dSJacob Faibussowitsch PetscCall(PetscFixFilename(fname, path)); 4189566063dSJacob Faibussowitsch PetscCall(PetscStrendswith(path, ":yaml", yaml)); 419be10d61cSLisandro Dalcin if (*yaml) { 4209566063dSJacob Faibussowitsch PetscCall(PetscStrrchr(path, ':', &tail)); 421be10d61cSLisandro Dalcin tail[-1] = 0; /* remove ":yaml" suffix from path */ 422be10d61cSLisandro Dalcin } 4239566063dSJacob Faibussowitsch PetscCall(PetscStrncpy(filename, path, PETSC_MAX_PATH_LEN)); 424a1d2f846SLisandro Dalcin /* check for standard YAML and JSON filename extensions */ 4259566063dSJacob Faibussowitsch if (!*yaml) PetscCall(PetscStrendswith(filename, ".yaml", yaml)); 4269566063dSJacob Faibussowitsch if (!*yaml) PetscCall(PetscStrendswith(filename, ".yml", yaml)); 4279566063dSJacob Faibussowitsch if (!*yaml) PetscCall(PetscStrendswith(filename, ".json", yaml)); 428a1d2f846SLisandro Dalcin if (!*yaml) { /* check file contents */ 429a1d2f846SLisandro Dalcin PetscMPIInt rank; 4309566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(comm, &rank)); 431dd400576SPatrick Sanan if (rank == 0) { 432a1d2f846SLisandro Dalcin FILE *fh = fopen(filename, "r"); 433a1d2f846SLisandro Dalcin if (fh) { 434a1d2f846SLisandro Dalcin char buf[6] = ""; 435a1d2f846SLisandro Dalcin if (fread(buf, 1, 6, fh) > 0) { 4369566063dSJacob Faibussowitsch PetscCall(PetscStrncmp(buf, "%YAML ", 6, yaml)); /* check for '%YAML' tag */ 4379566063dSJacob Faibussowitsch if (!*yaml) PetscCall(PetscStrncmp(buf, "---", 3, yaml)); /* check for document start */ 438a1d2f846SLisandro Dalcin } 439a1d2f846SLisandro Dalcin (void)fclose(fh); 440a1d2f846SLisandro Dalcin } 441a1d2f846SLisandro Dalcin } 4429566063dSJacob Faibussowitsch PetscCallMPI(MPI_Bcast(yaml, 1, MPIU_BOOL, 0, comm)); 443a1d2f846SLisandro Dalcin } 4443ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 445be10d61cSLisandro Dalcin } 446e5c89e4eSSatish Balay 447d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscOptionsInsertFilePetsc(MPI_Comm comm, PetscOptions options, const char file[], PetscBool require) 448d71ae5a4SJacob Faibussowitsch { 4498c0b561eSLisandro Dalcin char *string, *vstring = NULL, *astring = NULL, *packed = NULL; 4507fb43599SVaclav Hapla char *tokens[4]; 45113e3f751SJed Brown size_t i, len, bytes; 452e5c89e4eSSatish Balay FILE *fd; 4537fb43599SVaclav Hapla PetscToken token = NULL; 454ed9cf6e9SBarry Smith int err; 455bbcf679cSJacob Faibussowitsch char *cmatch = NULL; 456581bbe83SVaclav Hapla const char cmt = '#'; 4579210b8eaSVaclav Hapla PetscInt line = 1; 4583a018368SJed Brown PetscMPIInt rank, cnt = 0, acnt = 0, counts[2]; 4599210b8eaSVaclav Hapla PetscBool isdir, alias = PETSC_FALSE, valid; 460e5c89e4eSSatish Balay 461e5c89e4eSSatish Balay PetscFunctionBegin; 4629566063dSJacob Faibussowitsch PetscCall(PetscMemzero(tokens, sizeof(tokens))); 4639566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(comm, &rank)); 464dd400576SPatrick Sanan if (rank == 0) { 4658c0b561eSLisandro Dalcin char fpath[PETSC_MAX_PATH_LEN]; 4668c0b561eSLisandro Dalcin char fname[PETSC_MAX_PATH_LEN]; 46705c7dedfSBarry Smith 4689566063dSJacob Faibussowitsch PetscCall(PetscStrreplace(PETSC_COMM_SELF, file, fpath, sizeof(fpath))); 4699566063dSJacob Faibussowitsch PetscCall(PetscFixFilename(fpath, fname)); 4708c0b561eSLisandro Dalcin 471e5c89e4eSSatish Balay fd = fopen(fname, "r"); 4729566063dSJacob Faibussowitsch PetscCall(PetscTestDirectory(fname, 'r', &isdir)); 47308401ef6SPierre Jolivet PetscCheck(!isdir || !require, PETSC_COMM_SELF, PETSC_ERR_USER, "Specified options file %s is a directory", fname); 474ad38b122SPatrick Sanan if (fd && !isdir) { 4753a018368SJed Brown PetscSegBuffer vseg, aseg; 4769566063dSJacob Faibussowitsch PetscCall(PetscSegBufferCreate(1, 4000, &vseg)); 4779566063dSJacob Faibussowitsch PetscCall(PetscSegBufferCreate(1, 2000, &aseg)); 4783a018368SJed Brown 4799b754dc9SBarry Smith /* the following line will not work when opening initial files (like .petscrc) since info is not yet set */ 4809566063dSJacob Faibussowitsch PetscCall(PetscInfo(NULL, "Opened options file %s\n", file)); 481e24ecc5dSJed Brown 4825fa91da5SBarry Smith while ((string = Petscgetline(fd))) { 4834704e885SBarry Smith /* eliminate comments from each line */ 4849566063dSJacob Faibussowitsch PetscCall(PetscStrchr(string, cmt, &cmatch)); 48590f79514SSatish Balay if (cmatch) *cmatch = 0; 4869566063dSJacob Faibussowitsch PetscCall(PetscStrlen(string, &len)); 4875981331cSSatish Balay /* replace tabs, ^M, \n with " " */ 488e5c89e4eSSatish Balay for (i = 0; i < len; i++) { 489ad540459SPierre Jolivet if (string[i] == '\t' || string[i] == '\r' || string[i] == '\n') string[i] = ' '; 490e5c89e4eSSatish Balay } 4919566063dSJacob Faibussowitsch PetscCall(PetscTokenCreate(string, ' ', &token)); 4929566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token, &tokens[0])); 4937fb43599SVaclav Hapla if (!tokens[0]) { 49402b0d46eSSatish Balay goto destroy; 4957fb43599SVaclav Hapla } else if (!tokens[0][0]) { /* if token 0 is empty (string begins with spaces), redo */ 4969566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token, &tokens[0])); 49790f79514SSatish Balay } 49848a46eb9SPierre Jolivet for (i = 1; i < 4; i++) PetscCall(PetscTokenFind(token, &tokens[i])); 4997fb43599SVaclav Hapla if (!tokens[0]) { 5002662f744SSatish Balay goto destroy; 5017fb43599SVaclav Hapla } else if (tokens[0][0] == '-') { 5029566063dSJacob Faibussowitsch PetscCall(PetscOptionsValidKey(tokens[0], &valid)); 50328b400f6SJacob 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]); 5049566063dSJacob Faibussowitsch PetscCall(PetscStrlen(tokens[0], &len)); 5059566063dSJacob Faibussowitsch PetscCall(PetscSegBufferGet(vseg, len + 1, &vstring)); 5069566063dSJacob Faibussowitsch PetscCall(PetscArraycpy(vstring, tokens[0], len)); 507e24ecc5dSJed Brown vstring[len] = ' '; 5087fb43599SVaclav Hapla if (tokens[1]) { 5099566063dSJacob Faibussowitsch PetscCall(PetscOptionsValidKey(tokens[1], &valid)); 51028b400f6SJacob 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]); 5119566063dSJacob Faibussowitsch PetscCall(PetscStrlen(tokens[1], &len)); 5129566063dSJacob Faibussowitsch PetscCall(PetscSegBufferGet(vseg, len + 3, &vstring)); 513e24ecc5dSJed Brown vstring[0] = '"'; 5149566063dSJacob Faibussowitsch PetscCall(PetscArraycpy(vstring + 1, tokens[1], len)); 515e24ecc5dSJed Brown vstring[len + 1] = '"'; 516e24ecc5dSJed Brown vstring[len + 2] = ' '; 51709192fe3SBarry Smith } 51890f79514SSatish Balay } else { 5199566063dSJacob Faibussowitsch PetscCall(PetscStrcasecmp(tokens[0], "alias", &alias)); 5209210b8eaSVaclav Hapla if (alias) { 5219566063dSJacob Faibussowitsch PetscCall(PetscOptionsValidKey(tokens[1], &valid)); 52228b400f6SJacob 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]); 52308401ef6SPierre 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]); 5249566063dSJacob Faibussowitsch PetscCall(PetscOptionsValidKey(tokens[2], &valid)); 52528b400f6SJacob 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]); 5269566063dSJacob Faibussowitsch PetscCall(PetscStrlen(tokens[1], &len)); 5279566063dSJacob Faibussowitsch PetscCall(PetscSegBufferGet(aseg, len + 1, &astring)); 5289566063dSJacob Faibussowitsch PetscCall(PetscArraycpy(astring, tokens[1], len)); 529e24ecc5dSJed Brown astring[len] = ' '; 530e24ecc5dSJed Brown 5319566063dSJacob Faibussowitsch PetscCall(PetscStrlen(tokens[2], &len)); 5329566063dSJacob Faibussowitsch PetscCall(PetscSegBufferGet(aseg, len + 1, &astring)); 5339566063dSJacob Faibussowitsch PetscCall(PetscArraycpy(astring, tokens[2], len)); 534e24ecc5dSJed Brown astring[len] = ' '; 53598921bdaSJacob Faibussowitsch } else SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Unknown first token in options file %s line %" PetscInt_FMT ": %s", fname, line, tokens[0]); 5369210b8eaSVaclav Hapla } 5379210b8eaSVaclav Hapla { 5389210b8eaSVaclav Hapla const char *extraToken = alias ? tokens[3] : tokens[2]; 53928b400f6SJacob Faibussowitsch PetscCheck(!extraToken, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Error in options file %s line %" PetscInt_FMT ": extra token %s", fname, line, extraToken); 540e5c89e4eSSatish Balay } 54102b0d46eSSatish Balay destroy: 5424b40f50bSBarry Smith free(string); 5439566063dSJacob Faibussowitsch PetscCall(PetscTokenDestroy(&token)); 5449210b8eaSVaclav Hapla alias = PETSC_FALSE; 5459210b8eaSVaclav Hapla line++; 546e5c89e4eSSatish Balay } 547ed9cf6e9SBarry Smith err = fclose(fd); 54828b400f6SJacob Faibussowitsch PetscCheck(!err, PETSC_COMM_SELF, PETSC_ERR_SYS, "fclose() failed on file %s", fname); 5499566063dSJacob Faibussowitsch PetscCall(PetscSegBufferGetSize(aseg, &bytes)); /* size without null termination */ 5509566063dSJacob Faibussowitsch PetscCall(PetscMPIIntCast(bytes, &acnt)); 5519566063dSJacob Faibussowitsch PetscCall(PetscSegBufferGet(aseg, 1, &astring)); 552e24ecc5dSJed Brown astring[0] = 0; 5539566063dSJacob Faibussowitsch PetscCall(PetscSegBufferGetSize(vseg, &bytes)); /* size without null termination */ 5549566063dSJacob Faibussowitsch PetscCall(PetscMPIIntCast(bytes, &cnt)); 5559566063dSJacob Faibussowitsch PetscCall(PetscSegBufferGet(vseg, 1, &vstring)); 556e24ecc5dSJed Brown vstring[0] = 0; 5579566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(2 + acnt + cnt, &packed)); 5589566063dSJacob Faibussowitsch PetscCall(PetscSegBufferExtractTo(aseg, packed)); 5599566063dSJacob Faibussowitsch PetscCall(PetscSegBufferExtractTo(vseg, packed + acnt + 1)); 5609566063dSJacob Faibussowitsch PetscCall(PetscSegBufferDestroy(&aseg)); 5619566063dSJacob Faibussowitsch PetscCall(PetscSegBufferDestroy(&vseg)); 56228b400f6SJacob Faibussowitsch } else PetscCheck(!require, PETSC_COMM_SELF, PETSC_ERR_USER, "Unable to open options file %s", fname); 5639b754dc9SBarry Smith } 56405c7dedfSBarry Smith 5653a018368SJed Brown counts[0] = acnt; 5663a018368SJed Brown counts[1] = cnt; 5674201f521SBarry Smith err = MPI_Bcast(counts, 2, MPI_INT, 0, comm); 56828b400f6SJacob 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/"); 5693a018368SJed Brown acnt = counts[0]; 5703a018368SJed Brown cnt = counts[1]; 57148a46eb9SPierre Jolivet if (rank) PetscCall(PetscMalloc1(2 + acnt + cnt, &packed)); 5723a018368SJed Brown if (acnt || cnt) { 5739566063dSJacob Faibussowitsch PetscCallMPI(MPI_Bcast(packed, 2 + acnt + cnt, MPI_CHAR, 0, comm)); 5743a018368SJed Brown astring = packed; 5753a018368SJed Brown vstring = packed + acnt + 1; 5763a018368SJed Brown } 5773a018368SJed Brown 5789b754dc9SBarry Smith if (acnt) { 5799566063dSJacob Faibussowitsch PetscCall(PetscTokenCreate(astring, ' ', &token)); 5809566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token, &tokens[0])); 5817fb43599SVaclav Hapla while (tokens[0]) { 5829566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token, &tokens[1])); 5839566063dSJacob Faibussowitsch PetscCall(PetscOptionsSetAlias(options, tokens[0], tokens[1])); 5849566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token, &tokens[0])); 5859b754dc9SBarry Smith } 5869566063dSJacob Faibussowitsch PetscCall(PetscTokenDestroy(&token)); 5879b754dc9SBarry Smith } 5889b754dc9SBarry Smith 5899355ec05SMatthew G. Knepley if (cnt) PetscCall(PetscOptionsInsertString_Private(options, vstring, PETSC_OPT_FILE)); 5909566063dSJacob Faibussowitsch PetscCall(PetscFree(packed)); 5913ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 592e5c89e4eSSatish Balay } 593e5c89e4eSSatish Balay 594d06005cbSLisandro Dalcin /*@C 595be10d61cSLisandro Dalcin PetscOptionsInsertFile - Inserts options into the database from a file. 596be10d61cSLisandro Dalcin 597be10d61cSLisandro Dalcin Collective 598be10d61cSLisandro Dalcin 599d8d19677SJose E. Roman Input Parameters: 600811af0c4SBarry Smith + comm - the processes that will share the options (usually `PETSC_COMM_WORLD`) 601be10d61cSLisandro Dalcin . options - options database, use NULL for default global database 602be10d61cSLisandro Dalcin . file - name of file, 603be10d61cSLisandro Dalcin ".yml" and ".yaml" filename extensions are inserted as YAML options, 604be10d61cSLisandro Dalcin append ":yaml" to filename to force YAML options. 605811af0c4SBarry Smith - require - if `PETSC_TRUE` will generate an error if the file does not exist 606be10d61cSLisandro Dalcin 607be10d61cSLisandro Dalcin Notes: 608be10d61cSLisandro Dalcin Use # for lines that are comments and which should be ignored. 609811af0c4SBarry Smith Usually, instead of using this command, one should list the file name in the call to `PetscInitialize()`, this insures that certain options 610be10d61cSLisandro Dalcin such as -log_view or -malloc_debug are processed properly. This routine only sets options into the options database that will be processed by later 611be10d61cSLisandro Dalcin calls to XXXSetFromOptions() it should not be used for options listed under PetscInitialize(). 612811af0c4SBarry Smith The collectivity of this routine is complex; only the MPI ranks in comm will 613be10d61cSLisandro Dalcin have the affect of these options. If some processes that create objects call this routine and others do 614be10d61cSLisandro Dalcin not the code may fail in complicated ways because the same parallel solvers may incorrectly use different options 615be10d61cSLisandro Dalcin on different ranks. 616be10d61cSLisandro Dalcin 617be10d61cSLisandro Dalcin Level: developer 618be10d61cSLisandro Dalcin 619db781477SPatrick Sanan .seealso: `PetscOptionsSetValue()`, `PetscOptionsView()`, `PetscOptionsHasName()`, `PetscOptionsGetInt()`, 620db781477SPatrick Sanan `PetscOptionsGetReal()`, `PetscOptionsGetString()`, `PetscOptionsGetIntArray()`, `PetscOptionsBool()`, 621db781477SPatrick Sanan `PetscOptionsName()`, `PetscOptionsBegin()`, `PetscOptionsEnd()`, `PetscOptionsHeadBegin()`, 622c2e3fba1SPatrick Sanan `PetscOptionsStringArray()`, `PetscOptionsRealArray()`, `PetscOptionsScalar()`, 623db781477SPatrick Sanan `PetscOptionsBoolGroupBegin()`, `PetscOptionsBoolGroup()`, `PetscOptionsBoolGroupEnd()`, 624db781477SPatrick Sanan `PetscOptionsFList()`, `PetscOptionsEList()` 625be10d61cSLisandro Dalcin @*/ 626d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsInsertFile(MPI_Comm comm, PetscOptions options, const char file[], PetscBool require) 627d71ae5a4SJacob Faibussowitsch { 628be10d61cSLisandro Dalcin char filename[PETSC_MAX_PATH_LEN]; 629be10d61cSLisandro Dalcin PetscBool yaml; 630be10d61cSLisandro Dalcin 631be10d61cSLisandro Dalcin PetscFunctionBegin; 6329566063dSJacob Faibussowitsch PetscCall(PetscOptionsFilename(comm, file, filename, &yaml)); 633be10d61cSLisandro Dalcin if (yaml) { 6349566063dSJacob Faibussowitsch PetscCall(PetscOptionsInsertFileYAML(comm, options, filename, require)); 635be10d61cSLisandro Dalcin } else { 6369566063dSJacob Faibussowitsch PetscCall(PetscOptionsInsertFilePetsc(comm, options, filename, require)); 637be10d61cSLisandro Dalcin } 6383ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 639be10d61cSLisandro Dalcin } 640be10d61cSLisandro Dalcin 641be10d61cSLisandro Dalcin /*@C 642d06005cbSLisandro Dalcin PetscOptionsInsertArgs - Inserts options into the database from a array of strings 643d06005cbSLisandro Dalcin 644d06005cbSLisandro Dalcin Logically Collective 645d06005cbSLisandro Dalcin 646d8d19677SJose E. Roman Input Parameters: 647d06005cbSLisandro Dalcin + options - options object 6486aad120cSJose E. Roman . argc - the array length 649d06005cbSLisandro Dalcin - args - the string array 650d06005cbSLisandro Dalcin 651d06005cbSLisandro Dalcin Level: intermediate 652d06005cbSLisandro Dalcin 653db781477SPatrick Sanan .seealso: `PetscOptions`, `PetscOptionsInsertString()`, `PetscOptionsInsertFile()` 654d06005cbSLisandro Dalcin @*/ 655d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsInsertArgs(PetscOptions options, int argc, char *args[]) 656d71ae5a4SJacob Faibussowitsch { 657d06005cbSLisandro Dalcin MPI_Comm comm = PETSC_COMM_WORLD; 658d06005cbSLisandro Dalcin int left = PetscMax(argc, 0); 659d06005cbSLisandro Dalcin char *const *eargs = args; 66085079163SJed Brown 66185079163SJed Brown PetscFunctionBegin; 66285079163SJed Brown while (left) { 663d06005cbSLisandro Dalcin PetscBool isfile, isfileyaml, isstringyaml, ispush, ispop, key; 6649566063dSJacob Faibussowitsch PetscCall(PetscStrcasecmp(eargs[0], "-options_file", &isfile)); 6659566063dSJacob Faibussowitsch PetscCall(PetscStrcasecmp(eargs[0], "-options_file_yaml", &isfileyaml)); 6669566063dSJacob Faibussowitsch PetscCall(PetscStrcasecmp(eargs[0], "-options_string_yaml", &isstringyaml)); 6679566063dSJacob Faibussowitsch PetscCall(PetscStrcasecmp(eargs[0], "-prefix_push", &ispush)); 6689566063dSJacob Faibussowitsch PetscCall(PetscStrcasecmp(eargs[0], "-prefix_pop", &ispop)); 6699566063dSJacob Faibussowitsch PetscCall(PetscOptionsValidKey(eargs[0], &key)); 670093de6efSBarry Smith if (!key) { 6719371c9d4SSatish Balay eargs++; 6729371c9d4SSatish Balay left--; 673d06005cbSLisandro Dalcin } else if (isfile) { 674cc73adaaSBarry Smith PetscCheck(left > 1 && eargs[1][0] != '-', PETSC_COMM_SELF, PETSC_ERR_USER, "Missing filename for -options_file filename option"); 6759566063dSJacob Faibussowitsch PetscCall(PetscOptionsInsertFile(comm, options, eargs[1], PETSC_TRUE)); 6769371c9d4SSatish Balay eargs += 2; 6779371c9d4SSatish Balay left -= 2; 678d06005cbSLisandro Dalcin } else if (isfileyaml) { 679cc73adaaSBarry Smith PetscCheck(left > 1 && eargs[1][0] != '-', PETSC_COMM_SELF, PETSC_ERR_USER, "Missing filename for -options_file_yaml filename option"); 6809566063dSJacob Faibussowitsch PetscCall(PetscOptionsInsertFileYAML(comm, options, eargs[1], PETSC_TRUE)); 6819371c9d4SSatish Balay eargs += 2; 6829371c9d4SSatish Balay left -= 2; 683d06005cbSLisandro Dalcin } else if (isstringyaml) { 684cc73adaaSBarry Smith PetscCheck(left > 1 && eargs[1][0] != '-', PETSC_COMM_SELF, PETSC_ERR_USER, "Missing string for -options_string_yaml string option"); 6859355ec05SMatthew G. Knepley PetscCall(PetscOptionsInsertStringYAML_Private(options, eargs[1], PETSC_OPT_CODE)); 6869371c9d4SSatish Balay eargs += 2; 6879371c9d4SSatish Balay left -= 2; 688d06005cbSLisandro Dalcin } else if (ispush) { 68908401ef6SPierre Jolivet PetscCheck(left > 1, PETSC_COMM_SELF, PETSC_ERR_USER, "Missing prefix for -prefix_push option"); 690cc73adaaSBarry Smith PetscCheck(eargs[1][0] != '-', PETSC_COMM_SELF, PETSC_ERR_USER, "Missing prefix for -prefix_push option (prefixes cannot start with '-')"); 6919566063dSJacob Faibussowitsch PetscCall(PetscOptionsPrefixPush(options, eargs[1])); 6929371c9d4SSatish Balay eargs += 2; 6939371c9d4SSatish Balay left -= 2; 694d06005cbSLisandro Dalcin } else if (ispop) { 6959566063dSJacob Faibussowitsch PetscCall(PetscOptionsPrefixPop(options)); 6969371c9d4SSatish Balay eargs++; 6979371c9d4SSatish Balay left--; 6987935c3d8SJed Brown } else { 6997935c3d8SJed Brown PetscBool nextiskey = PETSC_FALSE; 7009566063dSJacob Faibussowitsch if (left >= 2) PetscCall(PetscOptionsValidKey(eargs[1], &nextiskey)); 70198b6bf53SJed Brown if (left < 2 || nextiskey) { 7029355ec05SMatthew G. Knepley PetscCall(PetscOptionsSetValue_Private(options, eargs[0], NULL, NULL, PETSC_OPT_COMMAND_LINE)); 7039371c9d4SSatish Balay eargs++; 7049371c9d4SSatish Balay left--; 70585079163SJed Brown } else { 7069355ec05SMatthew G. Knepley PetscCall(PetscOptionsSetValue_Private(options, eargs[0], eargs[1], NULL, PETSC_OPT_COMMAND_LINE)); 7079371c9d4SSatish Balay eargs += 2; 7089371c9d4SSatish Balay left -= 2; 70985079163SJed Brown } 71085079163SJed Brown } 7117935c3d8SJed Brown } 7123ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 71385079163SJed Brown } 71485079163SJed Brown 715d71ae5a4SJacob Faibussowitsch static inline PetscErrorCode PetscOptionsStringToBoolIfSet_Private(enum PetscPrecedentOption opt, const char *val[], PetscBool set[], PetscBool *flg) 716d71ae5a4SJacob Faibussowitsch { 717c5b5d8d5SVaclav Hapla PetscFunctionBegin; 718c5b5d8d5SVaclav Hapla if (set[opt]) { 7199566063dSJacob Faibussowitsch PetscCall(PetscOptionsStringToBool(val[opt], flg)); 720c5b5d8d5SVaclav Hapla } else *flg = PETSC_FALSE; 7213ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 722c5b5d8d5SVaclav Hapla } 723c5b5d8d5SVaclav Hapla 724660278c0SBarry Smith /* Process options with absolute precedence, these are only processed from the command line, not the environment or files */ 725d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscOptionsProcessPrecedentFlags(PetscOptions options, int argc, char *args[], PetscBool *skip_petscrc, PetscBool *skip_petscrc_set) 726d71ae5a4SJacob Faibussowitsch { 727c5b5d8d5SVaclav Hapla const char *const *opt = precedentOptions; 728c5b5d8d5SVaclav Hapla const size_t n = PO_NUM; 729c5b5d8d5SVaclav Hapla size_t o; 730c5b5d8d5SVaclav Hapla int a; 731c5b5d8d5SVaclav Hapla const char **val; 7320c99d500SBarry Smith char **cval; 733660278c0SBarry Smith PetscBool *set, unneeded; 734c5b5d8d5SVaclav Hapla 735c5b5d8d5SVaclav Hapla PetscFunctionBegin; 7360c99d500SBarry Smith PetscCall(PetscCalloc2(n, &cval, n, &set)); 7370c99d500SBarry Smith val = (const char **)cval; 738c5b5d8d5SVaclav Hapla 739c5b5d8d5SVaclav Hapla /* Look for options possibly set using PetscOptionsSetValue beforehand */ 74048a46eb9SPierre Jolivet for (o = 0; o < n; o++) PetscCall(PetscOptionsFindPair(options, NULL, opt[o], &val[o], &set[o])); 741c5b5d8d5SVaclav Hapla 742a5b23f4aSJose E. Roman /* Loop through all args to collect last occurring value of each option */ 743c5b5d8d5SVaclav Hapla for (a = 1; a < argc; a++) { 744c5b5d8d5SVaclav Hapla PetscBool valid, eq; 745c5b5d8d5SVaclav Hapla 7469566063dSJacob Faibussowitsch PetscCall(PetscOptionsValidKey(args[a], &valid)); 747c5b5d8d5SVaclav Hapla if (!valid) continue; 748c5b5d8d5SVaclav Hapla for (o = 0; o < n; o++) { 7499566063dSJacob Faibussowitsch PetscCall(PetscStrcasecmp(args[a], opt[o], &eq)); 750c5b5d8d5SVaclav Hapla if (eq) { 751c5b5d8d5SVaclav Hapla set[o] = PETSC_TRUE; 752c5b5d8d5SVaclav Hapla if (a == argc - 1 || !args[a + 1] || !args[a + 1][0] || args[a + 1][0] == '-') val[o] = NULL; 753c5b5d8d5SVaclav Hapla else val[o] = args[a + 1]; 754c5b5d8d5SVaclav Hapla break; 755c5b5d8d5SVaclav Hapla } 756c5b5d8d5SVaclav Hapla } 757c5b5d8d5SVaclav Hapla } 758c5b5d8d5SVaclav Hapla 759c5b5d8d5SVaclav Hapla /* Process flags */ 7609566063dSJacob Faibussowitsch PetscCall(PetscStrcasecmp(val[PO_HELP], "intro", &options->help_intro)); 761d314f959SVaclav Hapla if (options->help_intro) options->help = PETSC_TRUE; 7629566063dSJacob Faibussowitsch else PetscCall(PetscOptionsStringToBoolIfSet_Private(PO_HELP, val, set, &options->help)); 763660278c0SBarry Smith PetscCall(PetscOptionsStringToBoolIfSet_Private(PO_CI_ENABLE, val, set, &unneeded)); 764660278c0SBarry Smith /* need to manage PO_CI_ENABLE option before the PetscOptionsMonitor is turned on, so its setting is not monitored */ 7659355ec05SMatthew G. Knepley if (set[PO_CI_ENABLE]) PetscCall(PetscOptionsSetValue_Private(options, opt[PO_CI_ENABLE], val[PO_CI_ENABLE], &a, PETSC_OPT_COMMAND_LINE)); 7669566063dSJacob Faibussowitsch PetscCall(PetscOptionsStringToBoolIfSet_Private(PO_OPTIONS_MONITOR_CANCEL, val, set, &options->monitorCancel)); 7679566063dSJacob Faibussowitsch PetscCall(PetscOptionsStringToBoolIfSet_Private(PO_OPTIONS_MONITOR, val, set, &options->monitorFromOptions)); 7689566063dSJacob Faibussowitsch PetscCall(PetscOptionsStringToBoolIfSet_Private(PO_SKIP_PETSCRC, val, set, skip_petscrc)); 769c5b5d8d5SVaclav Hapla *skip_petscrc_set = set[PO_SKIP_PETSCRC]; 770c5b5d8d5SVaclav Hapla 771c5b5d8d5SVaclav Hapla /* Store precedent options in database and mark them as used */ 772660278c0SBarry Smith for (o = 1; o < n; o++) { 773c5b5d8d5SVaclav Hapla if (set[o]) { 7749355ec05SMatthew G. Knepley PetscCall(PetscOptionsSetValue_Private(options, opt[o], val[o], &a, PETSC_OPT_COMMAND_LINE)); 775d06005cbSLisandro Dalcin options->used[a] = PETSC_TRUE; 776c5b5d8d5SVaclav Hapla } 777c5b5d8d5SVaclav Hapla } 7780c99d500SBarry Smith PetscCall(PetscFree2(cval, set)); 779c5b5d8d5SVaclav Hapla options->precedentProcessed = PETSC_TRUE; 7803ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 781c5b5d8d5SVaclav Hapla } 782c5b5d8d5SVaclav Hapla 783d71ae5a4SJacob Faibussowitsch static inline PetscErrorCode PetscOptionsSkipPrecedent(PetscOptions options, const char name[], PetscBool *flg) 784d71ae5a4SJacob Faibussowitsch { 78539a651e2SJacob Faibussowitsch PetscFunctionBegin; 78639a651e2SJacob Faibussowitsch PetscValidBoolPointer(flg, 3); 787c5b5d8d5SVaclav Hapla *flg = PETSC_FALSE; 788c5b5d8d5SVaclav Hapla if (options->precedentProcessed) { 78939a651e2SJacob Faibussowitsch for (int i = 0; i < PO_NUM; ++i) { 790c5b5d8d5SVaclav Hapla if (!PetscOptNameCmp(precedentOptions[i], name)) { 791c5b5d8d5SVaclav Hapla /* check if precedent option has been set already */ 7929566063dSJacob Faibussowitsch PetscCall(PetscOptionsFindPair(options, NULL, name, NULL, flg)); 793c5b5d8d5SVaclav Hapla if (*flg) break; 794c5b5d8d5SVaclav Hapla } 795c5b5d8d5SVaclav Hapla } 796c5b5d8d5SVaclav Hapla } 7973ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 798c5b5d8d5SVaclav Hapla } 79985079163SJed Brown 800e5c89e4eSSatish Balay /*@C 801e5c89e4eSSatish Balay PetscOptionsInsert - Inserts into the options database from the command line, 802e5c89e4eSSatish Balay the environmental variable and a file. 803e5c89e4eSSatish Balay 804811af0c4SBarry Smith Collective on `PETSC_COMM_WORLD` 8051c9f3c13SBarry Smith 806e5c89e4eSSatish Balay Input Parameters: 807c5929fdfSBarry Smith + options - options database or NULL for the default global database 808c5929fdfSBarry Smith . argc - count of number of command line arguments 809e5c89e4eSSatish Balay . args - the command line arguments 810be10d61cSLisandro Dalcin - file - [optional] PETSc database file, append ":yaml" to filename to specify YAML options format. 811be10d61cSLisandro Dalcin Use NULL or empty string to not check for code specific file. 812be10d61cSLisandro Dalcin Also checks ~/.petscrc, .petscrc and petscrc. 813c5b5d8d5SVaclav Hapla Use -skip_petscrc in the code specific file (or command line) to skip ~/.petscrc, .petscrc and petscrc files. 814e5c89e4eSSatish Balay 815081c24baSBoyana Norris Options Database Keys: 816d06005cbSLisandro Dalcin + -options_file <filename> - read options from a file 817d06005cbSLisandro Dalcin - -options_file_yaml <filename> - read options from a YAML file 818c5b5d8d5SVaclav Hapla 819811af0c4SBarry Smith Notes: 820811af0c4SBarry Smith Since PetscOptionsInsert() is automatically called by `PetscInitialize()`, 821811af0c4SBarry Smith the user does not typically need to call this routine. `PetscOptionsInsert()` 822811af0c4SBarry Smith can be called several times, adding additional entries into the database. 823811af0c4SBarry Smith 824811af0c4SBarry Smith See `PetscInitialize()` for options related to option database monitoring. 825081c24baSBoyana Norris 826e5c89e4eSSatish Balay Level: advanced 827e5c89e4eSSatish Balay 828db781477SPatrick Sanan .seealso: `PetscOptionsDestroy()`, `PetscOptionsView()`, `PetscOptionsInsertString()`, `PetscOptionsInsertFile()`, 829db781477SPatrick Sanan `PetscInitialize()` 830e5c89e4eSSatish Balay @*/ 831d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsInsert(PetscOptions options, int *argc, char ***args, const char file[]) 832d71ae5a4SJacob Faibussowitsch { 833d06005cbSLisandro Dalcin MPI_Comm comm = PETSC_COMM_WORLD; 834e5c89e4eSSatish Balay PetscMPIInt rank; 835c5b5d8d5SVaclav Hapla PetscBool hasArgs = (argc && *argc) ? PETSC_TRUE : PETSC_FALSE; 836c5b5d8d5SVaclav Hapla PetscBool skipPetscrc = PETSC_FALSE, skipPetscrcSet = PETSC_FALSE; 837e5c89e4eSSatish Balay 838e5c89e4eSSatish Balay PetscFunctionBegin; 83908401ef6SPierre Jolivet PetscCheck(!hasArgs || (args && *args), comm, PETSC_ERR_ARG_NULL, "*argc > 1 but *args not given"); 8409566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(comm, &rank)); 841e5c89e4eSSatish Balay 842c5b5d8d5SVaclav Hapla if (!options) { 8439566063dSJacob Faibussowitsch PetscCall(PetscOptionsCreateDefault()); 844c5b5d8d5SVaclav Hapla options = defaultoptions; 845c5b5d8d5SVaclav Hapla } 846c5b5d8d5SVaclav Hapla if (hasArgs) { 847c5b5d8d5SVaclav Hapla /* process options with absolute precedence */ 8489566063dSJacob Faibussowitsch PetscCall(PetscOptionsProcessPrecedentFlags(options, *argc, *args, &skipPetscrc, &skipPetscrcSet)); 849660278c0SBarry Smith PetscCall(PetscOptionsGetBool(NULL, NULL, "-petsc_ci", &PetscCIEnabled, NULL)); 850c5b5d8d5SVaclav Hapla } 8514b09e917SBarry Smith if (file && file[0]) { 8529566063dSJacob Faibussowitsch PetscCall(PetscOptionsInsertFile(comm, options, file, PETSC_TRUE)); 853c5b5d8d5SVaclav Hapla /* if -skip_petscrc has not been set from command line, check whether it has been set in the file */ 8549566063dSJacob Faibussowitsch if (!skipPetscrcSet) PetscCall(PetscOptionsGetBool(options, NULL, "-skip_petscrc", &skipPetscrc, NULL)); 855321366bcSBarry Smith } 856c5b5d8d5SVaclav Hapla if (!skipPetscrc) { 857be10d61cSLisandro Dalcin char filename[PETSC_MAX_PATH_LEN]; 8589566063dSJacob Faibussowitsch PetscCall(PetscGetHomeDirectory(filename, sizeof(filename))); 8599566063dSJacob Faibussowitsch PetscCallMPI(MPI_Bcast(filename, (int)sizeof(filename), MPI_CHAR, 0, comm)); 860c6a7a370SJeremy L Thompson if (filename[0]) PetscCall(PetscStrlcat(filename, "/.petscrc", sizeof(filename))); 8619566063dSJacob Faibussowitsch PetscCall(PetscOptionsInsertFile(comm, options, filename, PETSC_FALSE)); 8629566063dSJacob Faibussowitsch PetscCall(PetscOptionsInsertFile(comm, options, ".petscrc", PETSC_FALSE)); 8639566063dSJacob Faibussowitsch PetscCall(PetscOptionsInsertFile(comm, options, "petscrc", PETSC_FALSE)); 864e5c89e4eSSatish Balay } 865e5c89e4eSSatish Balay 8662d747510SLisandro Dalcin /* insert environment options */ 867e5c89e4eSSatish Balay { 8682d747510SLisandro Dalcin char *eoptions = NULL; 869e5c89e4eSSatish Balay size_t len = 0; 870dd400576SPatrick Sanan if (rank == 0) { 871e5c89e4eSSatish Balay eoptions = (char *)getenv("PETSC_OPTIONS"); 8729566063dSJacob Faibussowitsch PetscCall(PetscStrlen(eoptions, &len)); 873e5c89e4eSSatish Balay } 8749566063dSJacob Faibussowitsch PetscCallMPI(MPI_Bcast(&len, 1, MPIU_SIZE_T, 0, comm)); 875e5c89e4eSSatish Balay if (len) { 8769566063dSJacob Faibussowitsch if (rank) PetscCall(PetscMalloc1(len + 1, &eoptions)); 8779566063dSJacob Faibussowitsch PetscCallMPI(MPI_Bcast(eoptions, len, MPI_CHAR, 0, comm)); 87896fc60bcSBarry Smith if (rank) eoptions[len] = 0; 8799355ec05SMatthew G. Knepley PetscCall(PetscOptionsInsertString_Private(options, eoptions, PETSC_OPT_ENVIRONMENT)); 8809566063dSJacob Faibussowitsch if (rank) PetscCall(PetscFree(eoptions)); 881e5c89e4eSSatish Balay } 882e5c89e4eSSatish Balay } 883e5c89e4eSSatish Balay 884d06005cbSLisandro Dalcin /* insert YAML environment options */ 88556a31166SBarry Smith { 8869fc438c3SToby Isaac char *eoptions = NULL; 8879fc438c3SToby Isaac size_t len = 0; 888dd400576SPatrick Sanan if (rank == 0) { 8899fc438c3SToby Isaac eoptions = (char *)getenv("PETSC_OPTIONS_YAML"); 8909566063dSJacob Faibussowitsch PetscCall(PetscStrlen(eoptions, &len)); 8919fc438c3SToby Isaac } 8929566063dSJacob Faibussowitsch PetscCallMPI(MPI_Bcast(&len, 1, MPIU_SIZE_T, 0, comm)); 8939fc438c3SToby Isaac if (len) { 8949566063dSJacob Faibussowitsch if (rank) PetscCall(PetscMalloc1(len + 1, &eoptions)); 8959566063dSJacob Faibussowitsch PetscCallMPI(MPI_Bcast(eoptions, len, MPI_CHAR, 0, comm)); 8969fc438c3SToby Isaac if (rank) eoptions[len] = 0; 8979355ec05SMatthew G. Knepley PetscCall(PetscOptionsInsertStringYAML_Private(options, eoptions, PETSC_OPT_ENVIRONMENT)); 8989566063dSJacob Faibussowitsch if (rank) PetscCall(PetscFree(eoptions)); 8999fc438c3SToby Isaac } 9009fc438c3SToby Isaac } 9013bcbd388SSean Farley 902c5b5d8d5SVaclav Hapla /* insert command line options here because they take precedence over arguments in petscrc/environment */ 9039566063dSJacob Faibussowitsch if (hasArgs) PetscCall(PetscOptionsInsertArgs(options, *argc - 1, *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 */ 9109371c9d4SSatish Balay static const char *PetscCIOptions[] = { 9119371c9d4SSatish Balay "malloc_debug", 912660278c0SBarry Smith "malloc_dump", 913660278c0SBarry Smith "malloc_test", 9141f4c7579SBarry Smith "malloc", 915660278c0SBarry Smith "nox", 916660278c0SBarry Smith "nox_warning", 917660278c0SBarry Smith "display", 918660278c0SBarry Smith "saws_port_auto_select", 919660278c0SBarry Smith "saws_port_auto_select_silent", 920660278c0SBarry Smith "vecscatter_mpi1", 921660278c0SBarry Smith "check_pointer_intensity", 922660278c0SBarry Smith "cuda_initialize", 923660278c0SBarry Smith "error_output_stdout", 924660278c0SBarry Smith "use_gpu_aware_mpi", 925660278c0SBarry Smith "checkfunctionlist", 926660278c0SBarry Smith "petsc_ci", 927660278c0SBarry Smith "petsc_ci_portable_error_output", 928660278c0SBarry Smith }; 929660278c0SBarry Smith 930d71ae5a4SJacob Faibussowitsch static PetscBool PetscCIOption(const char *name) 931d71ae5a4SJacob Faibussowitsch { 932660278c0SBarry Smith PetscInt idx; 933660278c0SBarry Smith PetscBool found; 934660278c0SBarry Smith 935660278c0SBarry Smith if (!PetscCIEnabled) return PETSC_FALSE; 9363ba16761SJacob Faibussowitsch PetscCallAbort(PETSC_COMM_SELF, PetscEListFind(PETSC_STATIC_ARRAY_LENGTH(PetscCIOptions), PetscCIOptions, name, &idx, &found)); 937660278c0SBarry Smith return found; 938660278c0SBarry Smith } 939660278c0SBarry Smith 940e5c89e4eSSatish Balay /*@C 94188c29154SBarry Smith PetscOptionsView - Prints the options that have been loaded. This is 942e5c89e4eSSatish Balay useful for debugging purposes. 943e5c89e4eSSatish Balay 944c3339decSBarry Smith Logically Collective 945e5c89e4eSSatish Balay 946d8d19677SJose E. Roman Input Parameters: 947a2b725a8SWilliam Gropp + options - options database, use NULL for default global database 948811af0c4SBarry Smith - viewer - must be an `PETSCVIEWERASCII` viewer 949e5c89e4eSSatish Balay 950e5c89e4eSSatish Balay Options Database Key: 951811af0c4SBarry Smith . -options_view - Activates `PetscOptionsView()` within `PetscFinalize()` 952e5c89e4eSSatish Balay 953811af0c4SBarry Smith Note: 954811af0c4SBarry Smith Only the rank zero process of the `MPI_Comm` used to create view prints the option values. Other processes 9551c9f3c13SBarry Smith may have different values but they are not printed. 9561c9f3c13SBarry Smith 957e5c89e4eSSatish Balay Level: advanced 958e5c89e4eSSatish Balay 959db781477SPatrick Sanan .seealso: `PetscOptionsAllUsed()` 960e5c89e4eSSatish Balay @*/ 961d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsView(PetscOptions options, PetscViewer viewer) 962d71ae5a4SJacob Faibussowitsch { 963660278c0SBarry Smith PetscInt i, N = 0; 96488c29154SBarry Smith PetscBool isascii; 965e5c89e4eSSatish Balay 966e5c89e4eSSatish Balay PetscFunctionBegin; 9672d747510SLisandro Dalcin if (viewer) PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 2); 968c5929fdfSBarry Smith options = options ? options : defaultoptions; 96988c29154SBarry Smith if (!viewer) viewer = PETSC_VIEWER_STDOUT_WORLD; 9709566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &isascii)); 97128b400f6SJacob Faibussowitsch PetscCheck(isascii, PetscObjectComm((PetscObject)viewer), PETSC_ERR_SUP, "Only supports ASCII viewer"); 97288c29154SBarry Smith 973660278c0SBarry Smith for (i = 0; i < options->N; i++) { 974660278c0SBarry Smith if (PetscCIOption(options->names[i])) continue; 975660278c0SBarry Smith N++; 976660278c0SBarry Smith } 977660278c0SBarry Smith 978660278c0SBarry Smith if (!N) { 9799566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "#No PETSc Option Table entries\n")); 9803ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 98130694fe9SBarry Smith } 9822d747510SLisandro Dalcin 9839566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "#PETSc Option Table entries:\n")); 984e5c89e4eSSatish Balay for (i = 0; i < options->N; i++) { 985660278c0SBarry Smith if (PetscCIOption(options->names[i])) continue; 986e5c89e4eSSatish Balay if (options->values[i]) { 9879355ec05SMatthew G. Knepley PetscCall(PetscViewerASCIIPrintf(viewer, "-%s %s", options->names[i], options->values[i])); 988e5c89e4eSSatish Balay } else { 9899355ec05SMatthew G. Knepley PetscCall(PetscViewerASCIIPrintf(viewer, "-%s", options->names[i])); 990e5c89e4eSSatish Balay } 9919355ec05SMatthew G. Knepley PetscCall(PetscViewerASCIIPrintf(viewer, " # (source: %s)\n", PetscOptionSources[options->source[i]])); 992e5c89e4eSSatish Balay } 9939566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "#End of PETSc Option Table entries\n")); 9943ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 995e5c89e4eSSatish Balay } 996e5c89e4eSSatish Balay 997e11779c2SBarry Smith /* 998e11779c2SBarry Smith Called by error handlers to print options used in run 999e11779c2SBarry Smith */ 1000d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsLeftError(void) 1001d71ae5a4SJacob Faibussowitsch { 1002f4bc716fSBarry Smith PetscInt i, nopt = 0; 1003f4bc716fSBarry Smith 1004f4bc716fSBarry Smith for (i = 0; i < defaultoptions->N; i++) { 1005f4bc716fSBarry Smith if (!defaultoptions->used[i]) { 1006f4bc716fSBarry Smith if (PetscCIOption(defaultoptions->names[i])) continue; 1007f4bc716fSBarry Smith nopt++; 1008f4bc716fSBarry Smith } 1009f4bc716fSBarry Smith } 1010f4bc716fSBarry Smith if (nopt) { 10113ba16761SJacob Faibussowitsch PetscCall((*PetscErrorPrintf)("WARNING! There are option(s) set that were not used! Could be the program crashed before they were used or a spelling mistake, etc!\n")); 1012f4bc716fSBarry Smith for (i = 0; i < defaultoptions->N; i++) { 1013f4bc716fSBarry Smith if (!defaultoptions->used[i]) { 1014f4bc716fSBarry Smith if (PetscCIOption(defaultoptions->names[i])) continue; 10153ba16761SJacob 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]])); 10163ba16761SJacob Faibussowitsch else PetscCall((*PetscErrorPrintf)(" Option left: name:-%s (no value) source: %s\n", defaultoptions->names[i], PetscOptionSources[defaultoptions->source[i]])); 1017f4bc716fSBarry Smith } 1018f4bc716fSBarry Smith } 1019f4bc716fSBarry Smith } 10203ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 1021f4bc716fSBarry Smith } 1022f4bc716fSBarry Smith 1023d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscOptionsViewError(void) 1024d71ae5a4SJacob Faibussowitsch { 1025660278c0SBarry Smith PetscInt i, N = 0; 10264416b707SBarry Smith PetscOptions options = defaultoptions; 1027e11779c2SBarry Smith 1028660278c0SBarry Smith for (i = 0; i < options->N; i++) { 1029660278c0SBarry Smith if (PetscCIOption(options->names[i])) continue; 1030660278c0SBarry Smith N++; 1031660278c0SBarry Smith } 1032660278c0SBarry Smith 1033660278c0SBarry Smith if (N) { 10343ba16761SJacob Faibussowitsch PetscCall((*PetscErrorPrintf)("PETSc Option Table entries:\n")); 1035e11779c2SBarry Smith } else { 10363ba16761SJacob Faibussowitsch PetscCall((*PetscErrorPrintf)("No PETSc Option Table entries\n")); 1037e11779c2SBarry Smith } 1038e11779c2SBarry Smith for (i = 0; i < options->N; i++) { 1039660278c0SBarry Smith if (PetscCIOption(options->names[i])) continue; 1040e11779c2SBarry Smith if (options->values[i]) { 10413ba16761SJacob Faibussowitsch PetscCall((*PetscErrorPrintf)("-%s %s (source: %s)\n", options->names[i], options->values[i], PetscOptionSources[options->source[i]])); 1042e11779c2SBarry Smith } else { 10433ba16761SJacob Faibussowitsch PetscCall((*PetscErrorPrintf)("-%s (source: %s)\n", options->names[i], PetscOptionSources[options->source[i]])); 1044e11779c2SBarry Smith } 1045e11779c2SBarry Smith } 10463ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 1047e11779c2SBarry Smith } 1048e11779c2SBarry Smith 1049e5c89e4eSSatish Balay /*@C 105074e0666dSJed Brown PetscOptionsPrefixPush - Designate a prefix to be used by all options insertions to follow. 105174e0666dSJed Brown 10521c9f3c13SBarry Smith Logically Collective 105374e0666dSJed Brown 1054d8d19677SJose E. Roman Input Parameters: 1055c5929fdfSBarry Smith + options - options database, or NULL for the default global database 1056c5929fdfSBarry Smith - prefix - The string to append to the existing prefix 10579db968c8SJed Brown 10589db968c8SJed Brown Options Database Keys: 10599db968c8SJed Brown + -prefix_push <some_prefix_> - push the given prefix 10609db968c8SJed Brown - -prefix_pop - pop the last prefix 10619db968c8SJed Brown 10629db968c8SJed Brown Notes: 10639db968c8SJed Brown It is common to use this in conjunction with -options_file as in 10649db968c8SJed Brown 10659db968c8SJed Brown $ -prefix_push system1_ -options_file system1rc -prefix_pop -prefix_push system2_ -options_file system2rc -prefix_pop 10669db968c8SJed Brown 10679db968c8SJed Brown where the files no longer require all options to be prefixed with -system2_. 106874e0666dSJed Brown 1069811af0c4SBarry Smith The collectivity of this routine is complex; only the MPI ranks that call this routine will 10701c9f3c13SBarry Smith have the affect of these options. If some processes that create objects call this routine and others do 10711c9f3c13SBarry Smith not the code may fail in complicated ways because the same parallel solvers may incorrectly use different options 10721c9f3c13SBarry Smith on different ranks. 10731c9f3c13SBarry Smith 107474e0666dSJed Brown Level: advanced 107574e0666dSJed Brown 1076db781477SPatrick Sanan .seealso: `PetscOptionsPrefixPop()`, `PetscOptionsPush()`, `PetscOptionsPop()`, `PetscOptionsCreate()`, `PetscOptionsSetValue()` 107774e0666dSJed Brown @*/ 1078d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsPrefixPush(PetscOptions options, const char prefix[]) 1079d71ae5a4SJacob Faibussowitsch { 108074e0666dSJed Brown size_t n; 108174e0666dSJed Brown PetscInt start; 10829355ec05SMatthew G. Knepley char key[PETSC_MAX_OPTION_NAME + 1]; 10832d747510SLisandro Dalcin PetscBool valid; 108474e0666dSJed Brown 108574e0666dSJed Brown PetscFunctionBegin; 1086064a246eSJacob Faibussowitsch PetscValidCharPointer(prefix, 2); 1087c5929fdfSBarry Smith options = options ? options : defaultoptions; 108808401ef6SPierre Jolivet PetscCheck(options->prefixind < MAXPREFIXES, PETSC_COMM_SELF, PETSC_ERR_PLIB, "Maximum depth of prefix stack %d exceeded, recompile \n src/sys/objects/options.c with larger value for MAXPREFIXES", MAXPREFIXES); 10892d747510SLisandro Dalcin key[0] = '-'; /* keys must start with '-' */ 10909566063dSJacob Faibussowitsch PetscCall(PetscStrncpy(key + 1, prefix, sizeof(key) - 1)); 10919566063dSJacob Faibussowitsch PetscCall(PetscOptionsValidKey(key, &valid)); 10928bf569ecSLisandro 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 */ 109328b400f6SJacob 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" : ""); 109474e0666dSJed Brown start = options->prefixind ? options->prefixstack[options->prefixind - 1] : 0; 10959566063dSJacob Faibussowitsch PetscCall(PetscStrlen(prefix, &n)); 109608401ef6SPierre Jolivet PetscCheck(n + 1 <= sizeof(options->prefix) - start, PETSC_COMM_SELF, PETSC_ERR_PLIB, "Maximum prefix length %zu exceeded", sizeof(options->prefix)); 10979566063dSJacob Faibussowitsch PetscCall(PetscArraycpy(options->prefix + start, prefix, n + 1)); 109874e0666dSJed Brown options->prefixstack[options->prefixind++] = start + n; 10993ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 110074e0666dSJed Brown } 110174e0666dSJed Brown 1102c5929fdfSBarry Smith /*@C 1103811af0c4SBarry Smith PetscOptionsPrefixPop - Remove the latest options prefix, see `PetscOptionsPrefixPush()` for details 110474e0666dSJed Brown 1105811af0c4SBarry Smith Logically Collective on the `MPI_Comm` used when called `PetscOptionsPrefixPush()` 110674e0666dSJed Brown 1107811af0c4SBarry Smith Input Parameter: 1108c5929fdfSBarry Smith . options - options database, or NULL for the default global database 1109c5929fdfSBarry Smith 111074e0666dSJed Brown Level: advanced 111174e0666dSJed Brown 1112db781477SPatrick Sanan .seealso: `PetscOptionsPrefixPush()`, `PetscOptionsPush()`, `PetscOptionsPop()`, `PetscOptionsCreate()`, `PetscOptionsSetValue()` 111374e0666dSJed Brown @*/ 1114d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsPrefixPop(PetscOptions options) 1115d71ae5a4SJacob Faibussowitsch { 111674e0666dSJed Brown PetscInt offset; 111774e0666dSJed Brown 111874e0666dSJed Brown PetscFunctionBegin; 1119c5929fdfSBarry Smith options = options ? options : defaultoptions; 112008401ef6SPierre Jolivet PetscCheck(options->prefixind >= 1, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONGSTATE, "More prefixes popped than pushed"); 112174e0666dSJed Brown options->prefixind--; 112274e0666dSJed Brown offset = options->prefixind ? options->prefixstack[options->prefixind - 1] : 0; 112374e0666dSJed Brown options->prefix[offset] = 0; 11243ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 112574e0666dSJed Brown } 112674e0666dSJed Brown 1127a542b6e8SBarry Smith /*@C 1128a542b6e8SBarry Smith PetscOptionsClear - Removes all options form the database leaving it empty. 1129a542b6e8SBarry Smith 11301c9f3c13SBarry Smith Logically Collective 11311c9f3c13SBarry Smith 1132811af0c4SBarry Smith Input Parameter: 1133c5929fdfSBarry Smith . options - options database, use NULL for the default global database 1134c5929fdfSBarry Smith 1135811af0c4SBarry Smith The collectivity of this routine is complex; only the MPI ranks that call this routine will 11361c9f3c13SBarry Smith have the affect of these options. If some processes that create objects call this routine and others do 11371c9f3c13SBarry Smith not the code may fail in complicated ways because the same parallel solvers may incorrectly use different options 11381c9f3c13SBarry Smith on different ranks. 11391c9f3c13SBarry Smith 1140a542b6e8SBarry Smith Level: developer 1141a542b6e8SBarry Smith 1142db781477SPatrick Sanan .seealso: `PetscOptionsInsert()` 1143a542b6e8SBarry Smith @*/ 1144d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsClear(PetscOptions options) 1145d71ae5a4SJacob Faibussowitsch { 1146a542b6e8SBarry Smith PetscInt i; 1147a542b6e8SBarry Smith 114839a651e2SJacob Faibussowitsch PetscFunctionBegin; 1149c5929fdfSBarry Smith options = options ? options : defaultoptions; 11503ba16761SJacob Faibussowitsch if (!options) PetscFunctionReturn(PETSC_SUCCESS); 11512d747510SLisandro Dalcin 1152a542b6e8SBarry Smith for (i = 0; i < options->N; i++) { 1153a542b6e8SBarry Smith if (options->names[i]) free(options->names[i]); 1154a542b6e8SBarry Smith if (options->values[i]) free(options->values[i]); 1155a542b6e8SBarry Smith } 11562d747510SLisandro Dalcin options->N = 0; 11579355ec05SMatthew G. Knepley free(options->names); 11589355ec05SMatthew G. Knepley free(options->values); 11599355ec05SMatthew G. Knepley free(options->used); 11609355ec05SMatthew G. Knepley free(options->source); 11619355ec05SMatthew G. Knepley options->names = NULL; 11629355ec05SMatthew G. Knepley options->values = NULL; 11639355ec05SMatthew G. Knepley options->used = NULL; 11649355ec05SMatthew G. Knepley options->source = NULL; 11659355ec05SMatthew G. Knepley options->Nalloc = 0; 11662d747510SLisandro Dalcin 11679355ec05SMatthew G. Knepley for (i = 0; i < options->Na; i++) { 1168a542b6e8SBarry Smith free(options->aliases1[i]); 1169a542b6e8SBarry Smith free(options->aliases2[i]); 1170a542b6e8SBarry Smith } 11719355ec05SMatthew G. Knepley options->Na = 0; 11729355ec05SMatthew G. Knepley free(options->aliases1); 11739355ec05SMatthew G. Knepley free(options->aliases2); 11749355ec05SMatthew G. Knepley options->aliases1 = options->aliases2 = NULL; 11759355ec05SMatthew G. Knepley options->Naalloc = 0; 1176a542b6e8SBarry Smith 11772d747510SLisandro Dalcin /* destroy hash table */ 11782d747510SLisandro Dalcin kh_destroy(HO, options->ht); 11792d747510SLisandro Dalcin options->ht = NULL; 11800eb63584SBarry Smith 11812d747510SLisandro Dalcin options->prefixind = 0; 11822d747510SLisandro Dalcin options->prefix[0] = 0; 11832d747510SLisandro Dalcin options->help = PETSC_FALSE; 11849355ec05SMatthew G. Knepley options->help_intro = PETSC_FALSE; 11853ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 11864416b707SBarry Smith } 11874416b707SBarry Smith 11882d747510SLisandro Dalcin /*@C 11892d747510SLisandro Dalcin PetscOptionsSetAlias - Makes a key and alias for another key 11902d747510SLisandro Dalcin 11911c9f3c13SBarry Smith Logically Collective 11922d747510SLisandro Dalcin 11932d747510SLisandro Dalcin Input Parameters: 11942d747510SLisandro Dalcin + options - options database, or NULL for default global database 11952d747510SLisandro Dalcin . newname - the alias 11962d747510SLisandro Dalcin - oldname - the name that alias will refer to 11972d747510SLisandro Dalcin 11982d747510SLisandro Dalcin Level: advanced 11992d747510SLisandro Dalcin 1200811af0c4SBarry Smith The collectivity of this routine is complex; only the MPI ranks that call this routine will 12011c9f3c13SBarry Smith have the affect of these options. If some processes that create objects call this routine and others do 12021c9f3c13SBarry Smith not the code may fail in complicated ways because the same parallel solvers may incorrectly use different options 12031c9f3c13SBarry Smith on different ranks. 12041c9f3c13SBarry Smith 1205c2e3fba1SPatrick Sanan .seealso: `PetscOptionsGetInt()`, `PetscOptionsGetReal()`, `OptionsHasName()`, 1206c2e3fba1SPatrick Sanan `PetscOptionsGetString()`, `PetscOptionsGetIntArray()`, `PetscOptionsGetRealArray()`, `PetscOptionsBool()`, 1207db781477SPatrick Sanan `PetscOptionsName()`, `PetscOptionsBegin()`, `PetscOptionsEnd()`, `PetscOptionsHeadBegin()`, 1208c2e3fba1SPatrick Sanan `PetscOptionsStringArray()`, `PetscOptionsRealArray()`, `PetscOptionsScalar()`, 1209db781477SPatrick Sanan `PetscOptionsBoolGroupBegin()`, `PetscOptionsBoolGroup()`, `PetscOptionsBoolGroupEnd()`, 1210db781477SPatrick Sanan `PetscOptionsFList()`, `PetscOptionsEList()` 12112d747510SLisandro Dalcin @*/ 1212d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsSetAlias(PetscOptions options, const char newname[], const char oldname[]) 1213d71ae5a4SJacob Faibussowitsch { 12142d747510SLisandro Dalcin size_t len; 12159210b8eaSVaclav Hapla PetscBool valid; 12162d747510SLisandro Dalcin 12172d747510SLisandro Dalcin PetscFunctionBegin; 12182d747510SLisandro Dalcin PetscValidCharPointer(newname, 2); 12192d747510SLisandro Dalcin PetscValidCharPointer(oldname, 3); 12202d747510SLisandro Dalcin options = options ? options : defaultoptions; 12219566063dSJacob Faibussowitsch PetscCall(PetscOptionsValidKey(newname, &valid)); 122228b400f6SJacob Faibussowitsch PetscCheck(valid, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Invalid aliased option %s", newname); 12239566063dSJacob Faibussowitsch PetscCall(PetscOptionsValidKey(oldname, &valid)); 122428b400f6SJacob Faibussowitsch PetscCheck(valid, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Invalid aliasee option %s", oldname); 12252d747510SLisandro Dalcin 12269355ec05SMatthew G. Knepley if (options->Na == options->Naalloc) { 12279355ec05SMatthew G. Knepley char **tmpA1, **tmpA2; 12282d747510SLisandro Dalcin 12299355ec05SMatthew G. Knepley options->Naalloc = PetscMax(4, options->Naalloc * 2); 12309355ec05SMatthew G. Knepley tmpA1 = (char **)malloc(options->Naalloc * sizeof(char *)); 12319355ec05SMatthew G. Knepley tmpA2 = (char **)malloc(options->Naalloc * sizeof(char *)); 12329355ec05SMatthew G. Knepley for (int i = 0; i < options->Na; ++i) { 12339355ec05SMatthew G. Knepley tmpA1[i] = options->aliases1[i]; 12349355ec05SMatthew G. Knepley tmpA2[i] = options->aliases2[i]; 12359355ec05SMatthew G. Knepley } 12369355ec05SMatthew G. Knepley free(options->aliases1); 12379355ec05SMatthew G. Knepley free(options->aliases2); 12389355ec05SMatthew G. Knepley options->aliases1 = tmpA1; 12399355ec05SMatthew G. Knepley options->aliases2 = tmpA2; 12409355ec05SMatthew G. Knepley } 12419371c9d4SSatish Balay newname++; 12429371c9d4SSatish Balay oldname++; 12439566063dSJacob Faibussowitsch PetscCall(PetscStrlen(newname, &len)); 12449355ec05SMatthew G. Knepley options->aliases1[options->Na] = (char *)malloc((len + 1) * sizeof(char)); 1245c6a7a370SJeremy L Thompson PetscCall(PetscStrncpy(options->aliases1[options->Na], newname, len + 1)); 12469566063dSJacob Faibussowitsch PetscCall(PetscStrlen(oldname, &len)); 12479355ec05SMatthew G. Knepley options->aliases2[options->Na] = (char *)malloc((len + 1) * sizeof(char)); 1248c6a7a370SJeremy L Thompson PetscCall(PetscStrncpy(options->aliases2[options->Na], oldname, len + 1)); 12499355ec05SMatthew G. Knepley ++options->Na; 12503ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 12512d747510SLisandro Dalcin } 12524416b707SBarry Smith 1253e5c89e4eSSatish Balay /*@C 1254e5c89e4eSSatish Balay PetscOptionsSetValue - Sets an option name-value pair in the options 1255e5c89e4eSSatish Balay database, overriding whatever is already present. 1256e5c89e4eSSatish Balay 12571c9f3c13SBarry Smith Logically Collective 1258e5c89e4eSSatish Balay 1259e5c89e4eSSatish Balay Input Parameters: 1260c5929fdfSBarry Smith + options - options database, use NULL for the default global database 1261c5929fdfSBarry Smith . name - name of option, this SHOULD have the - prepended 12622d747510SLisandro Dalcin - value - the option value (not used for all options, so can be NULL) 1263e5c89e4eSSatish Balay 1264e5c89e4eSSatish Balay Level: intermediate 1265e5c89e4eSSatish Balay 1266e5c89e4eSSatish Balay Note: 1267811af0c4SBarry Smith This function can be called BEFORE `PetscInitialize()` 1268d49172ceSBarry Smith 1269811af0c4SBarry Smith The collectivity of this routine is complex; only the MPI ranks that call this routine will 12701c9f3c13SBarry Smith have the affect of these options. If some processes that create objects call this routine and others do 12711c9f3c13SBarry Smith not the code may fail in complicated ways because the same parallel solvers may incorrectly use different options 12721c9f3c13SBarry Smith on different ranks. 12731c9f3c13SBarry Smith 12742d747510SLisandro Dalcin Developers Note: Uses malloc() directly because PETSc may not be initialized yet. 1275b0250c70SBarry Smith 1276db781477SPatrick Sanan .seealso: `PetscOptionsInsert()`, `PetscOptionsClearValue()` 1277e5c89e4eSSatish Balay @*/ 1278d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsSetValue(PetscOptions options, const char name[], const char value[]) 1279d71ae5a4SJacob Faibussowitsch { 128039a651e2SJacob Faibussowitsch PetscFunctionBegin; 12819355ec05SMatthew G. Knepley PetscCall(PetscOptionsSetValue_Private(options, name, value, NULL, PETSC_OPT_CODE)); 12823ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1283c5b5d8d5SVaclav Hapla } 1284c5b5d8d5SVaclav Hapla 12859355ec05SMatthew G. Knepley PetscErrorCode PetscOptionsSetValue_Private(PetscOptions options, const char name[], const char value[], int *pos, PetscOptionSource source) 1286d71ae5a4SJacob Faibussowitsch { 1287e5c89e4eSSatish Balay size_t len; 12889355ec05SMatthew G. Knepley int n, i; 1289e5c89e4eSSatish Balay char **names; 12909355ec05SMatthew G. Knepley char fullname[PETSC_MAX_OPTION_NAME] = ""; 1291c5b5d8d5SVaclav Hapla PetscBool flg; 1292e5c89e4eSSatish Balay 129339a651e2SJacob Faibussowitsch PetscFunctionBegin; 12947272c0d2SVaclav Hapla if (!options) { 12959566063dSJacob Faibussowitsch PetscCall(PetscOptionsCreateDefault()); 12967272c0d2SVaclav Hapla options = defaultoptions; 1297c5929fdfSBarry Smith } 129839a651e2SJacob Faibussowitsch PetscCheck(name[0] == '-', PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "name %s must start with '-'", name); 12992d747510SLisandro Dalcin 13009566063dSJacob Faibussowitsch PetscCall(PetscOptionsSkipPrecedent(options, name, &flg)); 13013ba16761SJacob Faibussowitsch if (flg) PetscFunctionReturn(PETSC_SUCCESS); 1302e5c89e4eSSatish Balay 13032d747510SLisandro Dalcin name++; /* skip starting dash */ 13042d747510SLisandro Dalcin 130574e0666dSJed Brown if (options->prefixind > 0) { 1306d49172ceSBarry Smith strncpy(fullname, options->prefix, sizeof(fullname)); 13072d747510SLisandro Dalcin fullname[sizeof(fullname) - 1] = 0; 130889ae1891SBarry Smith strncat(fullname, name, sizeof(fullname) - strlen(fullname) - 1); 13092d747510SLisandro Dalcin fullname[sizeof(fullname) - 1] = 0; 131074e0666dSJed Brown name = fullname; 131174e0666dSJed Brown } 131274e0666dSJed Brown 131374e0666dSJed Brown /* check against aliases */ 13149355ec05SMatthew G. Knepley for (i = 0; i < options->Na; i++) { 13152d747510SLisandro Dalcin int result = PetscOptNameCmp(options->aliases1[i], name); 13169371c9d4SSatish Balay if (!result) { 13179371c9d4SSatish Balay name = options->aliases2[i]; 13189371c9d4SSatish Balay break; 13199371c9d4SSatish Balay } 1320e5c89e4eSSatish Balay } 1321e5c89e4eSSatish Balay 13222d747510SLisandro Dalcin /* slow search */ 13239355ec05SMatthew G. Knepley n = options->N; 1324e5c89e4eSSatish Balay names = options->names; 13259355ec05SMatthew G. Knepley for (i = 0; i < options->N; i++) { 13262d747510SLisandro Dalcin int result = PetscOptNameCmp(names[i], name); 13272d747510SLisandro Dalcin if (!result) { 13289371c9d4SSatish Balay n = i; 13299371c9d4SSatish Balay goto setvalue; 13302d747510SLisandro Dalcin } else if (result > 0) { 13319371c9d4SSatish Balay n = i; 13329371c9d4SSatish Balay break; 1333e5c89e4eSSatish Balay } 1334e5c89e4eSSatish Balay } 13359355ec05SMatthew G. Knepley if (options->N == options->Nalloc) { 13369355ec05SMatthew G. Knepley char **names, **values; 13379355ec05SMatthew G. Knepley PetscBool *used; 13389355ec05SMatthew G. Knepley PetscOptionSource *source; 13399355ec05SMatthew G. Knepley 13409355ec05SMatthew G. Knepley options->Nalloc = PetscMax(10, options->Nalloc * 2); 13419355ec05SMatthew G. Knepley names = (char **)malloc(options->Nalloc * sizeof(char *)); 13429355ec05SMatthew G. Knepley values = (char **)malloc(options->Nalloc * sizeof(char *)); 13439355ec05SMatthew G. Knepley used = (PetscBool *)malloc(options->Nalloc * sizeof(PetscBool)); 13449355ec05SMatthew G. Knepley source = (PetscOptionSource *)malloc(options->Nalloc * sizeof(PetscOptionSource)); 13459355ec05SMatthew G. Knepley for (int i = 0; i < options->N; ++i) { 13469355ec05SMatthew G. Knepley names[i] = options->names[i]; 13479355ec05SMatthew G. Knepley values[i] = options->values[i]; 13489355ec05SMatthew G. Knepley used[i] = options->used[i]; 13499355ec05SMatthew G. Knepley source[i] = options->source[i]; 13509355ec05SMatthew G. Knepley } 13519355ec05SMatthew G. Knepley free(options->names); 13529355ec05SMatthew G. Knepley free(options->values); 13539355ec05SMatthew G. Knepley free(options->used); 13549355ec05SMatthew G. Knepley free(options->source); 13559355ec05SMatthew G. Knepley options->names = names; 13569355ec05SMatthew G. Knepley options->values = values; 13579355ec05SMatthew G. Knepley options->used = used; 13589355ec05SMatthew G. Knepley options->source = source; 13599355ec05SMatthew G. Knepley } 136039a651e2SJacob Faibussowitsch 13612d747510SLisandro Dalcin /* shift remaining values up 1 */ 13629355ec05SMatthew G. Knepley for (i = options->N; i > n; i--) { 13635e8c5e88SLisandro Dalcin options->names[i] = options->names[i - 1]; 1364e5c89e4eSSatish Balay options->values[i] = options->values[i - 1]; 1365e5c89e4eSSatish Balay options->used[i] = options->used[i - 1]; 13669355ec05SMatthew G. Knepley options->source[i] = options->source[i - 1]; 1367e5c89e4eSSatish Balay } 13682d747510SLisandro Dalcin options->names[n] = NULL; 13692d747510SLisandro Dalcin options->values[n] = NULL; 13702d747510SLisandro Dalcin options->used[n] = PETSC_FALSE; 13719355ec05SMatthew G. Knepley options->source[n] = PETSC_OPT_CODE; 13722d747510SLisandro Dalcin options->N++; 13732d747510SLisandro Dalcin 13742d747510SLisandro Dalcin /* destroy hash table */ 13752d747510SLisandro Dalcin kh_destroy(HO, options->ht); 13762d747510SLisandro Dalcin options->ht = NULL; 13772d747510SLisandro Dalcin 13782d747510SLisandro Dalcin /* set new name */ 137970d8d27cSBarry Smith len = strlen(name); 13805e8c5e88SLisandro Dalcin options->names[n] = (char *)malloc((len + 1) * sizeof(char)); 138139a651e2SJacob Faibussowitsch PetscCheck(options->names[n], PETSC_COMM_SELF, PETSC_ERR_MEM, "Failed to allocate option name"); 1382d49172ceSBarry Smith strcpy(options->names[n], name); 13832d747510SLisandro Dalcin 13842d747510SLisandro Dalcin setvalue: 13852d747510SLisandro Dalcin /* set new value */ 13862d747510SLisandro Dalcin if (options->values[n]) free(options->values[n]); 1387d49172ceSBarry Smith len = value ? strlen(value) : 0; 13885e8c5e88SLisandro Dalcin if (len) { 1389e5c89e4eSSatish Balay options->values[n] = (char *)malloc((len + 1) * sizeof(char)); 1390d49172ceSBarry Smith if (!options->values[n]) return PETSC_ERR_MEM; 1391d49172ceSBarry Smith strcpy(options->values[n], value); 13922d747510SLisandro Dalcin } else { 13932d747510SLisandro Dalcin options->values[n] = NULL; 13942d747510SLisandro Dalcin } 13959355ec05SMatthew G. Knepley options->source[n] = source; 13962d747510SLisandro Dalcin 139791ad3481SVaclav Hapla /* handle -help so that it can be set from anywhere */ 139891ad3481SVaclav Hapla if (!PetscOptNameCmp(name, "help")) { 139991ad3481SVaclav Hapla options->help = PETSC_TRUE; 1400d06005cbSLisandro Dalcin options->help_intro = (value && !PetscOptNameCmp(value, "intro")) ? PETSC_TRUE : PETSC_FALSE; 140191ad3481SVaclav Hapla options->used[n] = PETSC_TRUE; 140291ad3481SVaclav Hapla } 140391ad3481SVaclav Hapla 14049355ec05SMatthew G. Knepley PetscCall(PetscOptionsMonitor(options, name, value, source)); 1405c5b5d8d5SVaclav Hapla if (pos) *pos = n; 14063ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1407e5c89e4eSSatish Balay } 1408e5c89e4eSSatish Balay 1409e5c89e4eSSatish Balay /*@C 1410e5c89e4eSSatish Balay PetscOptionsClearValue - Clears an option name-value pair in the options 1411e5c89e4eSSatish Balay database, overriding whatever is already present. 1412e5c89e4eSSatish Balay 14131c9f3c13SBarry Smith Logically Collective 1414e5c89e4eSSatish Balay 1415d8d19677SJose E. Roman Input Parameters: 1416c5929fdfSBarry Smith + options - options database, use NULL for the default global database 1417a2b725a8SWilliam Gropp - name - name of option, this SHOULD have the - prepended 1418e5c89e4eSSatish Balay 1419e5c89e4eSSatish Balay Level: intermediate 1420e5c89e4eSSatish Balay 1421811af0c4SBarry Smith Note: 1422811af0c4SBarry Smith The collectivity of this routine is complex; only the MPI ranks that call this routine will 14231c9f3c13SBarry Smith have the affect of these options. If some processes that create objects call this routine and others do 14241c9f3c13SBarry Smith not the code may fail in complicated ways because the same parallel solvers may incorrectly use different options 14251c9f3c13SBarry Smith on different ranks. 14261c9f3c13SBarry Smith 1427db781477SPatrick Sanan .seealso: `PetscOptionsInsert()` 1428e5c89e4eSSatish Balay @*/ 1429d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsClearValue(PetscOptions options, const char name[]) 1430d71ae5a4SJacob Faibussowitsch { 14312d747510SLisandro Dalcin int N, n, i; 14322d747510SLisandro Dalcin char **names; 1433e5c89e4eSSatish Balay 1434e5c89e4eSSatish Balay PetscFunctionBegin; 1435c5929fdfSBarry Smith options = options ? options : defaultoptions; 1436cc73adaaSBarry Smith PetscCheck(name[0] == '-', PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Name must begin with '-': Instead %s", name); 1437c9dcd962SLisandro Dalcin if (!PetscOptNameCmp(name, "-help")) options->help = options->help_intro = PETSC_FALSE; 14382d747510SLisandro Dalcin 14392d747510SLisandro Dalcin name++; /* skip starting dash */ 14402d747510SLisandro Dalcin 14412d747510SLisandro Dalcin /* slow search */ 14422d747510SLisandro Dalcin N = n = options->N; 1443e5c89e4eSSatish Balay names = options->names; 1444e5c89e4eSSatish Balay for (i = 0; i < N; i++) { 14452d747510SLisandro Dalcin int result = PetscOptNameCmp(names[i], name); 14462d747510SLisandro Dalcin if (!result) { 14479371c9d4SSatish Balay n = i; 14489371c9d4SSatish Balay break; 14492d747510SLisandro Dalcin } else if (result > 0) { 14509371c9d4SSatish Balay n = N; 14519371c9d4SSatish Balay break; 1452e5c89e4eSSatish Balay } 14532d747510SLisandro Dalcin } 14543ba16761SJacob Faibussowitsch if (n == N) PetscFunctionReturn(PETSC_SUCCESS); /* it was not present */ 1455e5c89e4eSSatish Balay 14562d747510SLisandro Dalcin /* remove name and value */ 14572d747510SLisandro Dalcin if (options->names[n]) free(options->names[n]); 14582d747510SLisandro Dalcin if (options->values[n]) free(options->values[n]); 1459e5c89e4eSSatish Balay /* shift remaining values down 1 */ 1460e5c89e4eSSatish Balay for (i = n; i < N - 1; i++) { 14615e8c5e88SLisandro Dalcin options->names[i] = options->names[i + 1]; 1462e5c89e4eSSatish Balay options->values[i] = options->values[i + 1]; 1463e5c89e4eSSatish Balay options->used[i] = options->used[i + 1]; 14649355ec05SMatthew G. Knepley options->source[i] = options->source[i + 1]; 1465e5c89e4eSSatish Balay } 1466e5c89e4eSSatish Balay options->N--; 14672d747510SLisandro Dalcin 14682d747510SLisandro Dalcin /* destroy hash table */ 14692d747510SLisandro Dalcin kh_destroy(HO, options->ht); 14702d747510SLisandro Dalcin options->ht = NULL; 14712d747510SLisandro Dalcin 14729355ec05SMatthew G. Knepley PetscCall(PetscOptionsMonitor(options, name, NULL, PETSC_OPT_CODE)); 14733ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1474e5c89e4eSSatish Balay } 1475e5c89e4eSSatish Balay 1476e5c89e4eSSatish Balay /*@C 14772d747510SLisandro Dalcin PetscOptionsFindPair - Gets an option name-value pair from the options database. 1478e5c89e4eSSatish Balay 14792d747510SLisandro Dalcin Not Collective 1480e5c89e4eSSatish Balay 1481e5c89e4eSSatish Balay Input Parameters: 14822d747510SLisandro Dalcin + options - options database, use NULL for the default global database 14832d747510SLisandro Dalcin . pre - the string to prepend to the name or NULL, this SHOULD NOT have the "-" prepended 14842d747510SLisandro Dalcin - name - name of option, this SHOULD have the "-" prepended 1485e5c89e4eSSatish Balay 14862d747510SLisandro Dalcin Output Parameters: 14872d747510SLisandro Dalcin + value - the option value (optional, not used for all options) 14882d747510SLisandro Dalcin - set - whether the option is set (optional) 1489e5c89e4eSSatish Balay 1490811af0c4SBarry Smith Note: 14919666a313SBarry Smith Each process may find different values or no value depending on how options were inserted into the database 14921c9f3c13SBarry Smith 14932d747510SLisandro Dalcin Level: developer 14942d747510SLisandro Dalcin 1495db781477SPatrick Sanan .seealso: `PetscOptionsSetValue()`, `PetscOptionsClearValue()` 1496e5c89e4eSSatish Balay @*/ 1497d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsFindPair(PetscOptions options, const char pre[], const char name[], const char *value[], PetscBool *set) 1498d71ae5a4SJacob Faibussowitsch { 14999355ec05SMatthew G. Knepley char buf[PETSC_MAX_OPTION_NAME]; 1500daabea38SBarry Smith PetscBool usehashtable = PETSC_TRUE; 15012d747510SLisandro Dalcin PetscBool matchnumbers = PETSC_TRUE; 1502e5c89e4eSSatish Balay 1503e5c89e4eSSatish Balay PetscFunctionBegin; 1504c5929fdfSBarry Smith options = options ? options : defaultoptions; 150508401ef6SPierre Jolivet PetscCheck(!pre || !PetscUnlikely(pre[0] == '-'), PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Prefix cannot begin with '-': Instead %s", pre); 1506cc73adaaSBarry Smith PetscCheck(name[0] == '-', PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Name must begin with '-': Instead %s", name); 1507e5c89e4eSSatish Balay 15082d747510SLisandro Dalcin name++; /* skip starting dash */ 1509e5c89e4eSSatish Balay 15107cd08cecSJed Brown /* append prefix to name, if prefix="foo_" and option='--bar", prefixed option is --foo_bar */ 15112d747510SLisandro Dalcin if (pre && pre[0]) { 15122d747510SLisandro Dalcin char *ptr = buf; 15139371c9d4SSatish Balay if (name[0] == '-') { 15149371c9d4SSatish Balay *ptr++ = '-'; 15159371c9d4SSatish Balay name++; 15169371c9d4SSatish Balay } 15179566063dSJacob Faibussowitsch PetscCall(PetscStrncpy(ptr, pre, buf + sizeof(buf) - ptr)); 15189566063dSJacob Faibussowitsch PetscCall(PetscStrlcat(buf, name, sizeof(buf))); 15192d747510SLisandro Dalcin name = buf; 15207cd08cecSJed Brown } 15212d747510SLisandro Dalcin 152276bd3646SJed Brown if (PetscDefined(USE_DEBUG)) { 15232f828895SJed Brown PetscBool valid; 15249355ec05SMatthew G. Knepley char key[PETSC_MAX_OPTION_NAME + 1] = "-"; 15259566063dSJacob Faibussowitsch PetscCall(PetscStrncpy(key + 1, name, sizeof(key) - 1)); 15269566063dSJacob Faibussowitsch PetscCall(PetscOptionsValidKey(key, &valid)); 152728b400f6SJacob Faibussowitsch PetscCheck(valid, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Invalid option '%s' obtained from pre='%s' and name='%s'", key, pre ? pre : "", name); 15282f828895SJed Brown } 1529e5c89e4eSSatish Balay 15302d747510SLisandro Dalcin if (!options->ht && usehashtable) { 15312d747510SLisandro Dalcin int i, ret; 15322d747510SLisandro Dalcin khiter_t it; 15332d747510SLisandro Dalcin khash_t(HO) *ht; 15342d747510SLisandro Dalcin ht = kh_init(HO); 153528b400f6SJacob Faibussowitsch PetscCheck(ht, PETSC_COMM_SELF, PETSC_ERR_MEM, "Hash table allocation failed"); 15362d747510SLisandro Dalcin ret = kh_resize(HO, ht, options->N * 2); /* twice the required size to reduce risk of collisions */ 153728b400f6SJacob Faibussowitsch PetscCheck(!ret, PETSC_COMM_SELF, PETSC_ERR_MEM, "Hash table allocation failed"); 15382d747510SLisandro Dalcin for (i = 0; i < options->N; i++) { 15392d747510SLisandro Dalcin it = kh_put(HO, ht, options->names[i], &ret); 154008401ef6SPierre Jolivet PetscCheck(ret == 1, PETSC_COMM_SELF, PETSC_ERR_MEM, "Hash table allocation failed"); 15412d747510SLisandro Dalcin kh_val(ht, it) = i; 15422d747510SLisandro Dalcin } 15432d747510SLisandro Dalcin options->ht = ht; 15442d747510SLisandro Dalcin } 15452d747510SLisandro Dalcin 15469371c9d4SSatish Balay if (usehashtable) { /* fast search */ 15472d747510SLisandro Dalcin khash_t(HO) *ht = options->ht; 15482d747510SLisandro Dalcin khiter_t it = kh_get(HO, ht, name); 15492d747510SLisandro Dalcin if (it != kh_end(ht)) { 15502d747510SLisandro Dalcin int i = kh_val(ht, it); 1551e5c89e4eSSatish Balay options->used[i] = PETSC_TRUE; 15522d747510SLisandro Dalcin if (value) *value = options->values[i]; 15532d747510SLisandro Dalcin if (set) *set = PETSC_TRUE; 15543ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 15552d747510SLisandro Dalcin } 15569371c9d4SSatish Balay } else { /* slow search */ 15572d747510SLisandro Dalcin int i, N = options->N; 15582d747510SLisandro Dalcin for (i = 0; i < N; i++) { 1559daabea38SBarry Smith int result = PetscOptNameCmp(options->names[i], name); 15602d747510SLisandro Dalcin if (!result) { 15612d747510SLisandro Dalcin options->used[i] = PETSC_TRUE; 15622d747510SLisandro Dalcin if (value) *value = options->values[i]; 15632d747510SLisandro Dalcin if (set) *set = PETSC_TRUE; 15643ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 15652d747510SLisandro Dalcin } else if (result > 0) { 1566e5c89e4eSSatish Balay break; 1567e5c89e4eSSatish Balay } 1568e5c89e4eSSatish Balay } 15692d747510SLisandro Dalcin } 15702d747510SLisandro Dalcin 15712d747510SLisandro Dalcin /* 15722d747510SLisandro Dalcin The following block slows down all lookups in the most frequent path (most lookups are unsuccessful). 15732d747510SLisandro Dalcin Maybe this special lookup mode should be enabled on request with a push/pop API. 15742d747510SLisandro Dalcin The feature of matching _%d_ used sparingly in the codebase. 15752d747510SLisandro Dalcin */ 15762d747510SLisandro Dalcin if (matchnumbers) { 15772d747510SLisandro Dalcin int i, j, cnt = 0, locs[16], loce[16]; 1578e5c89e4eSSatish Balay /* determine the location and number of all _%d_ in the key */ 15792d747510SLisandro Dalcin for (i = 0; name[i]; i++) { 15802d747510SLisandro Dalcin if (name[i] == '_') { 15812d747510SLisandro Dalcin for (j = i + 1; name[j]; j++) { 15822d747510SLisandro Dalcin if (name[j] >= '0' && name[j] <= '9') continue; 15832d747510SLisandro Dalcin if (name[j] == '_' && j > i + 1) { /* found a number */ 1584e5c89e4eSSatish Balay locs[cnt] = i + 1; 1585e5c89e4eSSatish Balay loce[cnt++] = j + 1; 1586e5c89e4eSSatish Balay } 15872d747510SLisandro Dalcin i = j - 1; 1588e5c89e4eSSatish Balay break; 1589e5c89e4eSSatish Balay } 1590e5c89e4eSSatish Balay } 1591e5c89e4eSSatish Balay } 1592e5c89e4eSSatish Balay for (i = 0; i < cnt; i++) { 15932d747510SLisandro Dalcin PetscBool found; 15949355ec05SMatthew G. Knepley char opt[PETSC_MAX_OPTION_NAME + 1] = "-", tmp[PETSC_MAX_OPTION_NAME]; 15959566063dSJacob Faibussowitsch PetscCall(PetscStrncpy(tmp, name, PetscMin((size_t)(locs[i] + 1), sizeof(tmp)))); 15969566063dSJacob Faibussowitsch PetscCall(PetscStrlcat(opt, tmp, sizeof(opt))); 15979566063dSJacob Faibussowitsch PetscCall(PetscStrlcat(opt, name + loce[i], sizeof(opt))); 15989566063dSJacob Faibussowitsch PetscCall(PetscOptionsFindPair(options, NULL, opt, value, &found)); 15999371c9d4SSatish Balay if (found) { 16009371c9d4SSatish Balay if (set) *set = PETSC_TRUE; 16013ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 16029371c9d4SSatish Balay } 1603e5c89e4eSSatish Balay } 1604e5c89e4eSSatish Balay } 16052d747510SLisandro Dalcin 16062d747510SLisandro Dalcin if (set) *set = PETSC_FALSE; 16073ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1608e5c89e4eSSatish Balay } 1609e5c89e4eSSatish Balay 1610d6ced9c0SMatthew G. Knepley /* Check whether any option begins with pre+name */ 1611d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscOptionsFindPairPrefix_Private(PetscOptions options, const char pre[], const char name[], const char *value[], PetscBool *set) 1612d71ae5a4SJacob Faibussowitsch { 16139355ec05SMatthew G. Knepley char buf[PETSC_MAX_OPTION_NAME]; 1614d6ced9c0SMatthew G. Knepley int numCnt = 0, locs[16], loce[16]; 1615514bf10dSMatthew G Knepley 1616514bf10dSMatthew G Knepley PetscFunctionBegin; 1617c5929fdfSBarry Smith options = options ? options : defaultoptions; 1618cc73adaaSBarry Smith PetscCheck(!pre || pre[0] != '-', PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Prefix cannot begin with '-': Instead %s", pre); 1619cc73adaaSBarry Smith PetscCheck(name[0] == '-', PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Name must begin with '-': Instead %s", name); 1620514bf10dSMatthew G Knepley 16212d747510SLisandro Dalcin name++; /* skip starting dash */ 1622514bf10dSMatthew G Knepley 1623514bf10dSMatthew G Knepley /* append prefix to name, if prefix="foo_" and option='--bar", prefixed option is --foo_bar */ 16242d747510SLisandro Dalcin if (pre && pre[0]) { 16252d747510SLisandro Dalcin char *ptr = buf; 16269371c9d4SSatish Balay if (name[0] == '-') { 16279371c9d4SSatish Balay *ptr++ = '-'; 16289371c9d4SSatish Balay name++; 16299371c9d4SSatish Balay } 16309b15cf9aSJacob Faibussowitsch PetscCall(PetscStrncpy(ptr, pre, sizeof(buf) - ((ptr == buf) ? 0 : 1))); 16319566063dSJacob Faibussowitsch PetscCall(PetscStrlcat(buf, name, sizeof(buf))); 16322d747510SLisandro Dalcin name = buf; 1633514bf10dSMatthew G Knepley } 16342d747510SLisandro Dalcin 163576bd3646SJed Brown if (PetscDefined(USE_DEBUG)) { 1636514bf10dSMatthew G Knepley PetscBool valid; 16379355ec05SMatthew G. Knepley char key[PETSC_MAX_OPTION_NAME + 1] = "-"; 16389566063dSJacob Faibussowitsch PetscCall(PetscStrncpy(key + 1, name, sizeof(key) - 1)); 16399566063dSJacob Faibussowitsch PetscCall(PetscOptionsValidKey(key, &valid)); 164028b400f6SJacob Faibussowitsch PetscCheck(valid, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Invalid option '%s' obtained from pre='%s' and name='%s'", key, pre ? pre : "", name); 1641514bf10dSMatthew G Knepley } 1642514bf10dSMatthew G Knepley 1643d6ced9c0SMatthew G. Knepley /* determine the location and number of all _%d_ in the key */ 1644d6ced9c0SMatthew G. Knepley { 1645d6ced9c0SMatthew G. Knepley int i, j; 1646d6ced9c0SMatthew G. Knepley for (i = 0; name[i]; i++) { 1647d6ced9c0SMatthew G. Knepley if (name[i] == '_') { 1648d6ced9c0SMatthew G. Knepley for (j = i + 1; name[j]; j++) { 1649d6ced9c0SMatthew G. Knepley if (name[j] >= '0' && name[j] <= '9') continue; 1650d6ced9c0SMatthew G. Knepley if (name[j] == '_' && j > i + 1) { /* found a number */ 1651d6ced9c0SMatthew G. Knepley locs[numCnt] = i + 1; 1652d6ced9c0SMatthew G. Knepley loce[numCnt++] = j + 1; 1653d6ced9c0SMatthew G. Knepley } 1654d6ced9c0SMatthew G. Knepley i = j - 1; 1655d6ced9c0SMatthew G. Knepley break; 1656d6ced9c0SMatthew G. Knepley } 1657d6ced9c0SMatthew G. Knepley } 1658d6ced9c0SMatthew G. Knepley } 1659d6ced9c0SMatthew G. Knepley } 1660d6ced9c0SMatthew G. Knepley 1661*363da2dcSJacob Faibussowitsch /* slow search */ 1662*363da2dcSJacob Faibussowitsch for (int c = -1; c < numCnt; ++c) { 1663*363da2dcSJacob Faibussowitsch char opt[PETSC_MAX_OPTION_NAME + 2] = ""; 16642d747510SLisandro Dalcin size_t len; 1665d6ced9c0SMatthew G. Knepley 1666d6ced9c0SMatthew G. Knepley if (c < 0) { 1667c6a7a370SJeremy L Thompson PetscCall(PetscStrncpy(opt, name, sizeof(opt))); 1668d6ced9c0SMatthew G. Knepley } else { 1669*363da2dcSJacob Faibussowitsch PetscCall(PetscStrncpy(opt, name, PetscMin((size_t)(locs[c] + 1), sizeof(opt)))); 1670*363da2dcSJacob Faibussowitsch PetscCall(PetscStrlcat(opt, name + loce[c], sizeof(opt) - 1)); 1671d6ced9c0SMatthew G. Knepley } 16729566063dSJacob Faibussowitsch PetscCall(PetscStrlen(opt, &len)); 1673*363da2dcSJacob Faibussowitsch for (int i = 0; i < options->N; i++) { 1674*363da2dcSJacob Faibussowitsch PetscBool match; 1675*363da2dcSJacob Faibussowitsch 16769566063dSJacob Faibussowitsch PetscCall(PetscStrncmp(options->names[i], opt, len, &match)); 1677514bf10dSMatthew G Knepley if (match) { 1678514bf10dSMatthew G Knepley options->used[i] = PETSC_TRUE; 16792d747510SLisandro Dalcin if (value) *value = options->values[i]; 16802d747510SLisandro Dalcin if (set) *set = PETSC_TRUE; 16813ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1682514bf10dSMatthew G Knepley } 1683514bf10dSMatthew G Knepley } 16842d747510SLisandro Dalcin } 16852d747510SLisandro Dalcin 16862d747510SLisandro Dalcin if (set) *set = PETSC_FALSE; 16873ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1688514bf10dSMatthew G Knepley } 1689514bf10dSMatthew G Knepley 1690e5c89e4eSSatish Balay /*@C 1691e5c89e4eSSatish Balay PetscOptionsReject - Generates an error if a certain option is given. 1692e5c89e4eSSatish Balay 16931c9f3c13SBarry Smith Not Collective 1694e5c89e4eSSatish Balay 1695e5c89e4eSSatish Balay Input Parameters: 16965c9cc608SHong Zhang + options - options database, use NULL for default global database 16972d747510SLisandro Dalcin . pre - the option prefix (may be NULL) 16982d747510SLisandro Dalcin . name - the option name one is seeking 16990298fd71SBarry Smith - mess - error message (may be NULL) 1700e5c89e4eSSatish Balay 1701e5c89e4eSSatish Balay Level: advanced 1702e5c89e4eSSatish Balay 1703c2e3fba1SPatrick Sanan .seealso: `PetscOptionsGetInt()`, `PetscOptionsGetReal()`, `OptionsHasName()`, 1704db781477SPatrick Sanan `PetscOptionsGetString()`, `PetscOptionsGetIntArray()`, `PetscOptionsGetRealArray()`, `PetscOptionsBool()`, 1705db781477SPatrick Sanan `PetscOptionsName()`, `PetscOptionsBegin()`, `PetscOptionsEnd()`, `PetscOptionsHeadBegin()`, 1706c2e3fba1SPatrick Sanan `PetscOptionsStringArray()`, `PetscOptionsRealArray()`, `PetscOptionsScalar()`, 1707db781477SPatrick Sanan `PetscOptionsBoolGroupBegin()`, `PetscOptionsBoolGroup()`, `PetscOptionsBoolGroupEnd()`, 1708db781477SPatrick Sanan `PetscOptionsFList()`, `PetscOptionsEList()` 1709e5c89e4eSSatish Balay @*/ 1710d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsReject(PetscOptions options, const char pre[], const char name[], const char mess[]) 1711d71ae5a4SJacob Faibussowitsch { 1712ace3abfcSBarry Smith PetscBool flag = PETSC_FALSE; 1713e5c89e4eSSatish Balay 1714e5c89e4eSSatish Balay PetscFunctionBegin; 17159566063dSJacob Faibussowitsch PetscCall(PetscOptionsHasName(options, pre, name, &flag)); 1716e5c89e4eSSatish Balay if (flag) { 171708401ef6SPierre 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); 1718f7d195e4SLawrence Mitchell SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Program has disabled option: -%s%s", pre ? pre : "", name + 1); 1719e5c89e4eSSatish Balay } 17203ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1721e5c89e4eSSatish Balay } 1722e5c89e4eSSatish Balay 1723e5c89e4eSSatish Balay /*@C 17242d747510SLisandro Dalcin PetscOptionsHasHelp - Determines whether the "-help" option is in the database. 17252d747510SLisandro Dalcin 17262d747510SLisandro Dalcin Not Collective 17272d747510SLisandro Dalcin 1728811af0c4SBarry Smith Input Parameter: 17292d747510SLisandro Dalcin . options - options database, use NULL for default global database 17302d747510SLisandro Dalcin 1731811af0c4SBarry Smith Output Parameter: 1732811af0c4SBarry Smith . set - `PETSC_TRUE` if found else `PETSC_FALSE`. 17332d747510SLisandro Dalcin 17342d747510SLisandro Dalcin Level: advanced 17352d747510SLisandro Dalcin 1736db781477SPatrick Sanan .seealso: `PetscOptionsHasName()` 17372d747510SLisandro Dalcin @*/ 1738d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsHasHelp(PetscOptions options, PetscBool *set) 1739d71ae5a4SJacob Faibussowitsch { 17402d747510SLisandro Dalcin PetscFunctionBegin; 1741dadcf809SJacob Faibussowitsch PetscValidBoolPointer(set, 2); 17422d747510SLisandro Dalcin options = options ? options : defaultoptions; 17432d747510SLisandro Dalcin *set = options->help; 17443ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 17452d747510SLisandro Dalcin } 17462d747510SLisandro Dalcin 1747d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsHasHelpIntro_Internal(PetscOptions options, PetscBool *set) 1748d71ae5a4SJacob Faibussowitsch { 1749d314f959SVaclav Hapla PetscFunctionBegin; 1750dadcf809SJacob Faibussowitsch PetscValidBoolPointer(set, 2); 1751d314f959SVaclav Hapla options = options ? options : defaultoptions; 1752d314f959SVaclav Hapla *set = options->help_intro; 17533ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1754d314f959SVaclav Hapla } 1755d314f959SVaclav Hapla 17562d747510SLisandro Dalcin /*@C 1757e24fcbf7SPierre 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 1758e24fcbf7SPierre Jolivet if its value is set to false. 1759e5c89e4eSSatish Balay 1760e5c89e4eSSatish Balay Not Collective 1761e5c89e4eSSatish Balay 1762e5c89e4eSSatish Balay Input Parameters: 17635c9cc608SHong Zhang + options - options database, use NULL for default global database 17643de71b31SHong Zhang . pre - string to prepend to the name or NULL 17653de71b31SHong Zhang - name - the option one is seeking 1766e5c89e4eSSatish Balay 1767811af0c4SBarry Smith Output Parameter: 1768811af0c4SBarry Smith . set - `PETSC_TRUE` if found else `PETSC_FALSE`. 1769e5c89e4eSSatish Balay 1770e5c89e4eSSatish Balay Level: beginner 1771e5c89e4eSSatish Balay 1772811af0c4SBarry Smith Note: 1773811af0c4SBarry Smith In many cases you probably want to use `PetscOptionsGetBool()` instead of calling this, to allowing toggling values. 177490d69ab7SBarry Smith 1775db781477SPatrick Sanan .seealso: `PetscOptionsGetInt()`, `PetscOptionsGetReal()`, 1776db781477SPatrick Sanan `PetscOptionsGetString()`, `PetscOptionsGetIntArray()`, `PetscOptionsGetRealArray()`, `PetscOptionsBool()`, 1777db781477SPatrick Sanan `PetscOptionsName()`, `PetscOptionsBegin()`, `PetscOptionsEnd()`, `PetscOptionsHeadBegin()`, 1778c2e3fba1SPatrick Sanan `PetscOptionsStringArray()`, `PetscOptionsRealArray()`, `PetscOptionsScalar()`, 1779db781477SPatrick Sanan `PetscOptionsBoolGroupBegin()`, `PetscOptionsBoolGroup()`, `PetscOptionsBoolGroupEnd()`, 1780db781477SPatrick Sanan `PetscOptionsFList()`, `PetscOptionsEList()` 1781e5c89e4eSSatish Balay @*/ 1782d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsHasName(PetscOptions options, const char pre[], const char name[], PetscBool *set) 1783d71ae5a4SJacob Faibussowitsch { 17842d747510SLisandro Dalcin const char *value; 1785ace3abfcSBarry Smith PetscBool flag; 1786e5c89e4eSSatish Balay 1787e5c89e4eSSatish Balay PetscFunctionBegin; 17889566063dSJacob Faibussowitsch PetscCall(PetscOptionsFindPair(options, pre, name, &value, &flag)); 178996ef3cdfSSatish Balay if (set) *set = flag; 17903ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1791e5c89e4eSSatish Balay } 1792e5c89e4eSSatish Balay 1793e5c89e4eSSatish Balay /*@C 17942d747510SLisandro Dalcin PetscOptionsGetAll - Lists all the options the program was run with in a single string. 17952d747510SLisandro Dalcin 17962d747510SLisandro Dalcin Not Collective 17972d747510SLisandro Dalcin 1798fd292e60Sprj- Input Parameter: 17992d747510SLisandro Dalcin . options - the options database, use NULL for the default global database 18002d747510SLisandro Dalcin 18012d747510SLisandro Dalcin Output Parameter: 18022d747510SLisandro Dalcin . copts - pointer where string pointer is stored 18032d747510SLisandro Dalcin 18042d747510SLisandro Dalcin Notes: 1805811af0c4SBarry Smith The array and each entry in the array should be freed with `PetscFree()` 1806811af0c4SBarry Smith 18071c9f3c13SBarry Smith Each process may have different values depending on how the options were inserted into the database 18082d747510SLisandro Dalcin 18092d747510SLisandro Dalcin Level: advanced 18102d747510SLisandro Dalcin 1811db781477SPatrick Sanan .seealso: `PetscOptionsAllUsed()`, `PetscOptionsView()`, `PetscOptionsPush()`, `PetscOptionsPop()` 18122d747510SLisandro Dalcin @*/ 1813d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsGetAll(PetscOptions options, char *copts[]) 1814d71ae5a4SJacob Faibussowitsch { 18152d747510SLisandro Dalcin PetscInt i; 18162d747510SLisandro Dalcin size_t len = 1, lent = 0; 18172d747510SLisandro Dalcin char *coptions = NULL; 18182d747510SLisandro Dalcin 18192d747510SLisandro Dalcin PetscFunctionBegin; 18202d747510SLisandro Dalcin PetscValidPointer(copts, 2); 18212d747510SLisandro Dalcin options = options ? options : defaultoptions; 18222d747510SLisandro Dalcin /* count the length of the required string */ 18232d747510SLisandro Dalcin for (i = 0; i < options->N; i++) { 18249566063dSJacob Faibussowitsch PetscCall(PetscStrlen(options->names[i], &lent)); 18252d747510SLisandro Dalcin len += 2 + lent; 18262d747510SLisandro Dalcin if (options->values[i]) { 18279566063dSJacob Faibussowitsch PetscCall(PetscStrlen(options->values[i], &lent)); 18282d747510SLisandro Dalcin len += 1 + lent; 18292d747510SLisandro Dalcin } 18302d747510SLisandro Dalcin } 18319566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(len, &coptions)); 18322d747510SLisandro Dalcin coptions[0] = 0; 18332d747510SLisandro Dalcin for (i = 0; i < options->N; i++) { 1834c6a7a370SJeremy L Thompson PetscCall(PetscStrlcat(coptions, "-", len)); 1835c6a7a370SJeremy L Thompson PetscCall(PetscStrlcat(coptions, options->names[i], len)); 1836c6a7a370SJeremy L Thompson PetscCall(PetscStrlcat(coptions, " ", len)); 18372d747510SLisandro Dalcin if (options->values[i]) { 1838c6a7a370SJeremy L Thompson PetscCall(PetscStrlcat(coptions, options->values[i], len)); 1839c6a7a370SJeremy L Thompson PetscCall(PetscStrlcat(coptions, " ", len)); 18402d747510SLisandro Dalcin } 18412d747510SLisandro Dalcin } 18422d747510SLisandro Dalcin *copts = coptions; 18433ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 18442d747510SLisandro Dalcin } 18452d747510SLisandro Dalcin 18462d747510SLisandro Dalcin /*@C 18472d747510SLisandro Dalcin PetscOptionsUsed - Indicates if PETSc has used a particular option set in the database 18482d747510SLisandro Dalcin 18492d747510SLisandro Dalcin Not Collective 18502d747510SLisandro Dalcin 1851d8d19677SJose E. Roman Input Parameters: 18522d747510SLisandro Dalcin + options - options database, use NULL for default global database 18532d747510SLisandro Dalcin - name - string name of option 18542d747510SLisandro Dalcin 18552d747510SLisandro Dalcin Output Parameter: 1856811af0c4SBarry Smith . used - `PETSC_TRUE` if the option was used, otherwise false, including if option was not found in options database 18572d747510SLisandro Dalcin 18582d747510SLisandro Dalcin Level: advanced 18592d747510SLisandro Dalcin 1860811af0c4SBarry Smith Note: 18619666a313SBarry Smith The value returned may be different on each process and depends on which options have been processed 18621c9f3c13SBarry Smith on the given process 18631c9f3c13SBarry Smith 1864db781477SPatrick Sanan .seealso: `PetscOptionsView()`, `PetscOptionsLeft()`, `PetscOptionsAllUsed()` 18652d747510SLisandro Dalcin @*/ 1866d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsUsed(PetscOptions options, const char *name, PetscBool *used) 1867d71ae5a4SJacob Faibussowitsch { 18682d747510SLisandro Dalcin PetscInt i; 18692d747510SLisandro Dalcin 18702d747510SLisandro Dalcin PetscFunctionBegin; 18712d747510SLisandro Dalcin PetscValidCharPointer(name, 2); 1872dadcf809SJacob Faibussowitsch PetscValidBoolPointer(used, 3); 18732d747510SLisandro Dalcin options = options ? options : defaultoptions; 18742d747510SLisandro Dalcin *used = PETSC_FALSE; 18752d747510SLisandro Dalcin for (i = 0; i < options->N; i++) { 18769566063dSJacob Faibussowitsch PetscCall(PetscStrcasecmp(options->names[i], name, used)); 18772d747510SLisandro Dalcin if (*used) { 18782d747510SLisandro Dalcin *used = options->used[i]; 18792d747510SLisandro Dalcin break; 18802d747510SLisandro Dalcin } 18812d747510SLisandro Dalcin } 18823ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 18832d747510SLisandro Dalcin } 18842d747510SLisandro Dalcin 1885487a658cSBarry Smith /*@ 18862d747510SLisandro Dalcin PetscOptionsAllUsed - Returns a count of the number of options in the 18872d747510SLisandro Dalcin database that have never been selected. 18882d747510SLisandro Dalcin 18892d747510SLisandro Dalcin Not Collective 18902d747510SLisandro Dalcin 18912d747510SLisandro Dalcin Input Parameter: 18922d747510SLisandro Dalcin . options - options database, use NULL for default global database 18932d747510SLisandro Dalcin 18942d747510SLisandro Dalcin Output Parameter: 18952d747510SLisandro Dalcin . N - count of options not used 18962d747510SLisandro Dalcin 18972d747510SLisandro Dalcin Level: advanced 18982d747510SLisandro Dalcin 1899811af0c4SBarry Smith Note: 19009666a313SBarry Smith The value returned may be different on each process and depends on which options have been processed 19011c9f3c13SBarry Smith on the given process 19021c9f3c13SBarry Smith 1903db781477SPatrick Sanan .seealso: `PetscOptionsView()` 19042d747510SLisandro Dalcin @*/ 1905d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsAllUsed(PetscOptions options, PetscInt *N) 1906d71ae5a4SJacob Faibussowitsch { 19072d747510SLisandro Dalcin PetscInt i, n = 0; 19082d747510SLisandro Dalcin 19092d747510SLisandro Dalcin PetscFunctionBegin; 19102d747510SLisandro Dalcin PetscValidIntPointer(N, 2); 19112d747510SLisandro Dalcin options = options ? options : defaultoptions; 19122d747510SLisandro Dalcin for (i = 0; i < options->N; i++) { 19132d747510SLisandro Dalcin if (!options->used[i]) n++; 19142d747510SLisandro Dalcin } 19152d747510SLisandro Dalcin *N = n; 19163ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 19172d747510SLisandro Dalcin } 19182d747510SLisandro Dalcin 1919487a658cSBarry Smith /*@ 19202d747510SLisandro Dalcin PetscOptionsLeft - Prints to screen any options that were set and never used. 19212d747510SLisandro Dalcin 19222d747510SLisandro Dalcin Not Collective 19232d747510SLisandro Dalcin 19242d747510SLisandro Dalcin Input Parameter: 19252d747510SLisandro Dalcin . options - options database; use NULL for default global database 19262d747510SLisandro Dalcin 19272d747510SLisandro Dalcin Options Database Key: 1928811af0c4SBarry Smith . -options_left - activates `PetscOptionsAllUsed()` within `PetscFinalize()` 19292d747510SLisandro Dalcin 19303de2bfdfSBarry Smith Notes: 1931811af0c4SBarry Smith This is rarely used directly, it is called by `PetscFinalize()` in debug more or if -options_left 19321c9f3c13SBarry Smith is passed otherwise to help users determine possible mistakes in their usage of options. This 1933811af0c4SBarry Smith only prints values on process zero of `PETSC_COMM_WORLD`. 1934811af0c4SBarry Smith 1935811af0c4SBarry Smith Other processes depending the objects 19361c9f3c13SBarry Smith used may have different options that are left unused. 19373de2bfdfSBarry Smith 19382d747510SLisandro Dalcin Level: advanced 19392d747510SLisandro Dalcin 1940db781477SPatrick Sanan .seealso: `PetscOptionsAllUsed()` 19412d747510SLisandro Dalcin @*/ 1942d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsLeft(PetscOptions options) 1943d71ae5a4SJacob Faibussowitsch { 19442d747510SLisandro Dalcin PetscInt i; 19453de2bfdfSBarry Smith PetscInt cnt = 0; 19463de2bfdfSBarry Smith PetscOptions toptions; 19472d747510SLisandro Dalcin 19482d747510SLisandro Dalcin PetscFunctionBegin; 19493de2bfdfSBarry Smith toptions = options ? options : defaultoptions; 19503de2bfdfSBarry Smith for (i = 0; i < toptions->N; i++) { 19513de2bfdfSBarry Smith if (!toptions->used[i]) { 1952660278c0SBarry Smith if (PetscCIOption(toptions->names[i])) continue; 19533de2bfdfSBarry Smith if (toptions->values[i]) { 19549355ec05SMatthew 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]])); 19552d747510SLisandro Dalcin } else { 19569355ec05SMatthew G. Knepley PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Option left: name:-%s (no value) source: %s\n", toptions->names[i], PetscOptionSources[toptions->source[i]])); 19572d747510SLisandro Dalcin } 19582d747510SLisandro Dalcin } 19592d747510SLisandro Dalcin } 19603de2bfdfSBarry Smith if (!options) { 19613de2bfdfSBarry Smith toptions = defaultoptions; 19623de2bfdfSBarry Smith while (toptions->previous) { 19633de2bfdfSBarry Smith cnt++; 19643de2bfdfSBarry Smith toptions = toptions->previous; 19653de2bfdfSBarry Smith } 196648a46eb9SPierre 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)); 19673de2bfdfSBarry Smith } 19683ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 19692d747510SLisandro Dalcin } 19702d747510SLisandro Dalcin 19712d747510SLisandro Dalcin /*@C 19722d747510SLisandro Dalcin PetscOptionsLeftGet - Returns all options that were set and never used. 19732d747510SLisandro Dalcin 19742d747510SLisandro Dalcin Not Collective 19752d747510SLisandro Dalcin 19762d747510SLisandro Dalcin Input Parameter: 19772d747510SLisandro Dalcin . options - options database, use NULL for default global database 19782d747510SLisandro Dalcin 1979d8d19677SJose E. Roman Output Parameters: 1980a2b725a8SWilliam Gropp + N - count of options not used 19812d747510SLisandro Dalcin . names - names of options not used 1982a2b725a8SWilliam Gropp - values - values of options not used 19832d747510SLisandro Dalcin 19842d747510SLisandro Dalcin Level: advanced 19852d747510SLisandro Dalcin 19862d747510SLisandro Dalcin Notes: 1987811af0c4SBarry Smith Users should call `PetscOptionsLeftRestore()` to free the memory allocated in this routine 1988811af0c4SBarry Smith 1989811af0c4SBarry Smith The value returned may be different on each process and depends on which options have been processed 19901c9f3c13SBarry Smith on the given process 19912d747510SLisandro Dalcin 1992db781477SPatrick Sanan .seealso: `PetscOptionsAllUsed()`, `PetscOptionsLeft()` 19932d747510SLisandro Dalcin @*/ 1994d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsLeftGet(PetscOptions options, PetscInt *N, char **names[], char **values[]) 1995d71ae5a4SJacob Faibussowitsch { 19962d747510SLisandro Dalcin PetscInt i, n; 19972d747510SLisandro Dalcin 19982d747510SLisandro Dalcin PetscFunctionBegin; 19992d747510SLisandro Dalcin if (N) PetscValidIntPointer(N, 2); 20002d747510SLisandro Dalcin if (names) PetscValidPointer(names, 3); 20012d747510SLisandro Dalcin if (values) PetscValidPointer(values, 4); 20022d747510SLisandro Dalcin options = options ? options : defaultoptions; 20032d747510SLisandro Dalcin 20042d747510SLisandro Dalcin /* The number of unused PETSc options */ 20052d747510SLisandro Dalcin n = 0; 20062d747510SLisandro Dalcin for (i = 0; i < options->N; i++) { 2007660278c0SBarry Smith if (PetscCIOption(options->names[i])) continue; 20082d747510SLisandro Dalcin if (!options->used[i]) n++; 20092d747510SLisandro Dalcin } 2010ad540459SPierre Jolivet if (N) *N = n; 20119566063dSJacob Faibussowitsch if (names) PetscCall(PetscMalloc1(n, names)); 20129566063dSJacob Faibussowitsch if (values) PetscCall(PetscMalloc1(n, values)); 20132d747510SLisandro Dalcin 20142d747510SLisandro Dalcin n = 0; 20152d747510SLisandro Dalcin if (names || values) { 20162d747510SLisandro Dalcin for (i = 0; i < options->N; i++) { 20172d747510SLisandro Dalcin if (!options->used[i]) { 2018660278c0SBarry Smith if (PetscCIOption(options->names[i])) continue; 20192d747510SLisandro Dalcin if (names) (*names)[n] = options->names[i]; 20202d747510SLisandro Dalcin if (values) (*values)[n] = options->values[i]; 20212d747510SLisandro Dalcin n++; 20222d747510SLisandro Dalcin } 20232d747510SLisandro Dalcin } 20242d747510SLisandro Dalcin } 20253ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 20262d747510SLisandro Dalcin } 20272d747510SLisandro Dalcin 20282d747510SLisandro Dalcin /*@C 2029811af0c4SBarry Smith PetscOptionsLeftRestore - Free memory for the unused PETSc options obtained using `PetscOptionsLeftGet()`. 20302d747510SLisandro Dalcin 20312d747510SLisandro Dalcin Not Collective 20322d747510SLisandro Dalcin 2033d8d19677SJose E. Roman Input Parameters: 2034a2b725a8SWilliam Gropp + options - options database, use NULL for default global database 20352d747510SLisandro Dalcin . names - names of options not used 2036a2b725a8SWilliam Gropp - values - values of options not used 20372d747510SLisandro Dalcin 20382d747510SLisandro Dalcin Level: advanced 20392d747510SLisandro Dalcin 2040db781477SPatrick Sanan .seealso: `PetscOptionsAllUsed()`, `PetscOptionsLeft()`, `PetscOptionsLeftGet()` 20412d747510SLisandro Dalcin @*/ 2042d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsLeftRestore(PetscOptions options, PetscInt *N, char **names[], char **values[]) 2043d71ae5a4SJacob Faibussowitsch { 20442d747510SLisandro Dalcin PetscFunctionBegin; 20452d747510SLisandro Dalcin if (N) PetscValidIntPointer(N, 2); 20462d747510SLisandro Dalcin if (names) PetscValidPointer(names, 3); 20472d747510SLisandro Dalcin if (values) PetscValidPointer(values, 4); 2048ad540459SPierre Jolivet if (N) *N = 0; 20499566063dSJacob Faibussowitsch if (names) PetscCall(PetscFree(*names)); 20509566063dSJacob Faibussowitsch if (values) PetscCall(PetscFree(*values)); 20513ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 20522d747510SLisandro Dalcin } 20532d747510SLisandro Dalcin 20542d747510SLisandro Dalcin /*@C 2055811af0c4SBarry Smith PetscOptionsMonitorDefault - Print all options set value events using the supplied `PetscViewer`. 20562d747510SLisandro Dalcin 2057c3339decSBarry Smith Logically Collective 20582d747510SLisandro Dalcin 20592d747510SLisandro Dalcin Input Parameters: 20602d747510SLisandro Dalcin + name - option name string 20612d747510SLisandro Dalcin . value - option value string 20629355ec05SMatthew G. Knepley . source - The source for the option 20639060e2f9SVaclav Hapla - ctx - an ASCII viewer or NULL 20642d747510SLisandro Dalcin 20652d747510SLisandro Dalcin Level: intermediate 20662d747510SLisandro Dalcin 20679666a313SBarry Smith Notes: 2068811af0c4SBarry Smith If ctx is NULL, `PetscPrintf()` is used. 2069811af0c4SBarry Smith The first MPI rank in the `PetscViewer` viewer actually prints the values, other 20701c9f3c13SBarry Smith processes may have different values set 20711c9f3c13SBarry Smith 2072811af0c4SBarry Smith If `PetscCIEnabled` then do not print the test harness options 2073660278c0SBarry Smith 2074db781477SPatrick Sanan .seealso: `PetscOptionsMonitorSet()` 20752d747510SLisandro Dalcin @*/ 20769355ec05SMatthew G. Knepley PetscErrorCode PetscOptionsMonitorDefault(const char name[], const char value[], PetscOptionSource source, void *ctx) 2077d71ae5a4SJacob Faibussowitsch { 20782d747510SLisandro Dalcin PetscFunctionBegin; 20793ba16761SJacob Faibussowitsch if (PetscCIOption(name)) PetscFunctionReturn(PETSC_SUCCESS); 2080660278c0SBarry Smith 20819060e2f9SVaclav Hapla if (ctx) { 20829060e2f9SVaclav Hapla PetscViewer viewer = (PetscViewer)ctx; 20832d747510SLisandro Dalcin if (!value) { 20849566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "Removing option: %s\n", name)); 20852d747510SLisandro Dalcin } else if (!value[0]) { 20869355ec05SMatthew G. Knepley PetscCall(PetscViewerASCIIPrintf(viewer, "Setting option: %s (no value) (source: %s)\n", name, PetscOptionSources[source])); 20872d747510SLisandro Dalcin } else { 20889355ec05SMatthew G. Knepley PetscCall(PetscViewerASCIIPrintf(viewer, "Setting option: %s = %s (source: %s)\n", name, value, PetscOptionSources[source])); 20892d747510SLisandro Dalcin } 20909060e2f9SVaclav Hapla } else { 20919060e2f9SVaclav Hapla MPI_Comm comm = PETSC_COMM_WORLD; 20929060e2f9SVaclav Hapla if (!value) { 20939566063dSJacob Faibussowitsch PetscCall(PetscPrintf(comm, "Removing option: %s\n", name)); 20949060e2f9SVaclav Hapla } else if (!value[0]) { 20959355ec05SMatthew G. Knepley PetscCall(PetscPrintf(comm, "Setting option: %s (no value) (source: %s)\n", name, PetscOptionSources[source])); 20969060e2f9SVaclav Hapla } else { 20979355ec05SMatthew G. Knepley PetscCall(PetscPrintf(comm, "Setting option: %s = %s (souce: %s)\n", name, value, PetscOptionSources[source])); 20989060e2f9SVaclav Hapla } 20999060e2f9SVaclav Hapla } 21003ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 21012d747510SLisandro Dalcin } 21022d747510SLisandro Dalcin 21032d747510SLisandro Dalcin /*@C 21042d747510SLisandro Dalcin PetscOptionsMonitorSet - Sets an ADDITIONAL function to be called at every method that 21052d747510SLisandro Dalcin modified the PETSc options database. 21062d747510SLisandro Dalcin 21072d747510SLisandro Dalcin Not Collective 21082d747510SLisandro Dalcin 21092d747510SLisandro Dalcin Input Parameters: 21102d747510SLisandro Dalcin + monitor - pointer to function (if this is NULL, it turns off monitoring 21112d747510SLisandro Dalcin . mctx - [optional] context for private data for the 21122d747510SLisandro Dalcin monitor routine (use NULL if no context is desired) 21132d747510SLisandro Dalcin - monitordestroy - [optional] routine that frees monitor context 21142d747510SLisandro Dalcin (may be NULL) 21152d747510SLisandro Dalcin 21162d747510SLisandro Dalcin Calling Sequence of monitor: 21172d747510SLisandro Dalcin $ monitor (const char name[], const char value[], void *mctx) 21182d747510SLisandro Dalcin 21192d747510SLisandro Dalcin + name - option name string 21202d747510SLisandro Dalcin . value - option value string 21219355ec05SMatthew G. Knepley . source - option source 2122811af0c4SBarry Smith - mctx - optional monitoring context, as set by `PetscOptionsMonitorSet()` 21232d747510SLisandro Dalcin 21242d747510SLisandro Dalcin Options Database Keys: 2125811af0c4SBarry Smith See `PetscInitialize()` for options related to option database monitoring. 21262d747510SLisandro Dalcin 21272d747510SLisandro Dalcin Notes: 21282d747510SLisandro Dalcin The default is to do nothing. To print the name and value of options 2129811af0c4SBarry Smith being inserted into the database, use `PetscOptionsMonitorDefault()` as the monitoring routine, 21302d747510SLisandro Dalcin with a null monitoring context. 21312d747510SLisandro Dalcin 21322d747510SLisandro Dalcin Several different monitoring routines may be set by calling 2133811af0c4SBarry Smith `PetscOptionsMonitorSet()` multiple times; all will be called in the 21342d747510SLisandro Dalcin order in which they were set. 21352d747510SLisandro Dalcin 21369060e2f9SVaclav Hapla Level: intermediate 21372d747510SLisandro Dalcin 2138db781477SPatrick Sanan .seealso: `PetscOptionsMonitorDefault()`, `PetscInitialize()` 21392d747510SLisandro Dalcin @*/ 21409355ec05SMatthew G. Knepley PetscErrorCode PetscOptionsMonitorSet(PetscErrorCode (*monitor)(const char name[], const char value[], PetscOptionSource, void *), void *mctx, PetscErrorCode (*monitordestroy)(void **)) 2141d71ae5a4SJacob Faibussowitsch { 21422d747510SLisandro Dalcin PetscOptions options = defaultoptions; 21432d747510SLisandro Dalcin 21442d747510SLisandro Dalcin PetscFunctionBegin; 21453ba16761SJacob Faibussowitsch if (options->monitorCancel) PetscFunctionReturn(PETSC_SUCCESS); 214608401ef6SPierre Jolivet PetscCheck(options->numbermonitors < MAXOPTIONSMONITORS, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Too many PetscOptions monitors set"); 21472d747510SLisandro Dalcin options->monitor[options->numbermonitors] = monitor; 21482d747510SLisandro Dalcin options->monitordestroy[options->numbermonitors] = monitordestroy; 21492d747510SLisandro Dalcin options->monitorcontext[options->numbermonitors++] = (void *)mctx; 21503ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 21512d747510SLisandro Dalcin } 21522d747510SLisandro Dalcin 21532d747510SLisandro Dalcin /* 21542d747510SLisandro Dalcin PetscOptionsStringToBool - Converts string to PetscBool, handles cases like "yes", "no", "true", "false", "0", "1", "off", "on". 215563fe8743SVaclav Hapla Empty string is considered as true. 21562d747510SLisandro Dalcin */ 2157d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsStringToBool(const char value[], PetscBool *a) 2158d71ae5a4SJacob Faibussowitsch { 21592d747510SLisandro Dalcin PetscBool istrue, isfalse; 21602d747510SLisandro Dalcin size_t len; 21612d747510SLisandro Dalcin 21622d747510SLisandro Dalcin PetscFunctionBegin; 216363fe8743SVaclav Hapla /* PetscStrlen() returns 0 for NULL or "" */ 21649566063dSJacob Faibussowitsch PetscCall(PetscStrlen(value, &len)); 21659371c9d4SSatish Balay if (!len) { 21669371c9d4SSatish Balay *a = PETSC_TRUE; 21673ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 21689371c9d4SSatish Balay } 21699566063dSJacob Faibussowitsch PetscCall(PetscStrcasecmp(value, "TRUE", &istrue)); 21709371c9d4SSatish Balay if (istrue) { 21719371c9d4SSatish Balay *a = PETSC_TRUE; 21723ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 21739371c9d4SSatish Balay } 21749566063dSJacob Faibussowitsch PetscCall(PetscStrcasecmp(value, "YES", &istrue)); 21759371c9d4SSatish Balay if (istrue) { 21769371c9d4SSatish Balay *a = PETSC_TRUE; 21773ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 21789371c9d4SSatish Balay } 21799566063dSJacob Faibussowitsch PetscCall(PetscStrcasecmp(value, "1", &istrue)); 21809371c9d4SSatish Balay if (istrue) { 21819371c9d4SSatish Balay *a = PETSC_TRUE; 21823ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 21839371c9d4SSatish Balay } 21849566063dSJacob Faibussowitsch PetscCall(PetscStrcasecmp(value, "on", &istrue)); 21859371c9d4SSatish Balay if (istrue) { 21869371c9d4SSatish Balay *a = PETSC_TRUE; 21873ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 21889371c9d4SSatish Balay } 21899566063dSJacob Faibussowitsch PetscCall(PetscStrcasecmp(value, "FALSE", &isfalse)); 21909371c9d4SSatish Balay if (isfalse) { 21919371c9d4SSatish Balay *a = PETSC_FALSE; 21923ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 21939371c9d4SSatish Balay } 21949566063dSJacob Faibussowitsch PetscCall(PetscStrcasecmp(value, "NO", &isfalse)); 21959371c9d4SSatish Balay if (isfalse) { 21969371c9d4SSatish Balay *a = PETSC_FALSE; 21973ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 21989371c9d4SSatish Balay } 21999566063dSJacob Faibussowitsch PetscCall(PetscStrcasecmp(value, "0", &isfalse)); 22009371c9d4SSatish Balay if (isfalse) { 22019371c9d4SSatish Balay *a = PETSC_FALSE; 22023ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 22039371c9d4SSatish Balay } 22049566063dSJacob Faibussowitsch PetscCall(PetscStrcasecmp(value, "off", &isfalse)); 22059371c9d4SSatish Balay if (isfalse) { 22069371c9d4SSatish Balay *a = PETSC_FALSE; 22073ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 22089371c9d4SSatish Balay } 220998921bdaSJacob Faibussowitsch SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Unknown logical value: %s", value); 22102d747510SLisandro Dalcin } 22112d747510SLisandro Dalcin 22122d747510SLisandro Dalcin /* 22132d747510SLisandro Dalcin PetscOptionsStringToInt - Converts a string to an integer value. Handles special cases such as "default" and "decide" 22142d747510SLisandro Dalcin */ 2215d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsStringToInt(const char name[], PetscInt *a) 2216d71ae5a4SJacob Faibussowitsch { 22172d747510SLisandro Dalcin size_t len; 22182d747510SLisandro Dalcin PetscBool decide, tdefault, mouse; 22192d747510SLisandro Dalcin 22202d747510SLisandro Dalcin PetscFunctionBegin; 22219566063dSJacob Faibussowitsch PetscCall(PetscStrlen(name, &len)); 22225f80ce2aSJacob Faibussowitsch PetscCheck(len, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "character string of length zero has no numerical value"); 22232d747510SLisandro Dalcin 22249566063dSJacob Faibussowitsch PetscCall(PetscStrcasecmp(name, "PETSC_DEFAULT", &tdefault)); 222548a46eb9SPierre Jolivet if (!tdefault) PetscCall(PetscStrcasecmp(name, "DEFAULT", &tdefault)); 22269566063dSJacob Faibussowitsch PetscCall(PetscStrcasecmp(name, "PETSC_DECIDE", &decide)); 222748a46eb9SPierre Jolivet if (!decide) PetscCall(PetscStrcasecmp(name, "DECIDE", &decide)); 22289566063dSJacob Faibussowitsch PetscCall(PetscStrcasecmp(name, "mouse", &mouse)); 22292d747510SLisandro Dalcin 22302d747510SLisandro Dalcin if (tdefault) *a = PETSC_DEFAULT; 22312d747510SLisandro Dalcin else if (decide) *a = PETSC_DECIDE; 22322d747510SLisandro Dalcin else if (mouse) *a = -1; 22332d747510SLisandro Dalcin else { 22342d747510SLisandro Dalcin char *endptr; 22352d747510SLisandro Dalcin long strtolval; 22362d747510SLisandro Dalcin 22372d747510SLisandro Dalcin strtolval = strtol(name, &endptr, 10); 2238cc73adaaSBarry 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); 22392d747510SLisandro Dalcin 22402d747510SLisandro Dalcin #if defined(PETSC_USE_64BIT_INDICES) && defined(PETSC_HAVE_ATOLL) 22412d747510SLisandro Dalcin (void)strtolval; 22422d747510SLisandro Dalcin *a = atoll(name); 22432d747510SLisandro Dalcin #elif defined(PETSC_USE_64BIT_INDICES) && defined(PETSC_HAVE___INT64) 22442d747510SLisandro Dalcin (void)strtolval; 22452d747510SLisandro Dalcin *a = _atoi64(name); 22462d747510SLisandro Dalcin #else 22472d747510SLisandro Dalcin *a = (PetscInt)strtolval; 22482d747510SLisandro Dalcin #endif 22492d747510SLisandro Dalcin } 22503ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 22512d747510SLisandro Dalcin } 22522d747510SLisandro Dalcin 22532d747510SLisandro Dalcin #if defined(PETSC_USE_REAL___FLOAT128) 22542d747510SLisandro Dalcin #include <quadmath.h> 22552d747510SLisandro Dalcin #endif 22562d747510SLisandro Dalcin 2257d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscStrtod(const char name[], PetscReal *a, char **endptr) 2258d71ae5a4SJacob Faibussowitsch { 22592d747510SLisandro Dalcin PetscFunctionBegin; 22602d747510SLisandro Dalcin #if defined(PETSC_USE_REAL___FLOAT128) 22612d747510SLisandro Dalcin *a = strtoflt128(name, endptr); 22622d747510SLisandro Dalcin #else 22632d747510SLisandro Dalcin *a = (PetscReal)strtod(name, endptr); 22642d747510SLisandro Dalcin #endif 22653ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 22662d747510SLisandro Dalcin } 22672d747510SLisandro Dalcin 2268d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscStrtoz(const char name[], PetscScalar *a, char **endptr, PetscBool *isImaginary) 2269d71ae5a4SJacob Faibussowitsch { 22702d747510SLisandro Dalcin PetscBool hasi = PETSC_FALSE; 22712d747510SLisandro Dalcin char *ptr; 22722d747510SLisandro Dalcin PetscReal strtoval; 22732d747510SLisandro Dalcin 22742d747510SLisandro Dalcin PetscFunctionBegin; 22759566063dSJacob Faibussowitsch PetscCall(PetscStrtod(name, &strtoval, &ptr)); 22762d747510SLisandro Dalcin if (ptr == name) { 22772d747510SLisandro Dalcin strtoval = 1.; 22782d747510SLisandro Dalcin hasi = PETSC_TRUE; 22792d747510SLisandro Dalcin if (name[0] == 'i') { 22802d747510SLisandro Dalcin ptr++; 22812d747510SLisandro Dalcin } else if (name[0] == '+' && name[1] == 'i') { 22822d747510SLisandro Dalcin ptr += 2; 22832d747510SLisandro Dalcin } else if (name[0] == '-' && name[1] == 'i') { 22842d747510SLisandro Dalcin strtoval = -1.; 22852d747510SLisandro Dalcin ptr += 2; 22862d747510SLisandro Dalcin } 22872d747510SLisandro Dalcin } else if (*ptr == 'i') { 22882d747510SLisandro Dalcin hasi = PETSC_TRUE; 22892d747510SLisandro Dalcin ptr++; 22902d747510SLisandro Dalcin } 22912d747510SLisandro Dalcin *endptr = ptr; 22922d747510SLisandro Dalcin *isImaginary = hasi; 22932d747510SLisandro Dalcin if (hasi) { 22942d747510SLisandro Dalcin #if !defined(PETSC_USE_COMPLEX) 229598921bdaSJacob Faibussowitsch SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Input string %s contains imaginary but complex not supported ", name); 22962d747510SLisandro Dalcin #else 22972d747510SLisandro Dalcin *a = PetscCMPLX(0., strtoval); 22982d747510SLisandro Dalcin #endif 22992d747510SLisandro Dalcin } else { 23002d747510SLisandro Dalcin *a = strtoval; 23012d747510SLisandro Dalcin } 23023ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 23032d747510SLisandro Dalcin } 23042d747510SLisandro Dalcin 23052d747510SLisandro Dalcin /* 23062d747510SLisandro Dalcin Converts a string to PetscReal value. Handles special cases like "default" and "decide" 23072d747510SLisandro Dalcin */ 2308d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsStringToReal(const char name[], PetscReal *a) 2309d71ae5a4SJacob Faibussowitsch { 23102d747510SLisandro Dalcin size_t len; 23112d747510SLisandro Dalcin PetscBool match; 23122d747510SLisandro Dalcin char *endptr; 23132d747510SLisandro Dalcin 23142d747510SLisandro Dalcin PetscFunctionBegin; 23159566063dSJacob Faibussowitsch PetscCall(PetscStrlen(name, &len)); 231628b400f6SJacob Faibussowitsch PetscCheck(len, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "String of length zero has no numerical value"); 23172d747510SLisandro Dalcin 23189566063dSJacob Faibussowitsch PetscCall(PetscStrcasecmp(name, "PETSC_DEFAULT", &match)); 23199566063dSJacob Faibussowitsch if (!match) PetscCall(PetscStrcasecmp(name, "DEFAULT", &match)); 23209371c9d4SSatish Balay if (match) { 23219371c9d4SSatish Balay *a = PETSC_DEFAULT; 23223ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 23239371c9d4SSatish Balay } 23242d747510SLisandro Dalcin 23259566063dSJacob Faibussowitsch PetscCall(PetscStrcasecmp(name, "PETSC_DECIDE", &match)); 23269566063dSJacob Faibussowitsch if (!match) PetscCall(PetscStrcasecmp(name, "DECIDE", &match)); 23279371c9d4SSatish Balay if (match) { 23289371c9d4SSatish Balay *a = PETSC_DECIDE; 23293ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 23309371c9d4SSatish Balay } 23312d747510SLisandro Dalcin 23329566063dSJacob Faibussowitsch PetscCall(PetscStrtod(name, a, &endptr)); 233339a651e2SJacob Faibussowitsch PetscCheck((size_t)(endptr - name) == len, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Input string %s has no numeric value", name); 23343ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 23352d747510SLisandro Dalcin } 23362d747510SLisandro Dalcin 2337d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsStringToScalar(const char name[], PetscScalar *a) 2338d71ae5a4SJacob Faibussowitsch { 23392d747510SLisandro Dalcin PetscBool imag1; 23402d747510SLisandro Dalcin size_t len; 23412d747510SLisandro Dalcin PetscScalar val = 0.; 23422d747510SLisandro Dalcin char *ptr = NULL; 23432d747510SLisandro Dalcin 23442d747510SLisandro Dalcin PetscFunctionBegin; 23459566063dSJacob Faibussowitsch PetscCall(PetscStrlen(name, &len)); 234628b400f6SJacob Faibussowitsch PetscCheck(len, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "character string of length zero has no numerical value"); 23479566063dSJacob Faibussowitsch PetscCall(PetscStrtoz(name, &val, &ptr, &imag1)); 23482d747510SLisandro Dalcin #if defined(PETSC_USE_COMPLEX) 23492d747510SLisandro Dalcin if ((size_t)(ptr - name) < len) { 23502d747510SLisandro Dalcin PetscBool imag2; 23512d747510SLisandro Dalcin PetscScalar val2; 23522d747510SLisandro Dalcin 23539566063dSJacob Faibussowitsch PetscCall(PetscStrtoz(ptr, &val2, &ptr, &imag2)); 235439a651e2SJacob Faibussowitsch if (imag1) PetscCheck(imag2, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Input string %s: must specify imaginary component second", name); 23552d747510SLisandro Dalcin val = PetscCMPLX(PetscRealPart(val), PetscImaginaryPart(val2)); 23562d747510SLisandro Dalcin } 23572d747510SLisandro Dalcin #endif 235839a651e2SJacob Faibussowitsch PetscCheck((size_t)(ptr - name) == len, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Input string %s has no numeric value ", name); 23592d747510SLisandro Dalcin *a = val; 23603ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 23612d747510SLisandro Dalcin } 23622d747510SLisandro Dalcin 23632d747510SLisandro Dalcin /*@C 23642d747510SLisandro Dalcin PetscOptionsGetBool - Gets the Logical (true or false) value for a particular 23652d747510SLisandro Dalcin option in the database. 2366e5c89e4eSSatish Balay 2367e5c89e4eSSatish Balay Not Collective 2368e5c89e4eSSatish Balay 2369e5c89e4eSSatish Balay Input Parameters: 23705c9cc608SHong Zhang + options - options database, use NULL for default global database 2371c5929fdfSBarry Smith . pre - the string to prepend to the name or NULL 2372e5c89e4eSSatish Balay - name - the option one is seeking 2373e5c89e4eSSatish Balay 2374d8d19677SJose E. Roman Output Parameters: 23752d747510SLisandro Dalcin + ivalue - the logical value to return 2376811af0c4SBarry Smith - set - `PETSC_TRUE` if found, else `PETSC_FALSE` 2377e5c89e4eSSatish Balay 2378e5c89e4eSSatish Balay Level: beginner 2379e5c89e4eSSatish Balay 238095452b02SPatrick Sanan Notes: 2381811af0c4SBarry Smith TRUE, true, YES, yes, nostring, and 1 all translate to `PETSC_TRUE` 2382811af0c4SBarry Smith FALSE, false, NO, no, and 0 all translate to `PETSC_FALSE` 23832d747510SLisandro Dalcin 2384811af0c4SBarry 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 23852d747510SLisandro Dalcin is equivalent to -requested_bool true 23862d747510SLisandro Dalcin 23872d747510SLisandro Dalcin If the user does not supply the option at all ivalue is NOT changed. Thus 23882efd9cb1SBarry Smith you should ALWAYS initialize the ivalue if you access it without first checking if the set flag is true. 23892efd9cb1SBarry Smith 2390db781477SPatrick Sanan .seealso: `PetscOptionsGetReal()`, `PetscOptionsHasName()`, `PetscOptionsGetString()`, 2391db781477SPatrick Sanan `PetscOptionsGetIntArray()`, `PetscOptionsGetRealArray()`, `PetscOptionsGetInt()`, `PetscOptionsBool()`, 2392db781477SPatrick Sanan `PetscOptionsName()`, `PetscOptionsBegin()`, `PetscOptionsEnd()`, `PetscOptionsHeadBegin()`, 2393c2e3fba1SPatrick Sanan `PetscOptionsStringArray()`, `PetscOptionsRealArray()`, `PetscOptionsScalar()`, 2394db781477SPatrick Sanan `PetscOptionsBoolGroupBegin()`, `PetscOptionsBoolGroup()`, `PetscOptionsBoolGroupEnd()`, 2395db781477SPatrick Sanan `PetscOptionsFList()`, `PetscOptionsEList()` 2396e5c89e4eSSatish Balay @*/ 2397d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsGetBool(PetscOptions options, const char pre[], const char name[], PetscBool *ivalue, PetscBool *set) 2398d71ae5a4SJacob Faibussowitsch { 23992d747510SLisandro Dalcin const char *value; 2400ace3abfcSBarry Smith PetscBool flag; 2401e5c89e4eSSatish Balay 2402e5c89e4eSSatish Balay PetscFunctionBegin; 24032d747510SLisandro Dalcin PetscValidCharPointer(name, 3); 2404064a246eSJacob Faibussowitsch if (ivalue) PetscValidBoolPointer(ivalue, 4); 24059566063dSJacob Faibussowitsch PetscCall(PetscOptionsFindPair(options, pre, name, &value, &flag)); 2406e5c89e4eSSatish Balay if (flag) { 240796ef3cdfSSatish Balay if (set) *set = PETSC_TRUE; 24089566063dSJacob Faibussowitsch PetscCall(PetscOptionsStringToBool(value, &flag)); 24092d747510SLisandro Dalcin if (ivalue) *ivalue = flag; 2410e5c89e4eSSatish Balay } else { 241196ef3cdfSSatish Balay if (set) *set = PETSC_FALSE; 2412e5c89e4eSSatish Balay } 24133ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 2414e5c89e4eSSatish Balay } 2415e5c89e4eSSatish Balay 2416e5c89e4eSSatish Balay /*@C 2417e5c89e4eSSatish Balay PetscOptionsGetEList - Puts a list of option values that a single one may be selected from 2418e5c89e4eSSatish Balay 2419e5c89e4eSSatish Balay Not Collective 2420e5c89e4eSSatish Balay 2421e5c89e4eSSatish Balay Input Parameters: 24225c9cc608SHong Zhang + options - options database, use NULL for default global database 2423c5929fdfSBarry Smith . pre - the string to prepend to the name or NULL 2424e5c89e4eSSatish Balay . opt - option name 2425a264d7a6SBarry Smith . list - the possible choices (one of these must be selected, anything else is invalid) 2426a2b725a8SWilliam Gropp - ntext - number of choices 2427e5c89e4eSSatish Balay 2428d8d19677SJose E. Roman Output Parameters: 24292efd9cb1SBarry Smith + value - the index of the value to return (defaults to zero if the option name is given but no choice is listed) 2430811af0c4SBarry Smith - set - `PETSC_TRUE` if found, else `PETSC_FALSE` 2431e5c89e4eSSatish Balay 2432e5c89e4eSSatish Balay Level: intermediate 2433e5c89e4eSSatish Balay 243495452b02SPatrick Sanan Notes: 243595452b02SPatrick Sanan If the user does not supply the option value is NOT changed. Thus 24362efd9cb1SBarry Smith you should ALWAYS initialize the ivalue if you access it without first checking if the set flag is true. 24372efd9cb1SBarry Smith 2438811af0c4SBarry Smith See `PetscOptionsFList()` for when the choices are given in a `PetscFunctionList` 2439e5c89e4eSSatish Balay 2440db781477SPatrick Sanan .seealso: `PetscOptionsGetInt()`, `PetscOptionsGetReal()`, 2441db781477SPatrick Sanan `PetscOptionsHasName()`, `PetscOptionsGetIntArray()`, `PetscOptionsGetRealArray()`, `PetscOptionsBool()`, 2442db781477SPatrick Sanan `PetscOptionsName()`, `PetscOptionsBegin()`, `PetscOptionsEnd()`, `PetscOptionsHeadBegin()`, 2443c2e3fba1SPatrick Sanan `PetscOptionsStringArray()`, `PetscOptionsRealArray()`, `PetscOptionsScalar()`, 2444db781477SPatrick Sanan `PetscOptionsBoolGroupBegin()`, `PetscOptionsBoolGroup()`, `PetscOptionsBoolGroupEnd()`, 2445db781477SPatrick Sanan `PetscOptionsFList()`, `PetscOptionsEList()` 2446e5c89e4eSSatish Balay @*/ 2447d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsGetEList(PetscOptions options, const char pre[], const char opt[], const char *const *list, PetscInt ntext, PetscInt *value, PetscBool *set) 2448d71ae5a4SJacob Faibussowitsch { 244958b0ac4eSStefano Zampini size_t alen, len = 0, tlen = 0; 2450e5c89e4eSSatish Balay char *svalue; 2451ace3abfcSBarry Smith PetscBool aset, flg = PETSC_FALSE; 2452e5c89e4eSSatish Balay PetscInt i; 2453e5c89e4eSSatish Balay 2454e5c89e4eSSatish Balay PetscFunctionBegin; 24552d747510SLisandro Dalcin PetscValidCharPointer(opt, 3); 2456e5c89e4eSSatish Balay for (i = 0; i < ntext; i++) { 24579566063dSJacob Faibussowitsch PetscCall(PetscStrlen(list[i], &alen)); 2458e5c89e4eSSatish Balay if (alen > len) len = alen; 245958b0ac4eSStefano Zampini tlen += len + 1; 2460e5c89e4eSSatish Balay } 2461e5c89e4eSSatish Balay len += 5; /* a little extra space for user mistypes */ 24629566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(len, &svalue)); 24639566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetString(options, pre, opt, svalue, len, &aset)); 2464e5c89e4eSSatish Balay if (aset) { 24659566063dSJacob Faibussowitsch PetscCall(PetscEListFind(ntext, list, svalue, value, &flg)); 246658b0ac4eSStefano Zampini if (!flg) { 2467c6a7a370SJeremy L Thompson char *avail; 246858b0ac4eSStefano Zampini 24699566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(tlen, &avail)); 2470c6a7a370SJeremy L Thompson avail[0] = '\0'; 247158b0ac4eSStefano Zampini for (i = 0; i < ntext; i++) { 2472c6a7a370SJeremy L Thompson PetscCall(PetscStrlcat(avail, list[i], tlen)); 2473c6a7a370SJeremy L Thompson PetscCall(PetscStrlcat(avail, " ", tlen)); 247458b0ac4eSStefano Zampini } 24759566063dSJacob Faibussowitsch PetscCall(PetscStrtolower(avail)); 247698921bdaSJacob Faibussowitsch SETERRQ(PETSC_COMM_SELF, PETSC_ERR_USER, "Unknown option %s for -%s%s. Available options: %s", svalue, pre ? pre : "", opt + 1, avail); 247758b0ac4eSStefano Zampini } 2478fbedd5e0SJed Brown if (set) *set = PETSC_TRUE; 2479a297a907SKarl Rupp } else if (set) *set = PETSC_FALSE; 24809566063dSJacob Faibussowitsch PetscCall(PetscFree(svalue)); 24813ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 2482e5c89e4eSSatish Balay } 2483e5c89e4eSSatish Balay 2484e5c89e4eSSatish Balay /*@C 2485e5c89e4eSSatish Balay PetscOptionsGetEnum - Gets the enum value for a particular option in the database. 2486e5c89e4eSSatish Balay 2487e5c89e4eSSatish Balay Not Collective 2488e5c89e4eSSatish Balay 2489e5c89e4eSSatish Balay Input Parameters: 24905c9cc608SHong Zhang + options - options database, use NULL for default global database 2491c5929fdfSBarry Smith . pre - option prefix or NULL 2492e5c89e4eSSatish Balay . opt - option name 24936b867d5aSJose E. Roman - list - array containing the list of choices, followed by the enum name, followed by the enum prefix, followed by a null 2494e5c89e4eSSatish Balay 2495d8d19677SJose E. Roman Output Parameters: 2496e5c89e4eSSatish Balay + value - the value to return 2497811af0c4SBarry Smith - set - `PETSC_TRUE` if found, else `PETSC_FALSE` 2498e5c89e4eSSatish Balay 2499e5c89e4eSSatish Balay Level: beginner 2500e5c89e4eSSatish Balay 250195452b02SPatrick Sanan Notes: 250295452b02SPatrick Sanan If the user does not supply the option value is NOT changed. Thus 25032efd9cb1SBarry Smith you should ALWAYS initialize the ivalue if you access it without first checking if the set flag is true. 2504e5c89e4eSSatish Balay 2505811af0c4SBarry Smith List is usually something like `PCASMTypes` or some other predefined list of enum names 2506e5c89e4eSSatish Balay 2507db781477SPatrick Sanan .seealso: `PetscOptionsGetReal()`, `PetscOptionsHasName()`, `PetscOptionsGetString()`, `PetscOptionsGetInt()`, 2508db781477SPatrick Sanan `PetscOptionsGetIntArray()`, `PetscOptionsGetRealArray()`, `PetscOptionsBool()` 2509db781477SPatrick Sanan `PetscOptionsInt()`, `PetscOptionsString()`, `PetscOptionsReal()`, `PetscOptionsBool()`, 2510db781477SPatrick Sanan `PetscOptionsName()`, `PetscOptionsBegin()`, `PetscOptionsEnd()`, `PetscOptionsHeadBegin()`, 2511c2e3fba1SPatrick Sanan `PetscOptionsStringArray()`, `PetscOptionsRealArray()`, `PetscOptionsScalar()`, 2512db781477SPatrick Sanan `PetscOptionsBoolGroupBegin()`, `PetscOptionsBoolGroup()`, `PetscOptionsBoolGroupEnd()`, 2513db781477SPatrick Sanan `PetscOptionsFList()`, `PetscOptionsEList()`, `PetscOptionsGetEList()`, `PetscOptionsEnum()` 2514e5c89e4eSSatish Balay @*/ 2515d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsGetEnum(PetscOptions options, const char pre[], const char opt[], const char *const *list, PetscEnum *value, PetscBool *set) 2516d71ae5a4SJacob Faibussowitsch { 251769a24498SJed Brown PetscInt ntext = 0, tval; 2518ace3abfcSBarry Smith PetscBool fset; 2519e5c89e4eSSatish Balay 2520e5c89e4eSSatish Balay PetscFunctionBegin; 25212d747510SLisandro Dalcin PetscValidCharPointer(opt, 3); 2522ad540459SPierre 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"); 252308401ef6SPierre Jolivet PetscCheck(ntext >= 3, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "List argument must have at least two entries: typename and type prefix"); 2524e5c89e4eSSatish Balay ntext -= 3; 25259566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetEList(options, pre, opt, list, ntext, &tval, &fset)); 252669a24498SJed Brown /* with PETSC_USE_64BIT_INDICES sizeof(PetscInt) != sizeof(PetscEnum) */ 2527809ceb46SBarry Smith if (fset) *value = (PetscEnum)tval; 2528809ceb46SBarry Smith if (set) *set = fset; 25293ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 2530e5c89e4eSSatish Balay } 2531e5c89e4eSSatish Balay 2532e5c89e4eSSatish Balay /*@C 25332d747510SLisandro Dalcin PetscOptionsGetInt - Gets the integer value for a particular option in the database. 2534e5c89e4eSSatish Balay 2535e5c89e4eSSatish Balay Not Collective 2536e5c89e4eSSatish Balay 2537e5c89e4eSSatish Balay Input Parameters: 25385c9cc608SHong Zhang + options - options database, use NULL for default global database 2539c5929fdfSBarry Smith . pre - the string to prepend to the name or NULL 2540e5c89e4eSSatish Balay - name - the option one is seeking 2541e5c89e4eSSatish Balay 2542d8d19677SJose E. Roman Output Parameters: 25432d747510SLisandro Dalcin + ivalue - the integer value to return 2544811af0c4SBarry Smith - set - `PETSC_TRUE` if found, else `PETSC_FALSE` 2545e5c89e4eSSatish Balay 2546e5c89e4eSSatish Balay Level: beginner 2547e5c89e4eSSatish Balay 2548e5c89e4eSSatish Balay Notes: 25492d747510SLisandro Dalcin If the user does not supply the option ivalue is NOT changed. Thus 25502efd9cb1SBarry Smith you should ALWAYS initialize the ivalue if you access it without first checking if the set flag is true. 25515c07ccb8SBarry Smith 2552db781477SPatrick Sanan .seealso: `PetscOptionsGetReal()`, `PetscOptionsHasName()`, `PetscOptionsGetString()`, 2553db781477SPatrick Sanan `PetscOptionsGetIntArray()`, `PetscOptionsGetRealArray()`, `PetscOptionsBool()` 2554db781477SPatrick Sanan `PetscOptionsInt()`, `PetscOptionsString()`, `PetscOptionsReal()`, `PetscOptionsBool()`, 2555db781477SPatrick Sanan `PetscOptionsName()`, `PetscOptionsBegin()`, `PetscOptionsEnd()`, `PetscOptionsHeadBegin()`, 2556c2e3fba1SPatrick Sanan `PetscOptionsStringArray()`, `PetscOptionsRealArray()`, `PetscOptionsScalar()`, 2557db781477SPatrick Sanan `PetscOptionsBoolGroupBegin()`, `PetscOptionsBoolGroup()`, `PetscOptionsBoolGroupEnd()`, 2558db781477SPatrick Sanan `PetscOptionsFList()`, `PetscOptionsEList()` 2559e5c89e4eSSatish Balay @*/ 2560d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsGetInt(PetscOptions options, const char pre[], const char name[], PetscInt *ivalue, PetscBool *set) 2561d71ae5a4SJacob Faibussowitsch { 25622d747510SLisandro Dalcin const char *value; 25632d747510SLisandro Dalcin PetscBool flag; 2564e5c89e4eSSatish Balay 2565e5c89e4eSSatish Balay PetscFunctionBegin; 25662d747510SLisandro Dalcin PetscValidCharPointer(name, 3); 25672d747510SLisandro Dalcin PetscValidIntPointer(ivalue, 4); 25689566063dSJacob Faibussowitsch PetscCall(PetscOptionsFindPair(options, pre, name, &value, &flag)); 2569e5c89e4eSSatish Balay if (flag) { 257034a9cc2cSBarry Smith if (!value) { 25712d747510SLisandro Dalcin if (set) *set = PETSC_FALSE; 257234a9cc2cSBarry Smith } else { 25732d747510SLisandro Dalcin if (set) *set = PETSC_TRUE; 25749566063dSJacob Faibussowitsch PetscCall(PetscOptionsStringToInt(value, ivalue)); 2575e5c89e4eSSatish Balay } 2576e5c89e4eSSatish Balay } else { 257796ef3cdfSSatish Balay if (set) *set = PETSC_FALSE; 2578e5c89e4eSSatish Balay } 25793ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 2580e5c89e4eSSatish Balay } 2581e5c89e4eSSatish Balay 2582e2446a98SMatthew Knepley /*@C 2583e5c89e4eSSatish Balay PetscOptionsGetReal - Gets the double precision value for a particular 2584e5c89e4eSSatish Balay option in the database. 2585e5c89e4eSSatish Balay 2586e5c89e4eSSatish Balay Not Collective 2587e5c89e4eSSatish Balay 2588e5c89e4eSSatish Balay Input Parameters: 25895c9cc608SHong Zhang + options - options database, use NULL for default global database 2590c5929fdfSBarry Smith . pre - string to prepend to each name or NULL 2591e5c89e4eSSatish Balay - name - the option one is seeking 2592e5c89e4eSSatish Balay 2593d8d19677SJose E. Roman Output Parameters: 2594e5c89e4eSSatish Balay + dvalue - the double value to return 2595811af0c4SBarry Smith - set - `PETSC_TRUE` if found, `PETSC_FALSE` if not found 2596e5c89e4eSSatish Balay 2597811af0c4SBarry Smith Note: 259895452b02SPatrick Sanan If the user does not supply the option dvalue is NOT changed. Thus 25992efd9cb1SBarry Smith you should ALWAYS initialize the ivalue if you access it without first checking if the set flag is true. 2600e4974155SBarry Smith 2601e5c89e4eSSatish Balay Level: beginner 2602e5c89e4eSSatish Balay 2603db781477SPatrick Sanan .seealso: `PetscOptionsGetInt()`, `PetscOptionsHasName()`, 2604c2e3fba1SPatrick Sanan `PetscOptionsGetString()`, `PetscOptionsGetIntArray()`, `PetscOptionsGetRealArray()`, `PetscOptionsBool()`, 2605db781477SPatrick Sanan `PetscOptionsName()`, `PetscOptionsBegin()`, `PetscOptionsEnd()`, `PetscOptionsHeadBegin()`, 2606c2e3fba1SPatrick Sanan `PetscOptionsStringArray()`, `PetscOptionsRealArray()`, `PetscOptionsScalar()`, 2607db781477SPatrick Sanan `PetscOptionsBoolGroupBegin()`, `PetscOptionsBoolGroup()`, `PetscOptionsBoolGroupEnd()`, 2608db781477SPatrick Sanan `PetscOptionsFList()`, `PetscOptionsEList()` 2609e5c89e4eSSatish Balay @*/ 2610d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsGetReal(PetscOptions options, const char pre[], const char name[], PetscReal *dvalue, PetscBool *set) 2611d71ae5a4SJacob Faibussowitsch { 26122d747510SLisandro Dalcin const char *value; 2613ace3abfcSBarry Smith PetscBool flag; 2614e5c89e4eSSatish Balay 2615e5c89e4eSSatish Balay PetscFunctionBegin; 26162d747510SLisandro Dalcin PetscValidCharPointer(name, 3); 26172d747510SLisandro Dalcin PetscValidRealPointer(dvalue, 4); 26189566063dSJacob Faibussowitsch PetscCall(PetscOptionsFindPair(options, pre, name, &value, &flag)); 2619e5c89e4eSSatish Balay if (flag) { 2620a297a907SKarl Rupp if (!value) { 2621a297a907SKarl Rupp if (set) *set = PETSC_FALSE; 2622a297a907SKarl Rupp } else { 2623a297a907SKarl Rupp if (set) *set = PETSC_TRUE; 26249566063dSJacob Faibussowitsch PetscCall(PetscOptionsStringToReal(value, dvalue)); 2625a297a907SKarl Rupp } 2626e5c89e4eSSatish Balay } else { 262796ef3cdfSSatish Balay if (set) *set = PETSC_FALSE; 2628e5c89e4eSSatish Balay } 26293ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 2630e5c89e4eSSatish Balay } 2631e5c89e4eSSatish Balay 2632e5c89e4eSSatish Balay /*@C 2633e5c89e4eSSatish Balay PetscOptionsGetScalar - Gets the scalar value for a particular 2634e5c89e4eSSatish Balay option in the database. 2635e5c89e4eSSatish Balay 2636e5c89e4eSSatish Balay Not Collective 2637e5c89e4eSSatish Balay 2638e5c89e4eSSatish Balay Input Parameters: 26395c9cc608SHong Zhang + options - options database, use NULL for default global database 2640c5929fdfSBarry Smith . pre - string to prepend to each name or NULL 2641e5c89e4eSSatish Balay - name - the option one is seeking 2642e5c89e4eSSatish Balay 2643d8d19677SJose E. Roman Output Parameters: 2644e5c89e4eSSatish Balay + dvalue - the double value to return 2645811af0c4SBarry Smith - set - `PETSC_TRUE` if found, else `PETSC_FALSE` 2646e5c89e4eSSatish Balay 2647e5c89e4eSSatish Balay Level: beginner 2648e5c89e4eSSatish Balay 2649e5c89e4eSSatish Balay Usage: 2650eb4ae41dSBarry Smith A complex number 2+3i must be specified with NO spaces 2651e5c89e4eSSatish Balay 2652811af0c4SBarry Smith Note: 265395452b02SPatrick Sanan If the user does not supply the option dvalue is NOT changed. Thus 26542efd9cb1SBarry Smith you should ALWAYS initialize the ivalue if you access it without first checking if the set flag is true. 2655e4974155SBarry Smith 2656db781477SPatrick Sanan .seealso: `PetscOptionsGetInt()`, `PetscOptionsHasName()`, 2657db781477SPatrick Sanan `PetscOptionsGetString()`, `PetscOptionsGetIntArray()`, `PetscOptionsGetRealArray()`, `PetscOptionsBool()`, 2658db781477SPatrick Sanan `PetscOptionsName()`, `PetscOptionsBegin()`, `PetscOptionsEnd()`, `PetscOptionsHeadBegin()`, 2659c2e3fba1SPatrick Sanan `PetscOptionsStringArray()`, `PetscOptionsRealArray()`, `PetscOptionsScalar()`, 2660db781477SPatrick Sanan `PetscOptionsBoolGroupBegin()`, `PetscOptionsBoolGroup()`, `PetscOptionsBoolGroupEnd()`, 2661db781477SPatrick Sanan `PetscOptionsFList()`, `PetscOptionsEList()` 2662e5c89e4eSSatish Balay @*/ 2663d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsGetScalar(PetscOptions options, const char pre[], const char name[], PetscScalar *dvalue, PetscBool *set) 2664d71ae5a4SJacob Faibussowitsch { 26652d747510SLisandro Dalcin const char *value; 2666ace3abfcSBarry Smith PetscBool flag; 2667e5c89e4eSSatish Balay 2668e5c89e4eSSatish Balay PetscFunctionBegin; 26692d747510SLisandro Dalcin PetscValidCharPointer(name, 3); 26702d747510SLisandro Dalcin PetscValidScalarPointer(dvalue, 4); 26719566063dSJacob Faibussowitsch PetscCall(PetscOptionsFindPair(options, pre, name, &value, &flag)); 2672e5c89e4eSSatish Balay if (flag) { 2673e5c89e4eSSatish Balay if (!value) { 267496ef3cdfSSatish Balay if (set) *set = PETSC_FALSE; 2675e5c89e4eSSatish Balay } else { 2676e5c89e4eSSatish Balay #if !defined(PETSC_USE_COMPLEX) 26779566063dSJacob Faibussowitsch PetscCall(PetscOptionsStringToReal(value, dvalue)); 2678e5c89e4eSSatish Balay #else 26799566063dSJacob Faibussowitsch PetscCall(PetscOptionsStringToScalar(value, dvalue)); 2680e5c89e4eSSatish Balay #endif 268196ef3cdfSSatish Balay if (set) *set = PETSC_TRUE; 2682e5c89e4eSSatish Balay } 2683e5c89e4eSSatish Balay } else { /* flag */ 268496ef3cdfSSatish Balay if (set) *set = PETSC_FALSE; 2685e5c89e4eSSatish Balay } 26863ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 2687e5c89e4eSSatish Balay } 2688e5c89e4eSSatish Balay 2689e5c89e4eSSatish Balay /*@C 2690e5c89e4eSSatish Balay PetscOptionsGetString - Gets the string value for a particular option in 2691e5c89e4eSSatish Balay the database. 2692e5c89e4eSSatish Balay 2693e5c89e4eSSatish Balay Not Collective 2694e5c89e4eSSatish Balay 2695e5c89e4eSSatish Balay Input Parameters: 26965c9cc608SHong Zhang + options - options database, use NULL for default global database 2697c5929fdfSBarry Smith . pre - string to prepend to name or NULL 2698e5c89e4eSSatish Balay . name - the option one is seeking 2699bcbf2dc5SJed Brown - len - maximum length of the string including null termination 2700e5c89e4eSSatish Balay 2701e5c89e4eSSatish Balay Output Parameters: 2702e5c89e4eSSatish Balay + string - location to copy string 2703811af0c4SBarry Smith - set - `PETSC_TRUE` if found, else `PETSC_FALSE` 2704e5c89e4eSSatish Balay 2705e5c89e4eSSatish Balay Level: beginner 2706e5c89e4eSSatish Balay 2707e5c89e4eSSatish Balay Fortran Note: 2708e5c89e4eSSatish Balay The Fortran interface is slightly different from the C/C++ 2709e5c89e4eSSatish Balay interface (len is not used). Sample usage in Fortran follows 2710e5c89e4eSSatish Balay .vb 2711e5c89e4eSSatish Balay character *20 string 271293e6ba5cSBarry Smith PetscErrorCode ierr 271393e6ba5cSBarry Smith PetscBool set 27141b266c99SBarry Smith call PetscOptionsGetString(PETSC_NULL_OPTIONS,PETSC_NULL_CHARACTER,'-s',string,set,ierr) 2715e5c89e4eSSatish Balay .ve 2716e5c89e4eSSatish Balay 2717811af0c4SBarry Smith Note: 2718811af0c4SBarry 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` 2719e4974155SBarry Smith 27202efd9cb1SBarry Smith If the user does not use the option then the string is not changed. Thus 27212efd9cb1SBarry Smith you should ALWAYS initialize the string if you access it without first checking if the set flag is true. 27222efd9cb1SBarry Smith 2723f3dea69dSBarry Smith Even if the user provided no string (for example -optionname -someotheroption) the flag is set to PETSC_TRUE (and the string is fulled with nulls). 2724f3dea69dSBarry Smith 2725db781477SPatrick Sanan .seealso: `PetscOptionsGetInt()`, `PetscOptionsGetReal()`, 2726db781477SPatrick Sanan `PetscOptionsHasName()`, `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 PetscOptionsGetString(PetscOptions options, const char pre[], const char name[], char string[], size_t len, PetscBool *set) 2733d71ae5a4SJacob Faibussowitsch { 27342d747510SLisandro Dalcin const char *value; 2735ace3abfcSBarry Smith PetscBool flag; 2736e5c89e4eSSatish Balay 2737e5c89e4eSSatish Balay PetscFunctionBegin; 27382d747510SLisandro Dalcin PetscValidCharPointer(name, 3); 27392d747510SLisandro Dalcin PetscValidCharPointer(string, 4); 27409566063dSJacob Faibussowitsch PetscCall(PetscOptionsFindPair(options, pre, name, &value, &flag)); 2741e5c89e4eSSatish Balay if (!flag) { 274296ef3cdfSSatish Balay if (set) *set = PETSC_FALSE; 2743e5c89e4eSSatish Balay } else { 274496ef3cdfSSatish Balay if (set) *set = PETSC_TRUE; 27459566063dSJacob Faibussowitsch if (value) PetscCall(PetscStrncpy(string, value, len)); 27469566063dSJacob Faibussowitsch else PetscCall(PetscArrayzero(string, len)); 2747e5c89e4eSSatish Balay } 27483ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 2749e5c89e4eSSatish Balay } 2750e5c89e4eSSatish Balay 2751d71ae5a4SJacob Faibussowitsch char *PetscOptionsGetStringMatlab(PetscOptions options, const char pre[], const char name[]) 2752d71ae5a4SJacob Faibussowitsch { 27532d747510SLisandro Dalcin const char *value; 275414ce751eSBarry Smith PetscBool flag; 275514ce751eSBarry Smith 275614ce751eSBarry Smith PetscFunctionBegin; 275739a651e2SJacob Faibussowitsch if (PetscOptionsFindPair(options, pre, name, &value, &flag)) PetscFunctionReturn(NULL); 27582d747510SLisandro Dalcin if (flag) PetscFunctionReturn((char *)value); 275939a651e2SJacob Faibussowitsch PetscFunctionReturn(NULL); 276014ce751eSBarry Smith } 276114ce751eSBarry Smith 27622d747510SLisandro Dalcin /*@C 27632d747510SLisandro Dalcin PetscOptionsGetBoolArray - Gets an array of Logical (true or false) values for a particular 2764f1a722f8SMatthew G. Knepley option in the database. The values must be separated with commas with no intervening spaces. 27652d747510SLisandro Dalcin 27662d747510SLisandro Dalcin Not Collective 27672d747510SLisandro Dalcin 27682d747510SLisandro Dalcin Input Parameters: 27692d747510SLisandro Dalcin + options - options database, use NULL for default global database 27702d747510SLisandro Dalcin . pre - string to prepend to each name or NULL 27716b867d5aSJose E. Roman - name - the option one is seeking 27726b867d5aSJose E. Roman 2773d8d19677SJose E. Roman Output Parameters: 27742d747510SLisandro Dalcin + dvalue - the integer values to return 2775f1a722f8SMatthew G. Knepley . nmax - On input maximum number of values to retrieve, on output the actual number of values retrieved 2776811af0c4SBarry Smith - set - `PETSC_TRUE` if found, else `PETSC_FALSE` 27772d747510SLisandro Dalcin 27782d747510SLisandro Dalcin Level: beginner 27792d747510SLisandro Dalcin 2780811af0c4SBarry Smith Note: 2781f1a722f8SMatthew G. Knepley TRUE, true, YES, yes, nostring, and 1 all translate to PETSC_TRUE. FALSE, false, NO, no, and 0 all translate to PETSC_FALSE 27822d747510SLisandro Dalcin 2783db781477SPatrick Sanan .seealso: `PetscOptionsGetInt()`, `PetscOptionsHasName()`, 2784db781477SPatrick Sanan `PetscOptionsGetString()`, `PetscOptionsGetRealArray()`, `PetscOptionsBool()`, 2785db781477SPatrick Sanan `PetscOptionsName()`, `PetscOptionsBegin()`, `PetscOptionsEnd()`, `PetscOptionsHeadBegin()`, 2786c2e3fba1SPatrick Sanan `PetscOptionsStringArray()`, `PetscOptionsRealArray()`, `PetscOptionsScalar()`, 2787db781477SPatrick Sanan `PetscOptionsBoolGroupBegin()`, `PetscOptionsBoolGroup()`, `PetscOptionsBoolGroupEnd()`, 2788db781477SPatrick Sanan `PetscOptionsFList()`, `PetscOptionsEList()` 27892d747510SLisandro Dalcin @*/ 2790d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsGetBoolArray(PetscOptions options, const char pre[], const char name[], PetscBool dvalue[], PetscInt *nmax, PetscBool *set) 2791d71ae5a4SJacob Faibussowitsch { 27922d747510SLisandro Dalcin const char *svalue; 27932d747510SLisandro Dalcin char *value; 27942d747510SLisandro Dalcin PetscInt n = 0; 27952d747510SLisandro Dalcin PetscBool flag; 27962d747510SLisandro Dalcin PetscToken token; 27972d747510SLisandro Dalcin 27982d747510SLisandro Dalcin PetscFunctionBegin; 27992d747510SLisandro Dalcin PetscValidCharPointer(name, 3); 2800064a246eSJacob Faibussowitsch PetscValidBoolPointer(dvalue, 4); 28012d747510SLisandro Dalcin PetscValidIntPointer(nmax, 5); 28022d747510SLisandro Dalcin 28039566063dSJacob Faibussowitsch PetscCall(PetscOptionsFindPair(options, pre, name, &svalue, &flag)); 28049371c9d4SSatish Balay if (!flag || !svalue) { 28059371c9d4SSatish Balay if (set) *set = PETSC_FALSE; 28069371c9d4SSatish Balay *nmax = 0; 28073ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 28089371c9d4SSatish Balay } 28092d747510SLisandro Dalcin if (set) *set = PETSC_TRUE; 28109566063dSJacob Faibussowitsch PetscCall(PetscTokenCreate(svalue, ',', &token)); 28119566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token, &value)); 28122d747510SLisandro Dalcin while (value && n < *nmax) { 28139566063dSJacob Faibussowitsch PetscCall(PetscOptionsStringToBool(value, dvalue)); 28149566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token, &value)); 28152d747510SLisandro Dalcin dvalue++; 28162d747510SLisandro Dalcin n++; 28172d747510SLisandro Dalcin } 28189566063dSJacob Faibussowitsch PetscCall(PetscTokenDestroy(&token)); 28192d747510SLisandro Dalcin *nmax = n; 28203ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 28212d747510SLisandro Dalcin } 28222d747510SLisandro Dalcin 28232d747510SLisandro Dalcin /*@C 28242d747510SLisandro Dalcin PetscOptionsGetEnumArray - Gets an array of enum values for a particular option in the database. 28252d747510SLisandro Dalcin 28262d747510SLisandro Dalcin Not Collective 28272d747510SLisandro Dalcin 28282d747510SLisandro Dalcin Input Parameters: 28292d747510SLisandro Dalcin + options - options database, use NULL for default global database 28302d747510SLisandro Dalcin . pre - option prefix or NULL 28312d747510SLisandro Dalcin . name - option name 28326b867d5aSJose E. Roman - list - array containing the list of choices, followed by the enum name, followed by the enum prefix, followed by a null 28336b867d5aSJose E. Roman 28342d747510SLisandro Dalcin Output Parameters: 28352d747510SLisandro Dalcin + ivalue - the enum values to return 2836f1a722f8SMatthew G. Knepley . nmax - On input maximum number of values to retrieve, on output the actual number of values retrieved 2837811af0c4SBarry Smith - set - `PETSC_TRUE` if found, else `PETSC_FALSE` 28382d747510SLisandro Dalcin 28392d747510SLisandro Dalcin Level: beginner 28402d747510SLisandro Dalcin 28412d747510SLisandro Dalcin Notes: 28422d747510SLisandro Dalcin The array must be passed as a comma separated list. 28432d747510SLisandro Dalcin 28442d747510SLisandro Dalcin There must be no intervening spaces between the values. 28452d747510SLisandro Dalcin 2846811af0c4SBarry Smith list is usually something like `PCASMTypes` or some other predefined list of enum names. 28472d747510SLisandro Dalcin 2848db781477SPatrick Sanan .seealso: `PetscOptionsGetReal()`, `PetscOptionsHasName()`, `PetscOptionsGetString()`, `PetscOptionsGetInt()`, 2849db781477SPatrick Sanan `PetscOptionsGetEnum()`, `PetscOptionsGetIntArray()`, `PetscOptionsGetRealArray()`, `PetscOptionsBool()` 2850db781477SPatrick Sanan `PetscOptionsInt()`, `PetscOptionsString()`, `PetscOptionsReal()`, `PetscOptionsBool()`, `PetscOptionsName()`, 2851c2e3fba1SPatrick Sanan `PetscOptionsBegin()`, `PetscOptionsEnd()`, `PetscOptionsHeadBegin()`, `PetscOptionsStringArray()`, `PetscOptionsRealArray()`, 2852db781477SPatrick Sanan `PetscOptionsScalar()`, `PetscOptionsBoolGroupBegin()`, `PetscOptionsBoolGroup()`, `PetscOptionsBoolGroupEnd()`, 2853db781477SPatrick Sanan `PetscOptionsFList()`, `PetscOptionsEList()`, `PetscOptionsGetEList()`, `PetscOptionsEnum()` 28542d747510SLisandro Dalcin @*/ 2855d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsGetEnumArray(PetscOptions options, const char pre[], const char name[], const char *const *list, PetscEnum ivalue[], PetscInt *nmax, PetscBool *set) 2856d71ae5a4SJacob Faibussowitsch { 28572d747510SLisandro Dalcin const char *svalue; 28582d747510SLisandro Dalcin char *value; 28592d747510SLisandro Dalcin PetscInt n = 0; 28602d747510SLisandro Dalcin PetscEnum evalue; 28612d747510SLisandro Dalcin PetscBool flag; 28622d747510SLisandro Dalcin PetscToken token; 28632d747510SLisandro Dalcin 28642d747510SLisandro Dalcin PetscFunctionBegin; 28652d747510SLisandro Dalcin PetscValidCharPointer(name, 3); 28662d747510SLisandro Dalcin PetscValidPointer(list, 4); 28672d747510SLisandro Dalcin PetscValidPointer(ivalue, 5); 28682d747510SLisandro Dalcin PetscValidIntPointer(nmax, 6); 28692d747510SLisandro Dalcin 28709566063dSJacob Faibussowitsch PetscCall(PetscOptionsFindPair(options, pre, name, &svalue, &flag)); 28719371c9d4SSatish Balay if (!flag || !svalue) { 28729371c9d4SSatish Balay if (set) *set = PETSC_FALSE; 28739371c9d4SSatish Balay *nmax = 0; 28743ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 28759371c9d4SSatish Balay } 28762d747510SLisandro Dalcin if (set) *set = PETSC_TRUE; 28779566063dSJacob Faibussowitsch PetscCall(PetscTokenCreate(svalue, ',', &token)); 28789566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token, &value)); 28792d747510SLisandro Dalcin while (value && n < *nmax) { 28809566063dSJacob Faibussowitsch PetscCall(PetscEnumFind(list, value, &evalue, &flag)); 288128b400f6SJacob Faibussowitsch PetscCheck(flag, PETSC_COMM_SELF, PETSC_ERR_USER, "Unknown enum value '%s' for -%s%s", svalue, pre ? pre : "", name + 1); 28822d747510SLisandro Dalcin ivalue[n++] = evalue; 28839566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token, &value)); 28842d747510SLisandro Dalcin } 28859566063dSJacob Faibussowitsch PetscCall(PetscTokenDestroy(&token)); 28862d747510SLisandro Dalcin *nmax = n; 28873ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 28882d747510SLisandro Dalcin } 28892d747510SLisandro Dalcin 28902d747510SLisandro Dalcin /*@C 2891f1a722f8SMatthew G. Knepley PetscOptionsGetIntArray - Gets an array of integer values for a particular option in the database. 28922d747510SLisandro Dalcin 28932d747510SLisandro Dalcin Not Collective 28942d747510SLisandro Dalcin 28952d747510SLisandro Dalcin Input Parameters: 28962d747510SLisandro Dalcin + options - options database, use NULL for default global database 28972d747510SLisandro Dalcin . pre - string to prepend to each name or NULL 28986b867d5aSJose E. Roman - name - the option one is seeking 28996b867d5aSJose E. Roman 2900d8d19677SJose E. Roman Output Parameters: 29012d747510SLisandro Dalcin + ivalue - the integer values to return 2902f1a722f8SMatthew G. Knepley . nmax - On input maximum number of values to retrieve, on output the actual number of values retrieved 2903811af0c4SBarry Smith - set - `PETSC_TRUE` if found, else `PETSC_FALSE` 29042d747510SLisandro Dalcin 29052d747510SLisandro Dalcin Level: beginner 29062d747510SLisandro Dalcin 29072d747510SLisandro Dalcin Notes: 29082d747510SLisandro Dalcin The array can be passed as 2909811af0c4SBarry Smith + a comma separated list - 0,1,2,3,4,5,6,7 2910811af0c4SBarry Smith . a range (start\-end+1) - 0-8 2911811af0c4SBarry Smith . a range with given increment (start\-end+1:inc) - 0-7:2 2912811af0c4SBarry Smith - a combination of values and ranges separated by commas - 0,1-8,8-15:2 29132d747510SLisandro Dalcin 29142d747510SLisandro Dalcin There must be no intervening spaces between the values. 29152d747510SLisandro Dalcin 2916db781477SPatrick Sanan .seealso: `PetscOptionsGetInt()`, `PetscOptionsHasName()`, 2917db781477SPatrick Sanan `PetscOptionsGetString()`, `PetscOptionsGetRealArray()`, `PetscOptionsBool()`, 2918db781477SPatrick Sanan `PetscOptionsName()`, `PetscOptionsBegin()`, `PetscOptionsEnd()`, `PetscOptionsHeadBegin()`, 2919c2e3fba1SPatrick Sanan `PetscOptionsStringArray()`, `PetscOptionsRealArray()`, `PetscOptionsScalar()`, 2920db781477SPatrick Sanan `PetscOptionsBoolGroupBegin()`, `PetscOptionsBoolGroup()`, `PetscOptionsBoolGroupEnd()`, 2921db781477SPatrick Sanan `PetscOptionsFList()`, `PetscOptionsEList()` 29222d747510SLisandro Dalcin @*/ 2923d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsGetIntArray(PetscOptions options, const char pre[], const char name[], PetscInt ivalue[], PetscInt *nmax, PetscBool *set) 2924d71ae5a4SJacob Faibussowitsch { 29252d747510SLisandro Dalcin const char *svalue; 29262d747510SLisandro Dalcin char *value; 29272d747510SLisandro Dalcin PetscInt n = 0, i, j, start, end, inc, nvalues; 29282d747510SLisandro Dalcin size_t len; 29292d747510SLisandro Dalcin PetscBool flag, foundrange; 29302d747510SLisandro Dalcin PetscToken token; 29312d747510SLisandro Dalcin 29322d747510SLisandro Dalcin PetscFunctionBegin; 29332d747510SLisandro Dalcin PetscValidCharPointer(name, 3); 29342d747510SLisandro Dalcin PetscValidIntPointer(ivalue, 4); 29352d747510SLisandro Dalcin PetscValidIntPointer(nmax, 5); 29362d747510SLisandro Dalcin 29379566063dSJacob Faibussowitsch PetscCall(PetscOptionsFindPair(options, pre, name, &svalue, &flag)); 29389371c9d4SSatish Balay if (!flag || !svalue) { 29399371c9d4SSatish Balay if (set) *set = PETSC_FALSE; 29409371c9d4SSatish Balay *nmax = 0; 29413ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 29429371c9d4SSatish Balay } 29432d747510SLisandro Dalcin if (set) *set = PETSC_TRUE; 29449566063dSJacob Faibussowitsch PetscCall(PetscTokenCreate(svalue, ',', &token)); 29459566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token, &value)); 29462d747510SLisandro Dalcin while (value && n < *nmax) { 29472d747510SLisandro Dalcin /* look for form d-D where d and D are integers */ 29482d747510SLisandro Dalcin foundrange = PETSC_FALSE; 29499566063dSJacob Faibussowitsch PetscCall(PetscStrlen(value, &len)); 29502d747510SLisandro Dalcin if (value[0] == '-') i = 2; 29512d747510SLisandro Dalcin else i = 1; 29522d747510SLisandro Dalcin for (; i < (int)len; i++) { 29532d747510SLisandro Dalcin if (value[i] == '-') { 2954cc73adaaSBarry Smith PetscCheck(i != (int)len - 1, PETSC_COMM_SELF, PETSC_ERR_USER, "Error in %" PetscInt_FMT "-th array entry %s", n, value); 29552d747510SLisandro Dalcin value[i] = 0; 29562d747510SLisandro Dalcin 29579566063dSJacob Faibussowitsch PetscCall(PetscOptionsStringToInt(value, &start)); 29582d747510SLisandro Dalcin inc = 1; 29592d747510SLisandro Dalcin j = i + 1; 29602d747510SLisandro Dalcin for (; j < (int)len; j++) { 29612d747510SLisandro Dalcin if (value[j] == ':') { 29622d747510SLisandro Dalcin value[j] = 0; 29632d747510SLisandro Dalcin 29649566063dSJacob Faibussowitsch PetscCall(PetscOptionsStringToInt(value + j + 1, &inc)); 296508401ef6SPierre Jolivet PetscCheck(inc > 0, PETSC_COMM_SELF, PETSC_ERR_USER, "Error in %" PetscInt_FMT "-th array entry,%s cannot have negative increment", n, value + j + 1); 29662d747510SLisandro Dalcin break; 29672d747510SLisandro Dalcin } 29682d747510SLisandro Dalcin } 29699566063dSJacob Faibussowitsch PetscCall(PetscOptionsStringToInt(value + i + 1, &end)); 297008401ef6SPierre Jolivet PetscCheck(end > start, PETSC_COMM_SELF, PETSC_ERR_USER, "Error in %" PetscInt_FMT "-th array entry, %s-%s cannot have decreasing list", n, value, value + i + 1); 29712d747510SLisandro Dalcin nvalues = (end - start) / inc + (end - start) % inc; 2972cc73adaaSBarry 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); 29732d747510SLisandro Dalcin for (; start < end; start += inc) { 29749371c9d4SSatish Balay *ivalue = start; 29759371c9d4SSatish Balay ivalue++; 29769371c9d4SSatish Balay n++; 29772d747510SLisandro Dalcin } 29782d747510SLisandro Dalcin foundrange = PETSC_TRUE; 29792d747510SLisandro Dalcin break; 29802d747510SLisandro Dalcin } 29812d747510SLisandro Dalcin } 29822d747510SLisandro Dalcin if (!foundrange) { 29839566063dSJacob Faibussowitsch PetscCall(PetscOptionsStringToInt(value, ivalue)); 29842d747510SLisandro Dalcin ivalue++; 29852d747510SLisandro Dalcin n++; 29862d747510SLisandro Dalcin } 29879566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token, &value)); 29882d747510SLisandro Dalcin } 29899566063dSJacob Faibussowitsch PetscCall(PetscTokenDestroy(&token)); 29902d747510SLisandro Dalcin *nmax = n; 29913ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 29922d747510SLisandro Dalcin } 29932d747510SLisandro Dalcin 29942d747510SLisandro Dalcin /*@C 29952d747510SLisandro Dalcin PetscOptionsGetRealArray - Gets an array of double precision values for a 2996f1a722f8SMatthew G. Knepley particular option in the database. The values must be separated with commas with no intervening spaces. 29972d747510SLisandro Dalcin 29982d747510SLisandro Dalcin Not Collective 29992d747510SLisandro Dalcin 30002d747510SLisandro Dalcin Input Parameters: 30012d747510SLisandro Dalcin + options - options database, use NULL for default global database 30022d747510SLisandro Dalcin . pre - string to prepend to each name or NULL 30036b867d5aSJose E. Roman - name - the option one is seeking 30046b867d5aSJose E. Roman 30052d747510SLisandro Dalcin Output Parameters: 30062d747510SLisandro Dalcin + dvalue - the double values to return 3007f1a722f8SMatthew G. Knepley . nmax - On input maximum number of values to retrieve, on output the actual number of values retrieved 3008811af0c4SBarry Smith - set - `PETSC_TRUE` if found, else `PETSC_FALSE` 30092d747510SLisandro Dalcin 30102d747510SLisandro Dalcin Level: beginner 30112d747510SLisandro Dalcin 3012db781477SPatrick Sanan .seealso: `PetscOptionsGetInt()`, `PetscOptionsHasName()`, 3013db781477SPatrick Sanan `PetscOptionsGetString()`, `PetscOptionsGetIntArray()`, `PetscOptionsBool()`, 3014db781477SPatrick Sanan `PetscOptionsName()`, `PetscOptionsBegin()`, `PetscOptionsEnd()`, `PetscOptionsHeadBegin()`, 3015c2e3fba1SPatrick Sanan `PetscOptionsStringArray()`, `PetscOptionsRealArray()`, `PetscOptionsScalar()`, 3016db781477SPatrick Sanan `PetscOptionsBoolGroupBegin()`, `PetscOptionsBoolGroup()`, `PetscOptionsBoolGroupEnd()`, 3017db781477SPatrick Sanan `PetscOptionsFList()`, `PetscOptionsEList()` 30182d747510SLisandro Dalcin @*/ 3019d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsGetRealArray(PetscOptions options, const char pre[], const char name[], PetscReal dvalue[], PetscInt *nmax, PetscBool *set) 3020d71ae5a4SJacob Faibussowitsch { 30212d747510SLisandro Dalcin const char *svalue; 30222d747510SLisandro Dalcin char *value; 30232d747510SLisandro Dalcin PetscInt n = 0; 30242d747510SLisandro Dalcin PetscBool flag; 30252d747510SLisandro Dalcin PetscToken token; 30262d747510SLisandro Dalcin 30272d747510SLisandro Dalcin PetscFunctionBegin; 30282d747510SLisandro Dalcin PetscValidCharPointer(name, 3); 30292d747510SLisandro Dalcin PetscValidRealPointer(dvalue, 4); 30302d747510SLisandro Dalcin PetscValidIntPointer(nmax, 5); 30312d747510SLisandro Dalcin 30329566063dSJacob Faibussowitsch PetscCall(PetscOptionsFindPair(options, pre, name, &svalue, &flag)); 30339371c9d4SSatish Balay if (!flag || !svalue) { 30349371c9d4SSatish Balay if (set) *set = PETSC_FALSE; 30359371c9d4SSatish Balay *nmax = 0; 30363ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 30379371c9d4SSatish Balay } 30382d747510SLisandro Dalcin if (set) *set = PETSC_TRUE; 30399566063dSJacob Faibussowitsch PetscCall(PetscTokenCreate(svalue, ',', &token)); 30409566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token, &value)); 30412d747510SLisandro Dalcin while (value && n < *nmax) { 30429566063dSJacob Faibussowitsch PetscCall(PetscOptionsStringToReal(value, dvalue++)); 30439566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token, &value)); 30442d747510SLisandro Dalcin n++; 30452d747510SLisandro Dalcin } 30469566063dSJacob Faibussowitsch PetscCall(PetscTokenDestroy(&token)); 30472d747510SLisandro Dalcin *nmax = n; 30483ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 30492d747510SLisandro Dalcin } 30502d747510SLisandro Dalcin 30512d747510SLisandro Dalcin /*@C 30522d747510SLisandro Dalcin PetscOptionsGetScalarArray - Gets an array of scalars for a 3053f1a722f8SMatthew G. Knepley particular option in the database. The values must be separated with commas with no intervening spaces. 30542d747510SLisandro Dalcin 30552d747510SLisandro Dalcin Not Collective 30562d747510SLisandro Dalcin 30572d747510SLisandro Dalcin Input Parameters: 30582d747510SLisandro Dalcin + options - options database, use NULL for default global database 30592d747510SLisandro Dalcin . pre - string to prepend to each name or NULL 30606b867d5aSJose E. Roman - name - the option one is seeking 30616b867d5aSJose E. Roman 30622d747510SLisandro Dalcin Output Parameters: 30632d747510SLisandro Dalcin + dvalue - the scalar values to return 3064f1a722f8SMatthew G. Knepley . nmax - On input maximum number of values to retrieve, on output the actual number of values retrieved 3065811af0c4SBarry Smith - set - `PETSC_TRUE` if found, else `PETSC_FALSE` 30662d747510SLisandro Dalcin 30672d747510SLisandro Dalcin Level: beginner 30682d747510SLisandro Dalcin 3069db781477SPatrick Sanan .seealso: `PetscOptionsGetInt()`, `PetscOptionsHasName()`, 3070db781477SPatrick Sanan `PetscOptionsGetString()`, `PetscOptionsGetIntArray()`, `PetscOptionsBool()`, 3071db781477SPatrick Sanan `PetscOptionsName()`, `PetscOptionsBegin()`, `PetscOptionsEnd()`, `PetscOptionsHeadBegin()`, 3072c2e3fba1SPatrick Sanan `PetscOptionsStringArray()`, `PetscOptionsRealArray()`, `PetscOptionsScalar()`, 3073db781477SPatrick Sanan `PetscOptionsBoolGroupBegin()`, `PetscOptionsBoolGroup()`, `PetscOptionsBoolGroupEnd()`, 3074db781477SPatrick Sanan `PetscOptionsFList()`, `PetscOptionsEList()` 30752d747510SLisandro Dalcin @*/ 3076d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsGetScalarArray(PetscOptions options, const char pre[], const char name[], PetscScalar dvalue[], PetscInt *nmax, PetscBool *set) 3077d71ae5a4SJacob Faibussowitsch { 30782d747510SLisandro Dalcin const char *svalue; 30792d747510SLisandro Dalcin char *value; 30802d747510SLisandro Dalcin PetscInt n = 0; 30812d747510SLisandro Dalcin PetscBool flag; 30822d747510SLisandro Dalcin PetscToken token; 30832d747510SLisandro Dalcin 30842d747510SLisandro Dalcin PetscFunctionBegin; 30852d747510SLisandro Dalcin PetscValidCharPointer(name, 3); 3086064a246eSJacob Faibussowitsch PetscValidScalarPointer(dvalue, 4); 30872d747510SLisandro Dalcin PetscValidIntPointer(nmax, 5); 30882d747510SLisandro Dalcin 30899566063dSJacob Faibussowitsch PetscCall(PetscOptionsFindPair(options, pre, name, &svalue, &flag)); 30909371c9d4SSatish Balay if (!flag || !svalue) { 30919371c9d4SSatish Balay if (set) *set = PETSC_FALSE; 30929371c9d4SSatish Balay *nmax = 0; 30933ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 30949371c9d4SSatish Balay } 30952d747510SLisandro Dalcin if (set) *set = PETSC_TRUE; 30969566063dSJacob Faibussowitsch PetscCall(PetscTokenCreate(svalue, ',', &token)); 30979566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token, &value)); 30982d747510SLisandro Dalcin while (value && n < *nmax) { 30999566063dSJacob Faibussowitsch PetscCall(PetscOptionsStringToScalar(value, dvalue++)); 31009566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token, &value)); 31012d747510SLisandro Dalcin n++; 31022d747510SLisandro Dalcin } 31039566063dSJacob Faibussowitsch PetscCall(PetscTokenDestroy(&token)); 31042d747510SLisandro Dalcin *nmax = n; 31053ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 31062d747510SLisandro Dalcin } 310714ce751eSBarry Smith 3108e5c89e4eSSatish Balay /*@C 3109e5c89e4eSSatish Balay PetscOptionsGetStringArray - Gets an array of string values for a particular 3110f1a722f8SMatthew G. Knepley option in the database. The values must be separated with commas with no intervening spaces. 3111e5c89e4eSSatish Balay 3112cf53795eSBarry Smith Not Collective; No Fortran Support 3113e5c89e4eSSatish Balay 3114e5c89e4eSSatish Balay Input Parameters: 31155c9cc608SHong Zhang + options - options database, use NULL for default global database 3116c5929fdfSBarry Smith . pre - string to prepend to name or NULL 31176b867d5aSJose E. Roman - name - the option one is seeking 31186b867d5aSJose E. Roman 3119e7b76fa7SPatrick Sanan Output Parameters: 3120e5c89e4eSSatish Balay + strings - location to copy strings 3121f1a722f8SMatthew G. Knepley . nmax - On input maximum number of strings, on output the actual number of strings found 3122811af0c4SBarry Smith - set - `PETSC_TRUE` if found, else `PETSC_FALSE` 3123e5c89e4eSSatish Balay 3124e5c89e4eSSatish Balay Level: beginner 3125e5c89e4eSSatish Balay 3126e5c89e4eSSatish Balay Notes: 3127e7b76fa7SPatrick Sanan The nmax parameter is used for both input and output. 3128e7b76fa7SPatrick Sanan 3129e5c89e4eSSatish Balay The user should pass in an array of pointers to char, to hold all the 3130e5c89e4eSSatish Balay strings returned by this function. 3131e5c89e4eSSatish Balay 3132e5c89e4eSSatish Balay The user is responsible for deallocating the strings that are 3133cf53795eSBarry Smith returned. 3134e5c89e4eSSatish Balay 3135db781477SPatrick Sanan .seealso: `PetscOptionsGetInt()`, `PetscOptionsGetReal()`, 3136db781477SPatrick Sanan `PetscOptionsHasName()`, `PetscOptionsGetIntArray()`, `PetscOptionsGetRealArray()`, `PetscOptionsBool()`, 3137db781477SPatrick Sanan `PetscOptionsName()`, `PetscOptionsBegin()`, `PetscOptionsEnd()`, `PetscOptionsHeadBegin()`, 3138c2e3fba1SPatrick Sanan `PetscOptionsStringArray()`, `PetscOptionsRealArray()`, `PetscOptionsScalar()`, 3139db781477SPatrick Sanan `PetscOptionsBoolGroupBegin()`, `PetscOptionsBoolGroup()`, `PetscOptionsBoolGroupEnd()`, 3140db781477SPatrick Sanan `PetscOptionsFList()`, `PetscOptionsEList()` 3141e5c89e4eSSatish Balay @*/ 3142d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsGetStringArray(PetscOptions options, const char pre[], const char name[], char *strings[], PetscInt *nmax, PetscBool *set) 3143d71ae5a4SJacob Faibussowitsch { 31442d747510SLisandro Dalcin const char *svalue; 3145e5c89e4eSSatish Balay char *value; 31462d747510SLisandro Dalcin PetscInt n = 0; 3147ace3abfcSBarry Smith PetscBool flag; 31489c9d3cfdSBarry Smith PetscToken token; 3149e5c89e4eSSatish Balay 3150e5c89e4eSSatish Balay PetscFunctionBegin; 31512d747510SLisandro Dalcin PetscValidCharPointer(name, 3); 31522d747510SLisandro Dalcin PetscValidPointer(strings, 4); 31532d747510SLisandro Dalcin PetscValidIntPointer(nmax, 5); 3154e5c89e4eSSatish Balay 31559566063dSJacob Faibussowitsch PetscCall(PetscOptionsFindPair(options, pre, name, &svalue, &flag)); 31569371c9d4SSatish Balay if (!flag || !svalue) { 31579371c9d4SSatish Balay if (set) *set = PETSC_FALSE; 31589371c9d4SSatish Balay *nmax = 0; 31593ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 31609371c9d4SSatish Balay } 31612d747510SLisandro Dalcin if (set) *set = PETSC_TRUE; 31629566063dSJacob Faibussowitsch PetscCall(PetscTokenCreate(svalue, ',', &token)); 31639566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token, &value)); 31642d747510SLisandro Dalcin while (value && n < *nmax) { 31659566063dSJacob Faibussowitsch PetscCall(PetscStrallocpy(value, &strings[n])); 31669566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token, &value)); 3167e5c89e4eSSatish Balay n++; 3168e5c89e4eSSatish Balay } 31699566063dSJacob Faibussowitsch PetscCall(PetscTokenDestroy(&token)); 3170e5c89e4eSSatish Balay *nmax = n; 31713ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 3172e5c89e4eSSatish Balay } 317306824ed3SPatrick Sanan 317406824ed3SPatrick Sanan /*@C 317506824ed3SPatrick Sanan PetscOptionsDeprecated - mark an option as deprecated, optionally replacing it with a new one 317606824ed3SPatrick Sanan 317706824ed3SPatrick Sanan Prints a deprecation warning, unless an option is supplied to suppress. 317806824ed3SPatrick Sanan 31791c9f3c13SBarry Smith Logically Collective 318006824ed3SPatrick Sanan 318106824ed3SPatrick Sanan Input Parameters: 31829503aa97SPatrick Sanan + pre - string to prepend to name or NULL 318306824ed3SPatrick Sanan . oldname - the old, deprecated option 318406824ed3SPatrick Sanan . newname - the new option, or NULL if option is purely removed 31859f3a6782SPatrick Sanan . version - a string describing the version of first deprecation, e.g. "3.9" 31869f3a6782SPatrick Sanan - info - additional information string, or NULL. 318706824ed3SPatrick Sanan 3188811af0c4SBarry Smith Options Database Key: 318906824ed3SPatrick Sanan . -options_suppress_deprecated_warnings - do not print deprecation warnings 319006824ed3SPatrick Sanan 319106824ed3SPatrick Sanan Notes: 3192811af0c4SBarry Smith Must be called between `PetscOptionsBegin()` (or `PetscObjectOptionsBegin()`) and `PetscOptionsEnd()`. 319335cb6cd3SPierre Jolivet Only the process of rank zero that owns the `PetscOptionsItems` are argument (managed by `PetscOptionsBegin()` or 3194811af0c4SBarry Smith `PetscObjectOptionsBegin()` prints the information 3195b40114eaSPatrick Sanan If newname is provided, the old option is replaced. Otherwise, it remains 3196b40114eaSPatrick Sanan in the options database. 31979f3a6782SPatrick Sanan If an option is not replaced, the info argument should be used to advise the user 31989f3a6782SPatrick Sanan on how to proceed. 31999f3a6782SPatrick Sanan There is a limit on the length of the warning printed, so very long strings 32009f3a6782SPatrick Sanan provided as info may be truncated. 320106824ed3SPatrick Sanan 320206824ed3SPatrick Sanan Level: developer 320306824ed3SPatrick Sanan 3204db781477SPatrick Sanan .seealso: `PetscOptionsBegin()`, `PetscOptionsEnd()`, `PetscOptionsScalar()`, `PetscOptionsBool()`, `PetscOptionsString()`, `PetscOptionsSetValue()` 320506824ed3SPatrick Sanan @*/ 3206d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsDeprecated_Private(PetscOptionItems *PetscOptionsObject, const char oldname[], const char newname[], const char version[], const char info[]) 3207d71ae5a4SJacob Faibussowitsch { 320806824ed3SPatrick Sanan PetscBool found, quiet; 320906824ed3SPatrick Sanan const char *value; 321006824ed3SPatrick Sanan const char *const quietopt = "-options_suppress_deprecated_warnings"; 32119f3a6782SPatrick Sanan char msg[4096]; 3212b0bdc838SStefano Zampini char *prefix = NULL; 3213b0bdc838SStefano Zampini PetscOptions options = NULL; 3214b0bdc838SStefano Zampini MPI_Comm comm = PETSC_COMM_SELF; 321506824ed3SPatrick Sanan 321606824ed3SPatrick Sanan PetscFunctionBegin; 321706824ed3SPatrick Sanan PetscValidCharPointer(oldname, 2); 321806824ed3SPatrick Sanan PetscValidCharPointer(version, 4); 3219b0bdc838SStefano Zampini if (PetscOptionsObject) { 3220b0bdc838SStefano Zampini prefix = PetscOptionsObject->prefix; 3221b0bdc838SStefano Zampini options = PetscOptionsObject->options; 3222b0bdc838SStefano Zampini comm = PetscOptionsObject->comm; 3223b0bdc838SStefano Zampini } 32249566063dSJacob Faibussowitsch PetscCall(PetscOptionsFindPair(options, prefix, oldname, &value, &found)); 322506824ed3SPatrick Sanan if (found) { 322606824ed3SPatrick Sanan if (newname) { 32271baa6e33SBarry Smith if (prefix) PetscCall(PetscOptionsPrefixPush(options, prefix)); 32289566063dSJacob Faibussowitsch PetscCall(PetscOptionsSetValue(options, newname, value)); 32291baa6e33SBarry Smith if (prefix) PetscCall(PetscOptionsPrefixPop(options)); 32309566063dSJacob Faibussowitsch PetscCall(PetscOptionsClearValue(options, oldname)); 3231b40114eaSPatrick Sanan } 323206824ed3SPatrick Sanan quiet = PETSC_FALSE; 32339566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetBool(options, NULL, quietopt, &quiet, NULL)); 323406824ed3SPatrick Sanan if (!quiet) { 3235c6a7a370SJeremy L Thompson PetscCall(PetscStrncpy(msg, "** PETSc DEPRECATION WARNING ** : the option ", sizeof(msg))); 3236c6a7a370SJeremy L Thompson PetscCall(PetscStrlcat(msg, oldname, sizeof(msg))); 3237c6a7a370SJeremy L Thompson PetscCall(PetscStrlcat(msg, " is deprecated as of version ", sizeof(msg))); 3238c6a7a370SJeremy L Thompson PetscCall(PetscStrlcat(msg, version, sizeof(msg))); 3239c6a7a370SJeremy L Thompson PetscCall(PetscStrlcat(msg, " and will be removed in a future release.", sizeof(msg))); 324006824ed3SPatrick Sanan if (newname) { 3241c6a7a370SJeremy L Thompson PetscCall(PetscStrlcat(msg, " Please use the option ", sizeof(msg))); 3242c6a7a370SJeremy L Thompson PetscCall(PetscStrlcat(msg, newname, sizeof(msg))); 3243c6a7a370SJeremy L Thompson PetscCall(PetscStrlcat(msg, " instead.", sizeof(msg))); 324406824ed3SPatrick Sanan } 32459f3a6782SPatrick Sanan if (info) { 3246c6a7a370SJeremy L Thompson PetscCall(PetscStrlcat(msg, " ", sizeof(msg))); 3247c6a7a370SJeremy L Thompson PetscCall(PetscStrlcat(msg, info, sizeof(msg))); 32489f3a6782SPatrick Sanan } 3249c6a7a370SJeremy L Thompson PetscCall(PetscStrlcat(msg, " (Silence this warning with ", sizeof(msg))); 3250c6a7a370SJeremy L Thompson PetscCall(PetscStrlcat(msg, quietopt, sizeof(msg))); 3251c6a7a370SJeremy L Thompson PetscCall(PetscStrlcat(msg, ")\n", sizeof(msg))); 32529566063dSJacob Faibussowitsch PetscCall(PetscPrintf(comm, "%s", msg)); 325306824ed3SPatrick Sanan } 325406824ed3SPatrick Sanan } 32553ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 325606824ed3SPatrick Sanan } 3257