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 */ 349fbee547SJacob Faibussowitsch static inline int PetscToLower(int c) 352d747510SLisandro Dalcin { 362d747510SLisandro Dalcin return ((c >= 'A') & (c <= 'Z')) ? c + 'a' - 'A' : c; 372d747510SLisandro Dalcin } 382d747510SLisandro Dalcin 392d747510SLisandro Dalcin /* Bob Jenkins's one at a time hash function (case-insensitive) */ 409fbee547SJacob Faibussowitsch static inline unsigned int PetscOptHash(const char key[]) 412d747510SLisandro Dalcin { 422d747510SLisandro Dalcin unsigned int hash = 0; 432d747510SLisandro Dalcin while (*key) { 442d747510SLisandro Dalcin hash += PetscToLower(*key++); 452d747510SLisandro Dalcin hash += hash << 10; 462d747510SLisandro Dalcin hash ^= hash >> 6; 472d747510SLisandro Dalcin } 482d747510SLisandro Dalcin hash += hash << 3; 492d747510SLisandro Dalcin hash ^= hash >> 11; 502d747510SLisandro Dalcin hash += hash << 15; 512d747510SLisandro Dalcin return hash; 522d747510SLisandro Dalcin } 532d747510SLisandro Dalcin 549fbee547SJacob Faibussowitsch static inline int PetscOptEqual(const char a[],const char b[]) 552d747510SLisandro Dalcin { 562d747510SLisandro Dalcin return !PetscOptNameCmp(a,b); 572d747510SLisandro Dalcin } 582d747510SLisandro Dalcin 592d747510SLisandro Dalcin KHASH_INIT(HO, kh_cstr_t, int, 1, PetscOptHash, PetscOptEqual) 602d747510SLisandro Dalcin 61e5c89e4eSSatish Balay /* 623fc1eb6aSBarry Smith This table holds all the options set by the user. For simplicity, we use a static size database 63e5c89e4eSSatish Balay */ 64c5c1f447SLisandro Dalcin #define MAXOPTNAME PETSC_MAX_OPTION_NAME 65e5c89e4eSSatish Balay #define MAXOPTIONS 512 66e5c89e4eSSatish Balay #define MAXALIASES 25 6774e0666dSJed Brown #define MAXPREFIXES 25 682d747510SLisandro Dalcin #define MAXOPTIONSMONITORS 5 69e5c89e4eSSatish Balay 704416b707SBarry Smith struct _n_PetscOptions { 713de2bfdfSBarry Smith PetscOptions previous; 722d747510SLisandro Dalcin int N; /* number of options */ 732d747510SLisandro Dalcin char *names[MAXOPTIONS]; /* option names */ 742d747510SLisandro Dalcin char *values[MAXOPTIONS]; /* option values */ 752d747510SLisandro Dalcin PetscBool used[MAXOPTIONS]; /* flag option use */ 76c5b5d8d5SVaclav Hapla PetscBool precedentProcessed; 77081c24baSBoyana Norris 782d747510SLisandro Dalcin /* Hash table */ 792d747510SLisandro Dalcin khash_t(HO) *ht; 802d747510SLisandro Dalcin 812d747510SLisandro Dalcin /* Prefixes */ 822d747510SLisandro Dalcin int prefixind; 832d747510SLisandro Dalcin int prefixstack[MAXPREFIXES]; 842d747510SLisandro Dalcin char prefix[MAXOPTNAME]; 852d747510SLisandro Dalcin 862d747510SLisandro Dalcin /* Aliases */ 872d747510SLisandro Dalcin int Naliases; /* number or aliases */ 882d747510SLisandro Dalcin char *aliases1[MAXALIASES]; /* aliased */ 892d747510SLisandro Dalcin char *aliases2[MAXALIASES]; /* aliasee */ 902d747510SLisandro Dalcin 912d747510SLisandro Dalcin /* Help */ 922d747510SLisandro Dalcin PetscBool help; /* flag whether "-help" is in the database */ 93d314f959SVaclav Hapla PetscBool help_intro; /* flag whether "-help intro" is in the database */ 942d747510SLisandro Dalcin 952d747510SLisandro Dalcin /* Monitors */ 96c5b5d8d5SVaclav Hapla PetscBool monitorFromOptions, monitorCancel; 97081c24baSBoyana Norris PetscErrorCode (*monitor[MAXOPTIONSMONITORS])(const char[],const char[],void*); /* returns control to user after */ 98c2efdce3SBarry Smith PetscErrorCode (*monitordestroy[MAXOPTIONSMONITORS])(void**); /* */ 99081c24baSBoyana Norris void *monitorcontext[MAXOPTIONSMONITORS]; /* to pass arbitrary user data into monitor */ 100081c24baSBoyana Norris PetscInt numbermonitors; /* to, for instance, detect options being set */ 1014416b707SBarry Smith }; 102e5c89e4eSSatish Balay 103b4205f0bSBarry Smith static PetscOptions defaultoptions = NULL; /* the options database routines query this object for options */ 1042d747510SLisandro Dalcin 105c5b5d8d5SVaclav Hapla /* list of options which preceed others, i.e., are processed in PetscOptionsProcessPrecedentFlags() */ 106*660278c0SBarry Smith /* these options can only take boolean values, the code will crash if given a non-boolean value */ 107*660278c0SBarry Smith static const char *precedentOptions[] = {"-petsc_ci","-options_monitor","-options_monitor_cancel","-help","-skip_petscrc"}; 108*660278c0SBarry Smith enum PetscPrecedentOption {PO_CI_ENABLE,PO_OPTIONS_MONITOR,PO_OPTIONS_MONITOR_CANCEL,PO_HELP,PO_SKIP_PETSCRC,PO_NUM}; 109c5b5d8d5SVaclav Hapla 110c5b5d8d5SVaclav Hapla static PetscErrorCode PetscOptionsSetValue_Private(PetscOptions,const char[],const char[],int*); 111c5b5d8d5SVaclav Hapla 112081c24baSBoyana Norris /* 113081c24baSBoyana Norris Options events monitor 114081c24baSBoyana Norris */ 1152d747510SLisandro Dalcin static PetscErrorCode PetscOptionsMonitor(PetscOptions options,const char name[],const char value[]) 116e5c89e4eSSatish Balay { 117e5c89e4eSSatish Balay PetscFunctionBegin; 118c5b5d8d5SVaclav Hapla if (!value) value = ""; 1199566063dSJacob Faibussowitsch if (options->monitorFromOptions) PetscCall(PetscOptionsMonitorDefault(name,value,NULL)); 1209566063dSJacob Faibussowitsch for (PetscInt i=0; i<options->numbermonitors; i++) PetscCall((*options->monitor[i])(name,value,options->monitorcontext[i])); 121e5c89e4eSSatish Balay PetscFunctionReturn(0); 122e5c89e4eSSatish Balay } 123e5c89e4eSSatish Balay 1242d747510SLisandro Dalcin /*@ 1252d747510SLisandro Dalcin PetscOptionsCreate - Creates an empty options database. 126e5c89e4eSSatish Balay 1271c9f3c13SBarry Smith Logically collective 1281c9f3c13SBarry Smith 129e5c89e4eSSatish Balay Output Parameter: 1302d747510SLisandro Dalcin . options - Options database object 131e5c89e4eSSatish Balay 132e5c89e4eSSatish Balay Level: advanced 133e5c89e4eSSatish Balay 1341c9f3c13SBarry Smith Developer Note: We may want eventually to pass a MPI_Comm to determine the ownership of the object 1351c9f3c13SBarry Smith 136db781477SPatrick Sanan .seealso: `PetscOptionsDestroy()`, `PetscOptionsPush()`, `PetscOptionsPop()`, `PetscOptionsInsert()`, `PetscOptionsSetValue()` 137e5c89e4eSSatish Balay @*/ 1382d747510SLisandro Dalcin PetscErrorCode PetscOptionsCreate(PetscOptions *options) 1392d747510SLisandro Dalcin { 14039a651e2SJacob Faibussowitsch PetscFunctionBegin; 14139a651e2SJacob Faibussowitsch PetscValidPointer(options,1); 1422d747510SLisandro Dalcin *options = (PetscOptions)calloc(1,sizeof(**options)); 14339a651e2SJacob Faibussowitsch PetscCheck(*options,PETSC_COMM_SELF,PETSC_ERR_MEM,"Failed to allocate the options database"); 14439a651e2SJacob Faibussowitsch PetscFunctionReturn(0); 1452d747510SLisandro Dalcin } 1462d747510SLisandro Dalcin 1472d747510SLisandro Dalcin /*@ 1482d747510SLisandro Dalcin PetscOptionsDestroy - Destroys an option database. 1492d747510SLisandro Dalcin 1501c9f3c13SBarry Smith Logically collective on whatever communicator was associated with the call to PetscOptionsCreate() 1511c9f3c13SBarry Smith 1522d747510SLisandro Dalcin Input Parameter: 1532d747510SLisandro Dalcin . options - the PetscOptions object 1542d747510SLisandro Dalcin 1553de2bfdfSBarry Smith Level: advanced 1562d747510SLisandro Dalcin 157db781477SPatrick Sanan .seealso: `PetscOptionsInsert()`, `PetscOptionsPush()`, `PetscOptionsPop()`, `PetscOptionsInsert()`, `PetscOptionsSetValue()` 1582d747510SLisandro Dalcin @*/ 1592d747510SLisandro Dalcin PetscErrorCode PetscOptionsDestroy(PetscOptions *options) 160e5c89e4eSSatish Balay { 161362febeeSStefano Zampini PetscFunctionBegin; 16239a651e2SJacob Faibussowitsch if (!*options) PetscFunctionReturn(0); 1635f80ce2aSJacob 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()"); 1649566063dSJacob Faibussowitsch PetscCall(PetscOptionsClear(*options)); 1652d747510SLisandro Dalcin /* XXX what about monitors ? */ 1662800570dSLisandro Dalcin free(*options); 1672d747510SLisandro Dalcin *options = NULL; 168e5c89e4eSSatish Balay PetscFunctionReturn(0); 169e5c89e4eSSatish Balay } 170e5c89e4eSSatish Balay 1712d747510SLisandro Dalcin /* 1722d747510SLisandro Dalcin PetscOptionsCreateDefault - Creates the default global options database 1732d747510SLisandro Dalcin */ 1742d747510SLisandro Dalcin PetscErrorCode PetscOptionsCreateDefault(void) 175e5c89e4eSSatish Balay { 17639a651e2SJacob Faibussowitsch PetscFunctionBegin; 1779566063dSJacob Faibussowitsch if (PetscUnlikely(!defaultoptions)) PetscCall(PetscOptionsCreate(&defaultoptions)); 17839a651e2SJacob Faibussowitsch PetscFunctionReturn(0); 1792d747510SLisandro Dalcin } 1802d747510SLisandro Dalcin 181b4205f0bSBarry Smith /*@ 182b4205f0bSBarry Smith PetscOptionsPush - Push a new PetscOptions object as the default provider of options 1831c9f3c13SBarry Smith Allows using different parts of a code to use different options databases 184b4205f0bSBarry Smith 185b4205f0bSBarry Smith Logically Collective 186b4205f0bSBarry Smith 187b4205f0bSBarry Smith Input Parameter: 188b4205f0bSBarry Smith . opt - the options obtained with PetscOptionsCreate() 189b4205f0bSBarry Smith 190b4205f0bSBarry Smith Notes: 191b4205f0bSBarry Smith Use PetscOptionsPop() to return to the previous default options database 1921c9f3c13SBarry Smith 1939666a313SBarry Smith The collectivity of this routine is complex; only the MPI processes that call this routine will 1941c9f3c13SBarry Smith have the affect of these options. If some processes that create objects call this routine and others do 1951c9f3c13SBarry Smith not the code may fail in complicated ways because the same parallel solvers may incorrectly use different options 1961c9f3c13SBarry Smith on different ranks. 197b4205f0bSBarry Smith 1983de2bfdfSBarry Smith Level: advanced 1993de2bfdfSBarry Smith 200db781477SPatrick Sanan .seealso: `PetscOptionsPop()`, `PetscOptionsCreate()`, `PetscOptionsInsert()`, `PetscOptionsSetValue()`, `PetscOptionsLeft()` 201b4205f0bSBarry Smith 202b4205f0bSBarry Smith @*/ 203b4205f0bSBarry Smith PetscErrorCode PetscOptionsPush(PetscOptions opt) 204b4205f0bSBarry Smith { 205b4205f0bSBarry Smith PetscFunctionBegin; 2069566063dSJacob Faibussowitsch PetscCall(PetscOptionsCreateDefault()); 207b4205f0bSBarry Smith opt->previous = defaultoptions; 208b4205f0bSBarry Smith defaultoptions = opt; 209b4205f0bSBarry Smith PetscFunctionReturn(0); 210b4205f0bSBarry Smith } 211b4205f0bSBarry Smith 212b4205f0bSBarry Smith /*@ 213b4205f0bSBarry Smith PetscOptionsPop - Pop the most recent PetscOptionsPush() to return to the previous default options 214b4205f0bSBarry Smith 2151c9f3c13SBarry Smith Logically collective on whatever communicator was associated with the call to PetscOptionsCreate() 216b4205f0bSBarry Smith 217b4205f0bSBarry Smith Notes: 218b4205f0bSBarry Smith Use PetscOptionsPop() to return to the previous default options database 219b4205f0bSBarry Smith Allows using different parts of a code to use different options databases 220b4205f0bSBarry Smith 2213de2bfdfSBarry Smith Level: advanced 2223de2bfdfSBarry Smith 223db781477SPatrick Sanan .seealso: `PetscOptionsPop()`, `PetscOptionsCreate()`, `PetscOptionsInsert()`, `PetscOptionsSetValue()`, `PetscOptionsLeft()` 224b4205f0bSBarry Smith 225b4205f0bSBarry Smith @*/ 226b4205f0bSBarry Smith PetscErrorCode PetscOptionsPop(void) 227b4205f0bSBarry Smith { 2283de2bfdfSBarry Smith PetscOptions current = defaultoptions; 2293de2bfdfSBarry Smith 230b4205f0bSBarry Smith PetscFunctionBegin; 23128b400f6SJacob Faibussowitsch PetscCheck(defaultoptions,PETSC_COMM_SELF,PETSC_ERR_PLIB,"Missing default options"); 23228b400f6SJacob Faibussowitsch PetscCheck(defaultoptions->previous,PETSC_COMM_SELF,PETSC_ERR_PLIB,"PetscOptionsPop() called too many times"); 233b4205f0bSBarry Smith defaultoptions = defaultoptions->previous; 2343de2bfdfSBarry Smith current->previous = NULL; 235b4205f0bSBarry Smith PetscFunctionReturn(0); 236b4205f0bSBarry Smith } 237b4205f0bSBarry Smith 2382d747510SLisandro Dalcin /* 2392d747510SLisandro Dalcin PetscOptionsDestroyDefault - Destroys the default global options database 2402d747510SLisandro Dalcin */ 2412d747510SLisandro Dalcin PetscErrorCode PetscOptionsDestroyDefault(void) 2422d747510SLisandro Dalcin { 24339a651e2SJacob Faibussowitsch PetscFunctionBegin; 24439a651e2SJacob Faibussowitsch if (!defaultoptions) PetscFunctionReturn(0); 2453de2bfdfSBarry Smith /* Destroy any options that the user forgot to pop */ 2463de2bfdfSBarry Smith while (defaultoptions->previous) { 24739a651e2SJacob Faibussowitsch PetscOptions tmp = defaultoptions; 24839a651e2SJacob Faibussowitsch 2499566063dSJacob Faibussowitsch PetscCall(PetscOptionsPop()); 2509566063dSJacob Faibussowitsch PetscCall(PetscOptionsDestroy(&tmp)); 2513de2bfdfSBarry Smith } 2529566063dSJacob Faibussowitsch PetscCall(PetscOptionsDestroy(&defaultoptions)); 25339a651e2SJacob Faibussowitsch PetscFunctionReturn(0); 254e5c89e4eSSatish Balay } 255e5c89e4eSSatish Balay 25694ef8ddeSSatish Balay /*@C 2577cd08cecSJed Brown PetscOptionsValidKey - PETSc Options database keys must begin with one or two dashes (-) followed by a letter. 2583fc1eb6aSBarry Smith 259447722d5SBarry Smith Not collective 2601c9f3c13SBarry Smith 2613fc1eb6aSBarry Smith Input Parameter: 2622d747510SLisandro Dalcin . key - string to check if valid 2633fc1eb6aSBarry Smith 2643fc1eb6aSBarry Smith Output Parameter: 2652d747510SLisandro Dalcin . valid - PETSC_TRUE if a valid key 2663fc1eb6aSBarry Smith 267f6680f47SSatish Balay Level: intermediate 2683fc1eb6aSBarry Smith @*/ 2692d747510SLisandro Dalcin PetscErrorCode PetscOptionsValidKey(const char key[],PetscBool *valid) 27096fc60bcSBarry Smith { 271f603b5e9SToby Isaac char *ptr; 2727c5db45bSBarry Smith 27396fc60bcSBarry Smith PetscFunctionBegin; 2742d747510SLisandro Dalcin if (key) PetscValidCharPointer(key,1); 275dadcf809SJacob Faibussowitsch PetscValidBoolPointer(valid,2); 2762d747510SLisandro Dalcin *valid = PETSC_FALSE; 2772d747510SLisandro Dalcin if (!key) PetscFunctionReturn(0); 2782d747510SLisandro Dalcin if (key[0] != '-') PetscFunctionReturn(0); 2792d747510SLisandro Dalcin if (key[1] == '-') key++; 280c850d057SPierre Jolivet if (!isalpha((int)key[1])) PetscFunctionReturn(0); 2812d747510SLisandro Dalcin (void) strtod(key,&ptr); 282c850d057SPierre Jolivet if (ptr != key && !(*ptr == '_' || isalnum((int)*ptr))) PetscFunctionReturn(0); 2832d747510SLisandro Dalcin *valid = PETSC_TRUE; 28496fc60bcSBarry Smith PetscFunctionReturn(0); 28596fc60bcSBarry Smith } 28696fc60bcSBarry Smith 287e5c89e4eSSatish Balay /*@C 288e5c89e4eSSatish Balay PetscOptionsInsertString - Inserts options into the database from a string 289e5c89e4eSSatish Balay 2901c9f3c13SBarry Smith Logically Collective 291e5c89e4eSSatish Balay 292d8d19677SJose E. Roman Input Parameters: 293080f0011SToby Isaac + options - options object 294080f0011SToby Isaac - in_str - string that contains options separated by blanks 295e5c89e4eSSatish Balay 296e5c89e4eSSatish Balay Level: intermediate 297e5c89e4eSSatish Balay 2989666a313SBarry Smith The collectivity of this routine is complex; only the MPI processes that call this routine will 2991c9f3c13SBarry Smith have the affect of these options. If some processes that create objects call this routine and others do 3001c9f3c13SBarry Smith not the code may fail in complicated ways because the same parallel solvers may incorrectly use different options 3011c9f3c13SBarry Smith on different ranks. 3021c9f3c13SBarry Smith 303e5c89e4eSSatish Balay Contributed by Boyana Norris 304e5c89e4eSSatish Balay 305db781477SPatrick Sanan .seealso: `PetscOptionsSetValue()`, `PetscOptionsView()`, `PetscOptionsHasName()`, `PetscOptionsGetInt()`, 306db781477SPatrick Sanan `PetscOptionsGetReal()`, `PetscOptionsGetString()`, `PetscOptionsGetIntArray()`, `PetscOptionsBool()`, 307db781477SPatrick Sanan `PetscOptionsName()`, `PetscOptionsBegin()`, `PetscOptionsEnd()`, `PetscOptionsHeadBegin()`, 308c2e3fba1SPatrick Sanan `PetscOptionsStringArray()`, `PetscOptionsRealArray()`, `PetscOptionsScalar()`, 309db781477SPatrick Sanan `PetscOptionsBoolGroupBegin()`, `PetscOptionsBoolGroup()`, `PetscOptionsBoolGroupEnd()`, 310db781477SPatrick Sanan `PetscOptionsFList()`, `PetscOptionsEList()`, `PetscOptionsInsertFile()` 311e5c89e4eSSatish Balay @*/ 312c5929fdfSBarry Smith PetscErrorCode PetscOptionsInsertString(PetscOptions options,const char in_str[]) 313e5c89e4eSSatish Balay { 314d06005cbSLisandro Dalcin MPI_Comm comm = PETSC_COMM_SELF; 315d06005cbSLisandro Dalcin char *first,*second; 3169c9d3cfdSBarry Smith PetscToken token; 317e5c89e4eSSatish Balay 318e5c89e4eSSatish Balay PetscFunctionBegin; 3199566063dSJacob Faibussowitsch PetscCall(PetscTokenCreate(in_str,' ',&token)); 3209566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token,&first)); 32196fc60bcSBarry Smith while (first) { 322d06005cbSLisandro Dalcin PetscBool isfile,isfileyaml,isstringyaml,ispush,ispop,key; 3239566063dSJacob Faibussowitsch PetscCall(PetscStrcasecmp(first,"-options_file",&isfile)); 3249566063dSJacob Faibussowitsch PetscCall(PetscStrcasecmp(first,"-options_file_yaml",&isfileyaml)); 3259566063dSJacob Faibussowitsch PetscCall(PetscStrcasecmp(first,"-options_string_yaml",&isstringyaml)); 3269566063dSJacob Faibussowitsch PetscCall(PetscStrcasecmp(first,"-prefix_push",&ispush)); 3279566063dSJacob Faibussowitsch PetscCall(PetscStrcasecmp(first,"-prefix_pop",&ispop)); 3289566063dSJacob Faibussowitsch PetscCall(PetscOptionsValidKey(first,&key)); 329d06005cbSLisandro Dalcin if (!key) { 3309566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token,&first)); 331d06005cbSLisandro Dalcin } else if (isfile) { 3329566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token,&second)); 3339566063dSJacob Faibussowitsch PetscCall(PetscOptionsInsertFile(comm,options,second,PETSC_TRUE)); 3349566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token,&first)); 335d06005cbSLisandro Dalcin } else if (isfileyaml) { 3369566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token,&second)); 3379566063dSJacob Faibussowitsch PetscCall(PetscOptionsInsertFileYAML(comm,options,second,PETSC_TRUE)); 3389566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token,&first)); 339d06005cbSLisandro Dalcin } else if (isstringyaml) { 3409566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token,&second)); 3419566063dSJacob Faibussowitsch PetscCall(PetscOptionsInsertStringYAML(options,second)); 3429566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token,&first)); 343d06005cbSLisandro Dalcin } else if (ispush) { 3449566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token,&second)); 3459566063dSJacob Faibussowitsch PetscCall(PetscOptionsPrefixPush(options,second)); 3469566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token,&first)); 3479db968c8SJed Brown } else if (ispop) { 3489566063dSJacob Faibussowitsch PetscCall(PetscOptionsPrefixPop(options)); 3499566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token,&first)); 350d06005cbSLisandro Dalcin } else { 3519566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token,&second)); 3529566063dSJacob Faibussowitsch PetscCall(PetscOptionsValidKey(second,&key)); 35396fc60bcSBarry Smith if (!key) { 3549566063dSJacob Faibussowitsch PetscCall(PetscOptionsSetValue(options,first,second)); 3559566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token,&first)); 35696fc60bcSBarry Smith } else { 3579566063dSJacob Faibussowitsch PetscCall(PetscOptionsSetValue(options,first,NULL)); 35896fc60bcSBarry Smith first = second; 35996fc60bcSBarry Smith } 360e5c89e4eSSatish Balay } 361e5c89e4eSSatish Balay } 3629566063dSJacob Faibussowitsch PetscCall(PetscTokenDestroy(&token)); 363e5c89e4eSSatish Balay PetscFunctionReturn(0); 364e5c89e4eSSatish Balay } 365e5c89e4eSSatish Balay 3663fc1eb6aSBarry Smith /* 3673fc1eb6aSBarry Smith Returns a line (ended by a \n, \r or null character of any length. Result should be freed with free() 3683fc1eb6aSBarry Smith */ 3695fa91da5SBarry Smith static char *Petscgetline(FILE * f) 3705fa91da5SBarry Smith { 3715fa91da5SBarry Smith size_t size = 0; 3725fa91da5SBarry Smith size_t len = 0; 3735fa91da5SBarry Smith size_t last = 0; 3740298fd71SBarry Smith char *buf = NULL; 3755fa91da5SBarry Smith 37602c9f0b5SLisandro Dalcin if (feof(f)) return NULL; 3775fa91da5SBarry Smith do { 3785fa91da5SBarry Smith size += 1024; /* BUFSIZ is defined as "the optimal read size for this platform" */ 3796e0c8459SSatish Balay buf = (char*)realloc((void*)buf,size); /* realloc(NULL,n) is the same as malloc(n) */ 3805fa91da5SBarry Smith /* Actually do the read. Note that fgets puts a terminal '\0' on the 3815fa91da5SBarry Smith end of the string, so we make sure we overwrite this */ 382e86f3e45SDave May if (!fgets(buf+len,1024,f)) buf[len]=0; 3835fa91da5SBarry Smith PetscStrlen(buf,&len); 3845fa91da5SBarry Smith last = len - 1; 3855fa91da5SBarry Smith } while (!feof(f) && buf[last] != '\n' && buf[last] != '\r'); 38608ac41f7SSatish Balay if (len) return buf; 3875fa91da5SBarry Smith free(buf); 38802c9f0b5SLisandro Dalcin return NULL; 3895fa91da5SBarry Smith } 3905fa91da5SBarry Smith 391be10d61cSLisandro Dalcin static PetscErrorCode PetscOptionsFilename(MPI_Comm comm,const char file[],char filename[PETSC_MAX_PATH_LEN],PetscBool *yaml) 392be10d61cSLisandro Dalcin { 393be10d61cSLisandro Dalcin char fname[PETSC_MAX_PATH_LEN+8],path[PETSC_MAX_PATH_LEN+8],*tail; 394e5c89e4eSSatish Balay 395be10d61cSLisandro Dalcin PetscFunctionBegin; 396362febeeSStefano Zampini *yaml = PETSC_FALSE; 3979566063dSJacob Faibussowitsch PetscCall(PetscStrreplace(comm,file,fname,sizeof(fname))); 3989566063dSJacob Faibussowitsch PetscCall(PetscFixFilename(fname,path)); 3999566063dSJacob Faibussowitsch PetscCall(PetscStrendswith(path,":yaml",yaml)); 400be10d61cSLisandro Dalcin if (*yaml) { 4019566063dSJacob Faibussowitsch PetscCall(PetscStrrchr(path,':',&tail)); 402be10d61cSLisandro Dalcin tail[-1] = 0; /* remove ":yaml" suffix from path */ 403be10d61cSLisandro Dalcin } 4049566063dSJacob Faibussowitsch PetscCall(PetscStrncpy(filename,path,PETSC_MAX_PATH_LEN)); 405a1d2f846SLisandro Dalcin /* check for standard YAML and JSON filename extensions */ 4069566063dSJacob Faibussowitsch if (!*yaml) PetscCall(PetscStrendswith(filename,".yaml",yaml)); 4079566063dSJacob Faibussowitsch if (!*yaml) PetscCall(PetscStrendswith(filename,".yml", yaml)); 4089566063dSJacob Faibussowitsch if (!*yaml) PetscCall(PetscStrendswith(filename,".json",yaml)); 409a1d2f846SLisandro Dalcin if (!*yaml) { /* check file contents */ 410a1d2f846SLisandro Dalcin PetscMPIInt rank; 4119566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(comm,&rank)); 412dd400576SPatrick Sanan if (rank == 0) { 413a1d2f846SLisandro Dalcin FILE *fh = fopen(filename,"r"); 414a1d2f846SLisandro Dalcin if (fh) { 415a1d2f846SLisandro Dalcin char buf[6] = ""; 416a1d2f846SLisandro Dalcin if (fread(buf,1,6,fh) > 0) { 4179566063dSJacob Faibussowitsch PetscCall(PetscStrncmp(buf,"%YAML ",6,yaml)); /* check for '%YAML' tag */ 4189566063dSJacob Faibussowitsch if (!*yaml) PetscCall(PetscStrncmp(buf,"---",3,yaml)); /* check for document start */ 419a1d2f846SLisandro Dalcin } 420a1d2f846SLisandro Dalcin (void)fclose(fh); 421a1d2f846SLisandro Dalcin } 422a1d2f846SLisandro Dalcin } 4239566063dSJacob Faibussowitsch PetscCallMPI(MPI_Bcast(yaml,1,MPIU_BOOL,0,comm)); 424a1d2f846SLisandro Dalcin } 425be10d61cSLisandro Dalcin PetscFunctionReturn(0); 426be10d61cSLisandro Dalcin } 427e5c89e4eSSatish Balay 428be10d61cSLisandro Dalcin static PetscErrorCode PetscOptionsInsertFilePetsc(MPI_Comm comm,PetscOptions options,const char file[],PetscBool require) 429e5c89e4eSSatish Balay { 4308c0b561eSLisandro Dalcin char *string,*vstring = NULL,*astring = NULL,*packed = NULL; 4317fb43599SVaclav Hapla char *tokens[4]; 43213e3f751SJed Brown size_t i,len,bytes; 433e5c89e4eSSatish Balay FILE *fd; 4347fb43599SVaclav Hapla PetscToken token=NULL; 435ed9cf6e9SBarry Smith int err; 436581bbe83SVaclav Hapla char *cmatch; 437581bbe83SVaclav Hapla const char cmt='#'; 4389210b8eaSVaclav Hapla PetscInt line=1; 4393a018368SJed Brown PetscMPIInt rank,cnt=0,acnt=0,counts[2]; 4409210b8eaSVaclav Hapla PetscBool isdir,alias=PETSC_FALSE,valid; 441e5c89e4eSSatish Balay 442e5c89e4eSSatish Balay PetscFunctionBegin; 4439566063dSJacob Faibussowitsch PetscCall(PetscMemzero(tokens,sizeof(tokens))); 4449566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(comm,&rank)); 445dd400576SPatrick Sanan if (rank == 0) { 4468c0b561eSLisandro Dalcin char fpath[PETSC_MAX_PATH_LEN]; 4478c0b561eSLisandro Dalcin char fname[PETSC_MAX_PATH_LEN]; 44805c7dedfSBarry Smith 4499566063dSJacob Faibussowitsch PetscCall(PetscStrreplace(PETSC_COMM_SELF,file,fpath,sizeof(fpath))); 4509566063dSJacob Faibussowitsch PetscCall(PetscFixFilename(fpath,fname)); 4518c0b561eSLisandro Dalcin 452e5c89e4eSSatish Balay fd = fopen(fname,"r"); 4539566063dSJacob Faibussowitsch PetscCall(PetscTestDirectory(fname,'r',&isdir)); 45408401ef6SPierre Jolivet PetscCheck(!isdir || !require,PETSC_COMM_SELF,PETSC_ERR_USER,"Specified options file %s is a directory",fname); 455ad38b122SPatrick Sanan if (fd && !isdir) { 4563a018368SJed Brown PetscSegBuffer vseg,aseg; 4579566063dSJacob Faibussowitsch PetscCall(PetscSegBufferCreate(1,4000,&vseg)); 4589566063dSJacob Faibussowitsch PetscCall(PetscSegBufferCreate(1,2000,&aseg)); 4593a018368SJed Brown 4609b754dc9SBarry Smith /* the following line will not work when opening initial files (like .petscrc) since info is not yet set */ 4619566063dSJacob Faibussowitsch PetscCall(PetscInfo(NULL,"Opened options file %s\n",file)); 462e24ecc5dSJed Brown 4635fa91da5SBarry Smith while ((string = Petscgetline(fd))) { 4644704e885SBarry Smith /* eliminate comments from each line */ 4659566063dSJacob Faibussowitsch PetscCall(PetscStrchr(string,cmt,&cmatch)); 46690f79514SSatish Balay if (cmatch) *cmatch = 0; 4679566063dSJacob Faibussowitsch PetscCall(PetscStrlen(string,&len)); 4685981331cSSatish Balay /* replace tabs, ^M, \n with " " */ 469e5c89e4eSSatish Balay for (i=0; i<len; i++) { 4705981331cSSatish Balay if (string[i] == '\t' || string[i] == '\r' || string[i] == '\n') { 471e5c89e4eSSatish Balay string[i] = ' '; 472e5c89e4eSSatish Balay } 473e5c89e4eSSatish Balay } 4749566063dSJacob Faibussowitsch PetscCall(PetscTokenCreate(string,' ',&token)); 4759566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token,&tokens[0])); 4767fb43599SVaclav Hapla if (!tokens[0]) { 47702b0d46eSSatish Balay goto destroy; 4787fb43599SVaclav Hapla } else if (!tokens[0][0]) { /* if token 0 is empty (string begins with spaces), redo */ 4799566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token,&tokens[0])); 48090f79514SSatish Balay } 4817fb43599SVaclav Hapla for (i=1; i<4; i++) { 4829566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token,&tokens[i])); 4837fb43599SVaclav Hapla } 4847fb43599SVaclav Hapla if (!tokens[0]) { 4852662f744SSatish Balay goto destroy; 4867fb43599SVaclav Hapla } else if (tokens[0][0] == '-') { 4879566063dSJacob Faibussowitsch PetscCall(PetscOptionsValidKey(tokens[0],&valid)); 48828b400f6SJacob 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]); 4899566063dSJacob Faibussowitsch PetscCall(PetscStrlen(tokens[0],&len)); 4909566063dSJacob Faibussowitsch PetscCall(PetscSegBufferGet(vseg,len+1,&vstring)); 4919566063dSJacob Faibussowitsch PetscCall(PetscArraycpy(vstring,tokens[0],len)); 492e24ecc5dSJed Brown vstring[len] = ' '; 4937fb43599SVaclav Hapla if (tokens[1]) { 4949566063dSJacob Faibussowitsch PetscCall(PetscOptionsValidKey(tokens[1],&valid)); 49528b400f6SJacob 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]); 4969566063dSJacob Faibussowitsch PetscCall(PetscStrlen(tokens[1],&len)); 4979566063dSJacob Faibussowitsch PetscCall(PetscSegBufferGet(vseg,len+3,&vstring)); 498e24ecc5dSJed Brown vstring[0] = '"'; 4999566063dSJacob Faibussowitsch PetscCall(PetscArraycpy(vstring+1,tokens[1],len)); 500e24ecc5dSJed Brown vstring[len+1] = '"'; 501e24ecc5dSJed Brown vstring[len+2] = ' '; 50209192fe3SBarry Smith } 50390f79514SSatish Balay } else { 5049566063dSJacob Faibussowitsch PetscCall(PetscStrcasecmp(tokens[0],"alias",&alias)); 5059210b8eaSVaclav Hapla if (alias) { 5069566063dSJacob Faibussowitsch PetscCall(PetscOptionsValidKey(tokens[1],&valid)); 50728b400f6SJacob 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]); 50808401ef6SPierre 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]); 5099566063dSJacob Faibussowitsch PetscCall(PetscOptionsValidKey(tokens[2],&valid)); 51028b400f6SJacob 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]); 5119566063dSJacob Faibussowitsch PetscCall(PetscStrlen(tokens[1],&len)); 5129566063dSJacob Faibussowitsch PetscCall(PetscSegBufferGet(aseg,len+1,&astring)); 5139566063dSJacob Faibussowitsch PetscCall(PetscArraycpy(astring,tokens[1],len)); 514e24ecc5dSJed Brown astring[len] = ' '; 515e24ecc5dSJed Brown 5169566063dSJacob Faibussowitsch PetscCall(PetscStrlen(tokens[2],&len)); 5179566063dSJacob Faibussowitsch PetscCall(PetscSegBufferGet(aseg,len+1,&astring)); 5189566063dSJacob Faibussowitsch PetscCall(PetscArraycpy(astring,tokens[2],len)); 519e24ecc5dSJed Brown astring[len] = ' '; 52098921bdaSJacob 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]); 5219210b8eaSVaclav Hapla } 5229210b8eaSVaclav Hapla { 5239210b8eaSVaclav Hapla const char *extraToken = alias ? tokens[3] : tokens[2]; 52428b400f6SJacob Faibussowitsch PetscCheck(!extraToken,PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Error in options file %s line %" PetscInt_FMT ": extra token %s",fname,line,extraToken); 525e5c89e4eSSatish Balay } 52602b0d46eSSatish Balay destroy: 5274b40f50bSBarry Smith free(string); 5289566063dSJacob Faibussowitsch PetscCall(PetscTokenDestroy(&token)); 5299210b8eaSVaclav Hapla alias = PETSC_FALSE; 5309210b8eaSVaclav Hapla line++; 531e5c89e4eSSatish Balay } 532ed9cf6e9SBarry Smith err = fclose(fd); 53328b400f6SJacob Faibussowitsch PetscCheck(!err,PETSC_COMM_SELF,PETSC_ERR_SYS,"fclose() failed on file %s",fname); 5349566063dSJacob Faibussowitsch PetscCall(PetscSegBufferGetSize(aseg,&bytes)); /* size without null termination */ 5359566063dSJacob Faibussowitsch PetscCall(PetscMPIIntCast(bytes,&acnt)); 5369566063dSJacob Faibussowitsch PetscCall(PetscSegBufferGet(aseg,1,&astring)); 537e24ecc5dSJed Brown astring[0] = 0; 5389566063dSJacob Faibussowitsch PetscCall(PetscSegBufferGetSize(vseg,&bytes)); /* size without null termination */ 5399566063dSJacob Faibussowitsch PetscCall(PetscMPIIntCast(bytes,&cnt)); 5409566063dSJacob Faibussowitsch PetscCall(PetscSegBufferGet(vseg,1,&vstring)); 541e24ecc5dSJed Brown vstring[0] = 0; 5429566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(2+acnt+cnt,&packed)); 5439566063dSJacob Faibussowitsch PetscCall(PetscSegBufferExtractTo(aseg,packed)); 5449566063dSJacob Faibussowitsch PetscCall(PetscSegBufferExtractTo(vseg,packed+acnt+1)); 5459566063dSJacob Faibussowitsch PetscCall(PetscSegBufferDestroy(&aseg)); 5469566063dSJacob Faibussowitsch PetscCall(PetscSegBufferDestroy(&vseg)); 54728b400f6SJacob Faibussowitsch } else PetscCheck(!require,PETSC_COMM_SELF,PETSC_ERR_USER,"Unable to open options file %s",fname); 5489b754dc9SBarry Smith } 54905c7dedfSBarry Smith 5503a018368SJed Brown counts[0] = acnt; 5513a018368SJed Brown counts[1] = cnt; 5524201f521SBarry Smith err = MPI_Bcast(counts,2,MPI_INT,0,comm); 55328b400f6SJacob 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/"); 5543a018368SJed Brown acnt = counts[0]; 5553a018368SJed Brown cnt = counts[1]; 5563a018368SJed Brown if (rank) { 5579566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(2+acnt+cnt,&packed)); 5583a018368SJed Brown } 5593a018368SJed Brown if (acnt || cnt) { 5609566063dSJacob Faibussowitsch PetscCallMPI(MPI_Bcast(packed,2+acnt+cnt,MPI_CHAR,0,comm)); 5613a018368SJed Brown astring = packed; 5623a018368SJed Brown vstring = packed + acnt + 1; 5633a018368SJed Brown } 5643a018368SJed Brown 5659b754dc9SBarry Smith if (acnt) { 5669566063dSJacob Faibussowitsch PetscCall(PetscTokenCreate(astring,' ',&token)); 5679566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token,&tokens[0])); 5687fb43599SVaclav Hapla while (tokens[0]) { 5699566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token,&tokens[1])); 5709566063dSJacob Faibussowitsch PetscCall(PetscOptionsSetAlias(options,tokens[0],tokens[1])); 5719566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token,&tokens[0])); 5729b754dc9SBarry Smith } 5739566063dSJacob Faibussowitsch PetscCall(PetscTokenDestroy(&token)); 5749b754dc9SBarry Smith } 5759b754dc9SBarry Smith 5761baa6e33SBarry Smith if (cnt) PetscCall(PetscOptionsInsertString(options,vstring)); 5779566063dSJacob Faibussowitsch PetscCall(PetscFree(packed)); 578e5c89e4eSSatish Balay PetscFunctionReturn(0); 579e5c89e4eSSatish Balay } 580e5c89e4eSSatish Balay 581d06005cbSLisandro Dalcin /*@C 582be10d61cSLisandro Dalcin PetscOptionsInsertFile - Inserts options into the database from a file. 583be10d61cSLisandro Dalcin 584be10d61cSLisandro Dalcin Collective 585be10d61cSLisandro Dalcin 586d8d19677SJose E. Roman Input Parameters: 587be10d61cSLisandro Dalcin + comm - the processes that will share the options (usually PETSC_COMM_WORLD) 588be10d61cSLisandro Dalcin . options - options database, use NULL for default global database 589be10d61cSLisandro Dalcin . file - name of file, 590be10d61cSLisandro Dalcin ".yml" and ".yaml" filename extensions are inserted as YAML options, 591be10d61cSLisandro Dalcin append ":yaml" to filename to force YAML options. 592be10d61cSLisandro Dalcin - require - if PETSC_TRUE will generate an error if the file does not exist 593be10d61cSLisandro Dalcin 594be10d61cSLisandro Dalcin Notes: 595be10d61cSLisandro Dalcin Use # for lines that are comments and which should be ignored. 596be10d61cSLisandro Dalcin Usually, instead of using this command, one should list the file name in the call to PetscInitialize(), this insures that certain options 597be10d61cSLisandro 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 598be10d61cSLisandro Dalcin calls to XXXSetFromOptions() it should not be used for options listed under PetscInitialize(). 599be10d61cSLisandro Dalcin The collectivity of this routine is complex; only the MPI processes in comm will 600be10d61cSLisandro Dalcin have the affect of these options. If some processes that create objects call this routine and others do 601be10d61cSLisandro Dalcin not the code may fail in complicated ways because the same parallel solvers may incorrectly use different options 602be10d61cSLisandro Dalcin on different ranks. 603be10d61cSLisandro Dalcin 604be10d61cSLisandro Dalcin Level: developer 605be10d61cSLisandro Dalcin 606db781477SPatrick Sanan .seealso: `PetscOptionsSetValue()`, `PetscOptionsView()`, `PetscOptionsHasName()`, `PetscOptionsGetInt()`, 607db781477SPatrick Sanan `PetscOptionsGetReal()`, `PetscOptionsGetString()`, `PetscOptionsGetIntArray()`, `PetscOptionsBool()`, 608db781477SPatrick Sanan `PetscOptionsName()`, `PetscOptionsBegin()`, `PetscOptionsEnd()`, `PetscOptionsHeadBegin()`, 609c2e3fba1SPatrick Sanan `PetscOptionsStringArray()`, `PetscOptionsRealArray()`, `PetscOptionsScalar()`, 610db781477SPatrick Sanan `PetscOptionsBoolGroupBegin()`, `PetscOptionsBoolGroup()`, `PetscOptionsBoolGroupEnd()`, 611db781477SPatrick Sanan `PetscOptionsFList()`, `PetscOptionsEList()` 612be10d61cSLisandro Dalcin 613be10d61cSLisandro Dalcin @*/ 614be10d61cSLisandro Dalcin PetscErrorCode PetscOptionsInsertFile(MPI_Comm comm,PetscOptions options,const char file[],PetscBool require) 615be10d61cSLisandro Dalcin { 616be10d61cSLisandro Dalcin char filename[PETSC_MAX_PATH_LEN]; 617be10d61cSLisandro Dalcin PetscBool yaml; 618be10d61cSLisandro Dalcin 619be10d61cSLisandro Dalcin PetscFunctionBegin; 6209566063dSJacob Faibussowitsch PetscCall(PetscOptionsFilename(comm,file,filename,&yaml)); 621be10d61cSLisandro Dalcin if (yaml) { 6229566063dSJacob Faibussowitsch PetscCall(PetscOptionsInsertFileYAML(comm,options,filename,require)); 623be10d61cSLisandro Dalcin } else { 6249566063dSJacob Faibussowitsch PetscCall(PetscOptionsInsertFilePetsc(comm,options,filename,require)); 625be10d61cSLisandro Dalcin } 626be10d61cSLisandro Dalcin PetscFunctionReturn(0); 627be10d61cSLisandro Dalcin } 628be10d61cSLisandro Dalcin 629be10d61cSLisandro Dalcin /*@C 630d06005cbSLisandro Dalcin PetscOptionsInsertArgs - Inserts options into the database from a array of strings 631d06005cbSLisandro Dalcin 632d06005cbSLisandro Dalcin Logically Collective 633d06005cbSLisandro Dalcin 634d8d19677SJose E. Roman Input Parameters: 635d06005cbSLisandro Dalcin + options - options object 6366aad120cSJose E. Roman . argc - the array length 637d06005cbSLisandro Dalcin - args - the string array 638d06005cbSLisandro Dalcin 639d06005cbSLisandro Dalcin Level: intermediate 640d06005cbSLisandro Dalcin 641db781477SPatrick Sanan .seealso: `PetscOptions`, `PetscOptionsInsertString()`, `PetscOptionsInsertFile()` 642d06005cbSLisandro Dalcin @*/ 643d06005cbSLisandro Dalcin PetscErrorCode PetscOptionsInsertArgs(PetscOptions options,int argc,char *args[]) 64485079163SJed Brown { 645d06005cbSLisandro Dalcin MPI_Comm comm = PETSC_COMM_WORLD; 646d06005cbSLisandro Dalcin int left = PetscMax(argc,0); 647d06005cbSLisandro Dalcin char *const *eargs = args; 64885079163SJed Brown 64985079163SJed Brown PetscFunctionBegin; 65085079163SJed Brown while (left) { 651d06005cbSLisandro Dalcin PetscBool isfile,isfileyaml,isstringyaml,ispush,ispop,key; 6529566063dSJacob Faibussowitsch PetscCall(PetscStrcasecmp(eargs[0],"-options_file",&isfile)); 6539566063dSJacob Faibussowitsch PetscCall(PetscStrcasecmp(eargs[0],"-options_file_yaml",&isfileyaml)); 6549566063dSJacob Faibussowitsch PetscCall(PetscStrcasecmp(eargs[0],"-options_string_yaml",&isstringyaml)); 6559566063dSJacob Faibussowitsch PetscCall(PetscStrcasecmp(eargs[0],"-prefix_push",&ispush)); 6569566063dSJacob Faibussowitsch PetscCall(PetscStrcasecmp(eargs[0],"-prefix_pop",&ispop)); 6579566063dSJacob Faibussowitsch PetscCall(PetscOptionsValidKey(eargs[0],&key)); 658093de6efSBarry Smith if (!key) { 65985079163SJed Brown eargs++; left--; 660d06005cbSLisandro Dalcin } else if (isfile) { 661cc73adaaSBarry Smith PetscCheck(left > 1 && eargs[1][0] != '-',PETSC_COMM_SELF,PETSC_ERR_USER,"Missing filename for -options_file filename option"); 6629566063dSJacob Faibussowitsch PetscCall(PetscOptionsInsertFile(comm,options,eargs[1],PETSC_TRUE)); 66385079163SJed Brown eargs += 2; left -= 2; 664d06005cbSLisandro Dalcin } else if (isfileyaml) { 665cc73adaaSBarry Smith PetscCheck(left > 1 && eargs[1][0] != '-',PETSC_COMM_SELF,PETSC_ERR_USER,"Missing filename for -options_file_yaml filename option"); 6669566063dSJacob Faibussowitsch PetscCall(PetscOptionsInsertFileYAML(comm,options,eargs[1],PETSC_TRUE)); 667d06005cbSLisandro Dalcin eargs += 2; left -= 2; 668d06005cbSLisandro Dalcin } else if (isstringyaml) { 669cc73adaaSBarry Smith PetscCheck(left > 1 && eargs[1][0] != '-',PETSC_COMM_SELF,PETSC_ERR_USER,"Missing string for -options_string_yaml string option"); 6709566063dSJacob Faibussowitsch PetscCall(PetscOptionsInsertStringYAML(options,eargs[1])); 671d06005cbSLisandro Dalcin eargs += 2; left -= 2; 672d06005cbSLisandro Dalcin } else if (ispush) { 67308401ef6SPierre Jolivet PetscCheck(left > 1,PETSC_COMM_SELF,PETSC_ERR_USER,"Missing prefix for -prefix_push option"); 674cc73adaaSBarry Smith PetscCheck(eargs[1][0] != '-',PETSC_COMM_SELF,PETSC_ERR_USER,"Missing prefix for -prefix_push option (prefixes cannot start with '-')"); 6759566063dSJacob Faibussowitsch PetscCall(PetscOptionsPrefixPush(options,eargs[1])); 6769db968c8SJed Brown eargs += 2; left -= 2; 677d06005cbSLisandro Dalcin } else if (ispop) { 6789566063dSJacob Faibussowitsch PetscCall(PetscOptionsPrefixPop(options)); 6799db968c8SJed Brown eargs++; left--; 6807935c3d8SJed Brown } else { 6817935c3d8SJed Brown PetscBool nextiskey = PETSC_FALSE; 6829566063dSJacob Faibussowitsch if (left >= 2) PetscCall(PetscOptionsValidKey(eargs[1],&nextiskey)); 68398b6bf53SJed Brown if (left < 2 || nextiskey) { 6849566063dSJacob Faibussowitsch PetscCall(PetscOptionsSetValue(options,eargs[0],NULL)); 68585079163SJed Brown eargs++; left--; 68685079163SJed Brown } else { 6879566063dSJacob Faibussowitsch PetscCall(PetscOptionsSetValue(options,eargs[0],eargs[1])); 68885079163SJed Brown eargs += 2; left -= 2; 68985079163SJed Brown } 69085079163SJed Brown } 6917935c3d8SJed Brown } 69285079163SJed Brown PetscFunctionReturn(0); 69385079163SJed Brown } 69485079163SJed Brown 6959fbee547SJacob Faibussowitsch static inline PetscErrorCode PetscOptionsStringToBoolIfSet_Private(enum PetscPrecedentOption opt,const char *val[],PetscBool set[],PetscBool *flg) 696c5b5d8d5SVaclav Hapla { 697c5b5d8d5SVaclav Hapla PetscFunctionBegin; 698c5b5d8d5SVaclav Hapla if (set[opt]) { 6999566063dSJacob Faibussowitsch PetscCall(PetscOptionsStringToBool(val[opt],flg)); 700c5b5d8d5SVaclav Hapla } else *flg = PETSC_FALSE; 701c5b5d8d5SVaclav Hapla PetscFunctionReturn(0); 702c5b5d8d5SVaclav Hapla } 703c5b5d8d5SVaclav Hapla 704*660278c0SBarry Smith /* Process options with absolute precedence, these are only processed from the command line, not the environment or files */ 705c5b5d8d5SVaclav Hapla static PetscErrorCode PetscOptionsProcessPrecedentFlags(PetscOptions options,int argc,char *args[],PetscBool *skip_petscrc,PetscBool *skip_petscrc_set) 706c5b5d8d5SVaclav Hapla { 707c5b5d8d5SVaclav Hapla const char* const *opt = precedentOptions; 708c5b5d8d5SVaclav Hapla const size_t n = PO_NUM; 709c5b5d8d5SVaclav Hapla size_t o; 710c5b5d8d5SVaclav Hapla int a; 711c5b5d8d5SVaclav Hapla const char **val; 7120c99d500SBarry Smith char **cval; 713*660278c0SBarry Smith PetscBool *set,unneeded; 714c5b5d8d5SVaclav Hapla 715c5b5d8d5SVaclav Hapla PetscFunctionBegin; 7160c99d500SBarry Smith PetscCall(PetscCalloc2(n,&cval,n,&set)); 7170c99d500SBarry Smith val = (const char**) cval; 718c5b5d8d5SVaclav Hapla 719c5b5d8d5SVaclav Hapla /* Look for options possibly set using PetscOptionsSetValue beforehand */ 720c5b5d8d5SVaclav Hapla for (o=0; o<n; o++) { 7219566063dSJacob Faibussowitsch PetscCall(PetscOptionsFindPair(options,NULL,opt[o],&val[o],&set[o])); 722c5b5d8d5SVaclav Hapla } 723c5b5d8d5SVaclav Hapla 724a5b23f4aSJose E. Roman /* Loop through all args to collect last occurring value of each option */ 725c5b5d8d5SVaclav Hapla for (a=1; a<argc; a++) { 726c5b5d8d5SVaclav Hapla PetscBool valid, eq; 727c5b5d8d5SVaclav Hapla 7289566063dSJacob Faibussowitsch PetscCall(PetscOptionsValidKey(args[a],&valid)); 729c5b5d8d5SVaclav Hapla if (!valid) continue; 730c5b5d8d5SVaclav Hapla for (o=0; o<n; o++) { 7319566063dSJacob Faibussowitsch PetscCall(PetscStrcasecmp(args[a],opt[o],&eq)); 732c5b5d8d5SVaclav Hapla if (eq) { 733c5b5d8d5SVaclav Hapla set[o] = PETSC_TRUE; 734c5b5d8d5SVaclav Hapla if (a == argc-1 || !args[a+1] || !args[a+1][0] || args[a+1][0] == '-') val[o] = NULL; 735c5b5d8d5SVaclav Hapla else val[o] = args[a+1]; 736c5b5d8d5SVaclav Hapla break; 737c5b5d8d5SVaclav Hapla } 738c5b5d8d5SVaclav Hapla } 739c5b5d8d5SVaclav Hapla } 740c5b5d8d5SVaclav Hapla 741c5b5d8d5SVaclav Hapla /* Process flags */ 7429566063dSJacob Faibussowitsch PetscCall(PetscStrcasecmp(val[PO_HELP], "intro", &options->help_intro)); 743d314f959SVaclav Hapla if (options->help_intro) options->help = PETSC_TRUE; 7449566063dSJacob Faibussowitsch else PetscCall(PetscOptionsStringToBoolIfSet_Private(PO_HELP, val,set,&options->help)); 745*660278c0SBarry Smith PetscCall(PetscOptionsStringToBoolIfSet_Private(PO_CI_ENABLE, val,set,&unneeded)); 746*660278c0SBarry Smith /* need to manage PO_CI_ENABLE option before the PetscOptionsMonitor is turned on, so its setting is not monitored */ 747*660278c0SBarry Smith if (set[PO_CI_ENABLE]) PetscCall(PetscOptionsSetValue_Private(options,opt[PO_CI_ENABLE],val[PO_CI_ENABLE],&a)); 7489566063dSJacob Faibussowitsch PetscCall(PetscOptionsStringToBoolIfSet_Private(PO_OPTIONS_MONITOR_CANCEL,val,set,&options->monitorCancel)); 7499566063dSJacob Faibussowitsch PetscCall(PetscOptionsStringToBoolIfSet_Private(PO_OPTIONS_MONITOR, val,set,&options->monitorFromOptions)); 7509566063dSJacob Faibussowitsch PetscCall(PetscOptionsStringToBoolIfSet_Private(PO_SKIP_PETSCRC, val,set,skip_petscrc)); 751c5b5d8d5SVaclav Hapla *skip_petscrc_set = set[PO_SKIP_PETSCRC]; 752c5b5d8d5SVaclav Hapla 753c5b5d8d5SVaclav Hapla /* Store precedent options in database and mark them as used */ 754*660278c0SBarry Smith for (o=1; o<n; o++) { 755c5b5d8d5SVaclav Hapla if (set[o]) { 7569566063dSJacob Faibussowitsch PetscCall(PetscOptionsSetValue_Private(options,opt[o],val[o],&a)); 757d06005cbSLisandro Dalcin options->used[a] = PETSC_TRUE; 758c5b5d8d5SVaclav Hapla } 759c5b5d8d5SVaclav Hapla } 7600c99d500SBarry Smith PetscCall(PetscFree2(cval,set)); 761c5b5d8d5SVaclav Hapla options->precedentProcessed = PETSC_TRUE; 762c5b5d8d5SVaclav Hapla PetscFunctionReturn(0); 763c5b5d8d5SVaclav Hapla } 764c5b5d8d5SVaclav Hapla 7659fbee547SJacob Faibussowitsch static inline PetscErrorCode PetscOptionsSkipPrecedent(PetscOptions options,const char name[],PetscBool *flg) 766c5b5d8d5SVaclav Hapla { 76739a651e2SJacob Faibussowitsch PetscFunctionBegin; 76839a651e2SJacob Faibussowitsch PetscValidBoolPointer(flg,3); 769c5b5d8d5SVaclav Hapla *flg = PETSC_FALSE; 770c5b5d8d5SVaclav Hapla if (options->precedentProcessed) { 77139a651e2SJacob Faibussowitsch for (int i = 0; i < PO_NUM; ++i) { 772c5b5d8d5SVaclav Hapla if (!PetscOptNameCmp(precedentOptions[i],name)) { 773c5b5d8d5SVaclav Hapla /* check if precedent option has been set already */ 7749566063dSJacob Faibussowitsch PetscCall(PetscOptionsFindPair(options,NULL,name,NULL,flg)); 775c5b5d8d5SVaclav Hapla if (*flg) break; 776c5b5d8d5SVaclav Hapla } 777c5b5d8d5SVaclav Hapla } 778c5b5d8d5SVaclav Hapla } 77939a651e2SJacob Faibussowitsch PetscFunctionReturn(0); 780c5b5d8d5SVaclav Hapla } 78185079163SJed Brown 782e5c89e4eSSatish Balay /*@C 783e5c89e4eSSatish Balay PetscOptionsInsert - Inserts into the options database from the command line, 784e5c89e4eSSatish Balay the environmental variable and a file. 785e5c89e4eSSatish Balay 7861c9f3c13SBarry Smith Collective on PETSC_COMM_WORLD 7871c9f3c13SBarry Smith 788e5c89e4eSSatish Balay Input Parameters: 789c5929fdfSBarry Smith + options - options database or NULL for the default global database 790c5929fdfSBarry Smith . argc - count of number of command line arguments 791e5c89e4eSSatish Balay . args - the command line arguments 792be10d61cSLisandro Dalcin - file - [optional] PETSc database file, append ":yaml" to filename to specify YAML options format. 793be10d61cSLisandro Dalcin Use NULL or empty string to not check for code specific file. 794be10d61cSLisandro Dalcin Also checks ~/.petscrc, .petscrc and petscrc. 795c5b5d8d5SVaclav Hapla Use -skip_petscrc in the code specific file (or command line) to skip ~/.petscrc, .petscrc and petscrc files. 796e5c89e4eSSatish Balay 797e5c89e4eSSatish Balay Note: 798e5c89e4eSSatish Balay Since PetscOptionsInsert() is automatically called by PetscInitialize(), 799e5c89e4eSSatish Balay the user does not typically need to call this routine. PetscOptionsInsert() 800e5c89e4eSSatish Balay can be called several times, adding additional entries into the database. 801e5c89e4eSSatish Balay 802081c24baSBoyana Norris Options Database Keys: 803d06005cbSLisandro Dalcin + -options_file <filename> - read options from a file 804d06005cbSLisandro Dalcin - -options_file_yaml <filename> - read options from a YAML file 805c5b5d8d5SVaclav Hapla 806c5b5d8d5SVaclav Hapla See PetscInitialize() for options related to option database monitoring. 807081c24baSBoyana Norris 808e5c89e4eSSatish Balay Level: advanced 809e5c89e4eSSatish Balay 810db781477SPatrick Sanan .seealso: `PetscOptionsDestroy()`, `PetscOptionsView()`, `PetscOptionsInsertString()`, `PetscOptionsInsertFile()`, 811db781477SPatrick Sanan `PetscInitialize()` 812e5c89e4eSSatish Balay @*/ 813c5929fdfSBarry Smith PetscErrorCode PetscOptionsInsert(PetscOptions options,int *argc,char ***args,const char file[]) 814e5c89e4eSSatish Balay { 815d06005cbSLisandro Dalcin MPI_Comm comm = PETSC_COMM_WORLD; 816e5c89e4eSSatish Balay PetscMPIInt rank; 817c5b5d8d5SVaclav Hapla PetscBool hasArgs = (argc && *argc) ? PETSC_TRUE : PETSC_FALSE; 818c5b5d8d5SVaclav Hapla PetscBool skipPetscrc = PETSC_FALSE, skipPetscrcSet = PETSC_FALSE; 819e5c89e4eSSatish Balay 820e5c89e4eSSatish Balay PetscFunctionBegin; 82108401ef6SPierre Jolivet PetscCheck(!hasArgs || (args && *args),comm,PETSC_ERR_ARG_NULL,"*argc > 1 but *args not given"); 8229566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(comm,&rank)); 823e5c89e4eSSatish Balay 824c5b5d8d5SVaclav Hapla if (!options) { 8259566063dSJacob Faibussowitsch PetscCall(PetscOptionsCreateDefault()); 826c5b5d8d5SVaclav Hapla options = defaultoptions; 827c5b5d8d5SVaclav Hapla } 828c5b5d8d5SVaclav Hapla if (hasArgs) { 829c5b5d8d5SVaclav Hapla /* process options with absolute precedence */ 8309566063dSJacob Faibussowitsch PetscCall(PetscOptionsProcessPrecedentFlags(options,*argc,*args,&skipPetscrc,&skipPetscrcSet)); 831*660278c0SBarry Smith PetscCall(PetscOptionsGetBool(NULL,NULL,"-petsc_ci",&PetscCIEnabled,NULL)); 832c5b5d8d5SVaclav Hapla } 8334b09e917SBarry Smith if (file && file[0]) { 8349566063dSJacob Faibussowitsch PetscCall(PetscOptionsInsertFile(comm,options,file,PETSC_TRUE)); 835c5b5d8d5SVaclav Hapla /* if -skip_petscrc has not been set from command line, check whether it has been set in the file */ 8369566063dSJacob Faibussowitsch if (!skipPetscrcSet) PetscCall(PetscOptionsGetBool(options,NULL,"-skip_petscrc",&skipPetscrc,NULL)); 837321366bcSBarry Smith } 838c5b5d8d5SVaclav Hapla if (!skipPetscrc) { 839be10d61cSLisandro Dalcin char filename[PETSC_MAX_PATH_LEN]; 8409566063dSJacob Faibussowitsch PetscCall(PetscGetHomeDirectory(filename,sizeof(filename))); 8419566063dSJacob Faibussowitsch PetscCallMPI(MPI_Bcast(filename,(int)sizeof(filename),MPI_CHAR,0,comm)); 8429566063dSJacob Faibussowitsch if (filename[0]) PetscCall(PetscStrcat(filename,"/.petscrc")); 8439566063dSJacob Faibussowitsch PetscCall(PetscOptionsInsertFile(comm,options,filename,PETSC_FALSE)); 8449566063dSJacob Faibussowitsch PetscCall(PetscOptionsInsertFile(comm,options,".petscrc",PETSC_FALSE)); 8459566063dSJacob Faibussowitsch PetscCall(PetscOptionsInsertFile(comm,options,"petscrc",PETSC_FALSE)); 846e5c89e4eSSatish Balay } 847e5c89e4eSSatish Balay 8482d747510SLisandro Dalcin /* insert environment options */ 849e5c89e4eSSatish Balay { 8502d747510SLisandro Dalcin char *eoptions = NULL; 851e5c89e4eSSatish Balay size_t len = 0; 852dd400576SPatrick Sanan if (rank == 0) { 853e5c89e4eSSatish Balay eoptions = (char*)getenv("PETSC_OPTIONS"); 8549566063dSJacob Faibussowitsch PetscCall(PetscStrlen(eoptions,&len)); 855e5c89e4eSSatish Balay } 8569566063dSJacob Faibussowitsch PetscCallMPI(MPI_Bcast(&len,1,MPIU_SIZE_T,0,comm)); 857e5c89e4eSSatish Balay if (len) { 8589566063dSJacob Faibussowitsch if (rank) PetscCall(PetscMalloc1(len+1,&eoptions)); 8599566063dSJacob Faibussowitsch PetscCallMPI(MPI_Bcast(eoptions,len,MPI_CHAR,0,comm)); 86096fc60bcSBarry Smith if (rank) eoptions[len] = 0; 8619566063dSJacob Faibussowitsch PetscCall(PetscOptionsInsertString(options,eoptions)); 8629566063dSJacob Faibussowitsch if (rank) PetscCall(PetscFree(eoptions)); 863e5c89e4eSSatish Balay } 864e5c89e4eSSatish Balay } 865e5c89e4eSSatish Balay 866d06005cbSLisandro Dalcin /* insert YAML environment options */ 86756a31166SBarry Smith { 8689fc438c3SToby Isaac char *eoptions = NULL; 8699fc438c3SToby Isaac size_t len = 0; 870dd400576SPatrick Sanan if (rank == 0) { 8719fc438c3SToby Isaac eoptions = (char*)getenv("PETSC_OPTIONS_YAML"); 8729566063dSJacob Faibussowitsch PetscCall(PetscStrlen(eoptions,&len)); 8739fc438c3SToby Isaac } 8749566063dSJacob Faibussowitsch PetscCallMPI(MPI_Bcast(&len,1,MPIU_SIZE_T,0,comm)); 8759fc438c3SToby Isaac if (len) { 8769566063dSJacob Faibussowitsch if (rank) PetscCall(PetscMalloc1(len+1,&eoptions)); 8779566063dSJacob Faibussowitsch PetscCallMPI(MPI_Bcast(eoptions,len,MPI_CHAR,0,comm)); 8789fc438c3SToby Isaac if (rank) eoptions[len] = 0; 8799566063dSJacob Faibussowitsch PetscCall(PetscOptionsInsertStringYAML(options,eoptions)); 8809566063dSJacob Faibussowitsch if (rank) PetscCall(PetscFree(eoptions)); 8819fc438c3SToby Isaac } 8829fc438c3SToby Isaac } 8833bcbd388SSean Farley 884c5b5d8d5SVaclav Hapla /* insert command line options here because they take precedence over arguments in petscrc/environment */ 8859566063dSJacob Faibussowitsch if (hasArgs) PetscCall(PetscOptionsInsertArgs(options,*argc-1,*args+1)); 886*660278c0SBarry Smith PetscCall(PetscOptionsGetBool(NULL,NULL,"-petsc_ci_portable_error_output",&PetscCIEnabledPortableErrorOutput,NULL)); 887e5c89e4eSSatish Balay PetscFunctionReturn(0); 888e5c89e4eSSatish Balay } 889e5c89e4eSSatish Balay 890*660278c0SBarry Smith /* These options are not printed with PetscOptionsView() or PetscOptionsMonitor() when PetscCIEnabled is on */ 891*660278c0SBarry Smith /* TODO: get the list from the test harness, do not have it hardwired here. Maybe from gmakegentest.py */ 892*660278c0SBarry Smith static const char *PetscCIOptions[] = {"malloc_debug", 893*660278c0SBarry Smith "malloc_dump", 894*660278c0SBarry Smith "malloc_test", 895*660278c0SBarry Smith "nox", 896*660278c0SBarry Smith "nox_warning", 897*660278c0SBarry Smith "display", 898*660278c0SBarry Smith "saws_port_auto_select", 899*660278c0SBarry Smith "saws_port_auto_select_silent", 900*660278c0SBarry Smith "vecscatter_mpi1 ", 901*660278c0SBarry Smith "check_pointer_intensity", 902*660278c0SBarry Smith "cuda_initialize", 903*660278c0SBarry Smith "error_output_stdout", 904*660278c0SBarry Smith "use_gpu_aware_mpi", 905*660278c0SBarry Smith "checkfunctionlist", 906*660278c0SBarry Smith "petsc_ci", 907*660278c0SBarry Smith "petsc_ci_portable_error_output", 908*660278c0SBarry Smith }; 909*660278c0SBarry Smith 910*660278c0SBarry Smith static PetscBool PetscCIOption(const char *name) 911*660278c0SBarry Smith { 912*660278c0SBarry Smith PetscInt idx; 913*660278c0SBarry Smith PetscBool found; 914*660278c0SBarry Smith 915*660278c0SBarry Smith if (!PetscCIEnabled) return PETSC_FALSE; 916*660278c0SBarry Smith PetscEListFind(PETSC_STATIC_ARRAY_LENGTH(PetscCIOptions),PetscCIOptions,name,&idx,&found); 917*660278c0SBarry Smith return found; 918*660278c0SBarry Smith } 919*660278c0SBarry Smith 920e5c89e4eSSatish Balay /*@C 92188c29154SBarry Smith PetscOptionsView - Prints the options that have been loaded. This is 922e5c89e4eSSatish Balay useful for debugging purposes. 923e5c89e4eSSatish Balay 924c139c21fSBarry Smith Logically Collective on PetscViewer 925e5c89e4eSSatish Balay 926d8d19677SJose E. Roman Input Parameters: 927a2b725a8SWilliam Gropp + options - options database, use NULL for default global database 928a2b725a8SWilliam Gropp - viewer - must be an PETSCVIEWERASCII viewer 929e5c89e4eSSatish Balay 930e5c89e4eSSatish Balay Options Database Key: 93126a7e8d4SBarry Smith . -options_view - Activates PetscOptionsView() within PetscFinalize() 932e5c89e4eSSatish Balay 9339666a313SBarry Smith Notes: 9349666a313SBarry Smith Only the rank zero process of MPI_Comm used to create view prints the option values. Other processes 9351c9f3c13SBarry Smith may have different values but they are not printed. 9361c9f3c13SBarry Smith 937e5c89e4eSSatish Balay Level: advanced 938e5c89e4eSSatish Balay 939db781477SPatrick Sanan .seealso: `PetscOptionsAllUsed()` 940e5c89e4eSSatish Balay @*/ 941c5929fdfSBarry Smith PetscErrorCode PetscOptionsView(PetscOptions options,PetscViewer viewer) 942e5c89e4eSSatish Balay { 943*660278c0SBarry Smith PetscInt i, N = 0; 94488c29154SBarry Smith PetscBool isascii; 945e5c89e4eSSatish Balay 946e5c89e4eSSatish Balay PetscFunctionBegin; 9472d747510SLisandro Dalcin if (viewer) PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2); 948c5929fdfSBarry Smith options = options ? options : defaultoptions; 94988c29154SBarry Smith if (!viewer) viewer = PETSC_VIEWER_STDOUT_WORLD; 9509566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&isascii)); 95128b400f6SJacob Faibussowitsch PetscCheck(isascii,PetscObjectComm((PetscObject)viewer),PETSC_ERR_SUP,"Only supports ASCII viewer"); 95288c29154SBarry Smith 953*660278c0SBarry Smith for (i=0; i<options->N; i++) { 954*660278c0SBarry Smith if (PetscCIOption(options->names[i])) continue; 955*660278c0SBarry Smith N++; 956*660278c0SBarry Smith } 957*660278c0SBarry Smith 958*660278c0SBarry Smith if (!N) { 9599566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer,"#No PETSc Option Table entries\n")); 9602d747510SLisandro Dalcin PetscFunctionReturn(0); 96130694fe9SBarry Smith } 9622d747510SLisandro Dalcin 9639566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer,"#PETSc Option Table entries:\n")); 964e5c89e4eSSatish Balay for (i=0; i<options->N; i++) { 965*660278c0SBarry Smith if (PetscCIOption(options->names[i])) continue; 966e5c89e4eSSatish Balay if (options->values[i]) { 9679566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer,"-%s %s\n",options->names[i],options->values[i])); 968e5c89e4eSSatish Balay } else { 9699566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer,"-%s\n",options->names[i])); 970e5c89e4eSSatish Balay } 971e5c89e4eSSatish Balay } 9729566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer,"#End of PETSc Option Table entries\n")); 973e5c89e4eSSatish Balay PetscFunctionReturn(0); 974e5c89e4eSSatish Balay } 975e5c89e4eSSatish Balay 976e11779c2SBarry Smith /* 977e11779c2SBarry Smith Called by error handlers to print options used in run 978e11779c2SBarry Smith */ 97995c0884eSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscOptionsViewError(void) 980e11779c2SBarry Smith { 981*660278c0SBarry Smith PetscInt i, N = 0; 9824416b707SBarry Smith PetscOptions options = defaultoptions; 983e11779c2SBarry Smith 984e11779c2SBarry Smith PetscFunctionBegin; 985*660278c0SBarry Smith for (i=0; i<options->N; i++) { 986*660278c0SBarry Smith if (PetscCIOption(options->names[i])) continue; 987*660278c0SBarry Smith N++; 988*660278c0SBarry Smith } 989*660278c0SBarry Smith 990*660278c0SBarry Smith if (N) { 991e11779c2SBarry Smith (*PetscErrorPrintf)("PETSc Option Table entries:\n"); 992e11779c2SBarry Smith } else { 993e11779c2SBarry Smith (*PetscErrorPrintf)("No PETSc Option Table entries\n"); 994e11779c2SBarry Smith } 995e11779c2SBarry Smith for (i=0; i<options->N; i++) { 996*660278c0SBarry Smith if (PetscCIOption(options->names[i])) continue; 997e11779c2SBarry Smith if (options->values[i]) { 998e11779c2SBarry Smith (*PetscErrorPrintf)("-%s %s\n",options->names[i],options->values[i]); 999e11779c2SBarry Smith } else { 1000e11779c2SBarry Smith (*PetscErrorPrintf)("-%s\n",options->names[i]); 1001e11779c2SBarry Smith } 1002e11779c2SBarry Smith } 1003e11779c2SBarry Smith PetscFunctionReturn(0); 1004e11779c2SBarry Smith } 1005e11779c2SBarry Smith 1006e5c89e4eSSatish Balay /*@C 100774e0666dSJed Brown PetscOptionsPrefixPush - Designate a prefix to be used by all options insertions to follow. 100874e0666dSJed Brown 10091c9f3c13SBarry Smith Logically Collective 101074e0666dSJed Brown 1011d8d19677SJose E. Roman Input Parameters: 1012c5929fdfSBarry Smith + options - options database, or NULL for the default global database 1013c5929fdfSBarry Smith - prefix - The string to append to the existing prefix 10149db968c8SJed Brown 10159db968c8SJed Brown Options Database Keys: 10169db968c8SJed Brown + -prefix_push <some_prefix_> - push the given prefix 10179db968c8SJed Brown - -prefix_pop - pop the last prefix 10189db968c8SJed Brown 10199db968c8SJed Brown Notes: 10209db968c8SJed Brown It is common to use this in conjunction with -options_file as in 10219db968c8SJed Brown 10229db968c8SJed Brown $ -prefix_push system1_ -options_file system1rc -prefix_pop -prefix_push system2_ -options_file system2rc -prefix_pop 10239db968c8SJed Brown 10249db968c8SJed Brown where the files no longer require all options to be prefixed with -system2_. 102574e0666dSJed Brown 10269666a313SBarry Smith The collectivity of this routine is complex; only the MPI processes that call this routine will 10271c9f3c13SBarry Smith have the affect of these options. If some processes that create objects call this routine and others do 10281c9f3c13SBarry Smith not the code may fail in complicated ways because the same parallel solvers may incorrectly use different options 10291c9f3c13SBarry Smith on different ranks. 10301c9f3c13SBarry Smith 103174e0666dSJed Brown Level: advanced 103274e0666dSJed Brown 1033db781477SPatrick Sanan .seealso: `PetscOptionsPrefixPop()`, `PetscOptionsPush()`, `PetscOptionsPop()`, `PetscOptionsCreate()`, `PetscOptionsSetValue()` 103474e0666dSJed Brown @*/ 1035c5929fdfSBarry Smith PetscErrorCode PetscOptionsPrefixPush(PetscOptions options,const char prefix[]) 103674e0666dSJed Brown { 103774e0666dSJed Brown size_t n; 103874e0666dSJed Brown PetscInt start; 10392d747510SLisandro Dalcin char key[MAXOPTNAME+1]; 10402d747510SLisandro Dalcin PetscBool valid; 104174e0666dSJed Brown 104274e0666dSJed Brown PetscFunctionBegin; 1043064a246eSJacob Faibussowitsch PetscValidCharPointer(prefix,2); 1044c5929fdfSBarry Smith options = options ? options : defaultoptions; 104508401ef6SPierre 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); 10462d747510SLisandro Dalcin key[0] = '-'; /* keys must start with '-' */ 10479566063dSJacob Faibussowitsch PetscCall(PetscStrncpy(key+1,prefix,sizeof(key)-1)); 10489566063dSJacob Faibussowitsch PetscCall(PetscOptionsValidKey(key,&valid)); 10498bf569ecSLisandro 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 */ 105028b400f6SJacob 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":""); 105174e0666dSJed Brown start = options->prefixind ? options->prefixstack[options->prefixind-1] : 0; 10529566063dSJacob Faibussowitsch PetscCall(PetscStrlen(prefix,&n)); 105308401ef6SPierre Jolivet PetscCheck(n+1 <= sizeof(options->prefix)-start,PETSC_COMM_SELF,PETSC_ERR_PLIB,"Maximum prefix length %zu exceeded",sizeof(options->prefix)); 10549566063dSJacob Faibussowitsch PetscCall(PetscArraycpy(options->prefix+start,prefix,n+1)); 105574e0666dSJed Brown options->prefixstack[options->prefixind++] = start+n; 105674e0666dSJed Brown PetscFunctionReturn(0); 105774e0666dSJed Brown } 105874e0666dSJed Brown 1059c5929fdfSBarry Smith /*@C 106074e0666dSJed Brown PetscOptionsPrefixPop - Remove the latest options prefix, see PetscOptionsPrefixPush() for details 106174e0666dSJed Brown 10621c9f3c13SBarry Smith Logically Collective on the MPI_Comm that called PetscOptionsPrefixPush() 106374e0666dSJed Brown 1064c5929fdfSBarry Smith Input Parameters: 1065c5929fdfSBarry Smith . options - options database, or NULL for the default global database 1066c5929fdfSBarry Smith 106774e0666dSJed Brown Level: advanced 106874e0666dSJed Brown 1069db781477SPatrick Sanan .seealso: `PetscOptionsPrefixPush()`, `PetscOptionsPush()`, `PetscOptionsPop()`, `PetscOptionsCreate()`, `PetscOptionsSetValue()` 107074e0666dSJed Brown @*/ 1071c5929fdfSBarry Smith PetscErrorCode PetscOptionsPrefixPop(PetscOptions options) 107274e0666dSJed Brown { 107374e0666dSJed Brown PetscInt offset; 107474e0666dSJed Brown 107574e0666dSJed Brown PetscFunctionBegin; 1076c5929fdfSBarry Smith options = options ? options : defaultoptions; 107708401ef6SPierre Jolivet PetscCheck(options->prefixind >= 1,PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"More prefixes popped than pushed"); 107874e0666dSJed Brown options->prefixind--; 107974e0666dSJed Brown offset = options->prefixind ? options->prefixstack[options->prefixind-1] : 0; 108074e0666dSJed Brown options->prefix[offset] = 0; 108174e0666dSJed Brown PetscFunctionReturn(0); 108274e0666dSJed Brown } 108374e0666dSJed Brown 1084a542b6e8SBarry Smith /*@C 1085a542b6e8SBarry Smith PetscOptionsClear - Removes all options form the database leaving it empty. 1086a542b6e8SBarry Smith 10871c9f3c13SBarry Smith Logically Collective 10881c9f3c13SBarry Smith 1089c5929fdfSBarry Smith Input Parameters: 1090c5929fdfSBarry Smith . options - options database, use NULL for the default global database 1091c5929fdfSBarry Smith 10929666a313SBarry Smith The collectivity of this routine is complex; only the MPI processes that call this routine will 10931c9f3c13SBarry Smith have the affect of these options. If some processes that create objects call this routine and others do 10941c9f3c13SBarry Smith not the code may fail in complicated ways because the same parallel solvers may incorrectly use different options 10951c9f3c13SBarry Smith on different ranks. 10961c9f3c13SBarry Smith 1097a542b6e8SBarry Smith Level: developer 1098a542b6e8SBarry Smith 1099db781477SPatrick Sanan .seealso: `PetscOptionsInsert()` 1100a542b6e8SBarry Smith @*/ 1101c5929fdfSBarry Smith PetscErrorCode PetscOptionsClear(PetscOptions options) 1102a542b6e8SBarry Smith { 1103a542b6e8SBarry Smith PetscInt i; 1104a542b6e8SBarry Smith 110539a651e2SJacob Faibussowitsch PetscFunctionBegin; 1106c5929fdfSBarry Smith options = options ? options : defaultoptions; 110739a651e2SJacob Faibussowitsch if (!options) PetscFunctionReturn(0); 11082d747510SLisandro Dalcin 1109a542b6e8SBarry Smith for (i=0; i<options->N; i++) { 1110a542b6e8SBarry Smith if (options->names[i]) free(options->names[i]); 1111a542b6e8SBarry Smith if (options->values[i]) free(options->values[i]); 1112a542b6e8SBarry Smith } 11132d747510SLisandro Dalcin options->N = 0; 11142d747510SLisandro Dalcin 1115a542b6e8SBarry Smith for (i=0; i<options->Naliases; i++) { 1116a542b6e8SBarry Smith free(options->aliases1[i]); 1117a542b6e8SBarry Smith free(options->aliases2[i]); 1118a542b6e8SBarry Smith } 1119a542b6e8SBarry Smith options->Naliases = 0; 1120a542b6e8SBarry Smith 11212d747510SLisandro Dalcin /* destroy hash table */ 11222d747510SLisandro Dalcin kh_destroy(HO,options->ht); 11232d747510SLisandro Dalcin options->ht = NULL; 11240eb63584SBarry Smith 11252d747510SLisandro Dalcin options->prefixind = 0; 11262d747510SLisandro Dalcin options->prefix[0] = 0; 11272d747510SLisandro Dalcin options->help = PETSC_FALSE; 112839a651e2SJacob Faibussowitsch PetscFunctionReturn(0); 11294416b707SBarry Smith } 11304416b707SBarry Smith 11312d747510SLisandro Dalcin /*@C 11322d747510SLisandro Dalcin PetscOptionsSetAlias - Makes a key and alias for another key 11332d747510SLisandro Dalcin 11341c9f3c13SBarry Smith Logically Collective 11352d747510SLisandro Dalcin 11362d747510SLisandro Dalcin Input Parameters: 11372d747510SLisandro Dalcin + options - options database, or NULL for default global database 11382d747510SLisandro Dalcin . newname - the alias 11392d747510SLisandro Dalcin - oldname - the name that alias will refer to 11402d747510SLisandro Dalcin 11412d747510SLisandro Dalcin Level: advanced 11422d747510SLisandro Dalcin 11439666a313SBarry Smith The collectivity of this routine is complex; only the MPI processes that call this routine will 11441c9f3c13SBarry Smith have the affect of these options. If some processes that create objects call this routine and others do 11451c9f3c13SBarry Smith not the code may fail in complicated ways because the same parallel solvers may incorrectly use different options 11461c9f3c13SBarry Smith on different ranks. 11471c9f3c13SBarry Smith 1148c2e3fba1SPatrick Sanan .seealso: `PetscOptionsGetInt()`, `PetscOptionsGetReal()`, `OptionsHasName()`, 1149c2e3fba1SPatrick Sanan `PetscOptionsGetString()`, `PetscOptionsGetIntArray()`, `PetscOptionsGetRealArray()`, `PetscOptionsBool()`, 1150db781477SPatrick Sanan `PetscOptionsName()`, `PetscOptionsBegin()`, `PetscOptionsEnd()`, `PetscOptionsHeadBegin()`, 1151c2e3fba1SPatrick Sanan `PetscOptionsStringArray()`, `PetscOptionsRealArray()`, `PetscOptionsScalar()`, 1152db781477SPatrick Sanan `PetscOptionsBoolGroupBegin()`, `PetscOptionsBoolGroup()`, `PetscOptionsBoolGroupEnd()`, 1153db781477SPatrick Sanan `PetscOptionsFList()`, `PetscOptionsEList()` 11542d747510SLisandro Dalcin @*/ 11552d747510SLisandro Dalcin PetscErrorCode PetscOptionsSetAlias(PetscOptions options,const char newname[],const char oldname[]) 11562d747510SLisandro Dalcin { 11572d747510SLisandro Dalcin PetscInt n; 11582d747510SLisandro Dalcin size_t len; 11599210b8eaSVaclav Hapla PetscBool valid; 11602d747510SLisandro Dalcin 11612d747510SLisandro Dalcin PetscFunctionBegin; 11622d747510SLisandro Dalcin PetscValidCharPointer(newname,2); 11632d747510SLisandro Dalcin PetscValidCharPointer(oldname,3); 11642d747510SLisandro Dalcin options = options ? options : defaultoptions; 11659566063dSJacob Faibussowitsch PetscCall(PetscOptionsValidKey(newname,&valid)); 116628b400f6SJacob Faibussowitsch PetscCheck(valid,PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Invalid aliased option %s",newname); 11679566063dSJacob Faibussowitsch PetscCall(PetscOptionsValidKey(oldname,&valid)); 116828b400f6SJacob Faibussowitsch PetscCheck(valid,PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Invalid aliasee option %s",oldname); 11692d747510SLisandro Dalcin 11702d747510SLisandro Dalcin n = options->Naliases; 117108401ef6SPierre Jolivet PetscCheck(n < MAXALIASES,PETSC_COMM_SELF,PETSC_ERR_MEM,"You have defined to many PETSc options aliases, limit %d recompile \n src/sys/objects/options.c with larger value for MAXALIASES",MAXALIASES); 11722d747510SLisandro Dalcin 11732d747510SLisandro Dalcin newname++; oldname++; 11749566063dSJacob Faibussowitsch PetscCall(PetscStrlen(newname,&len)); 11752d747510SLisandro Dalcin options->aliases1[n] = (char*)malloc((len+1)*sizeof(char)); 11769566063dSJacob Faibussowitsch PetscCall(PetscStrcpy(options->aliases1[n],newname)); 11779566063dSJacob Faibussowitsch PetscCall(PetscStrlen(oldname,&len)); 11782d747510SLisandro Dalcin options->aliases2[n] = (char*)malloc((len+1)*sizeof(char)); 11799566063dSJacob Faibussowitsch PetscCall(PetscStrcpy(options->aliases2[n],oldname)); 11802d747510SLisandro Dalcin options->Naliases++; 11812d747510SLisandro Dalcin PetscFunctionReturn(0); 11822d747510SLisandro Dalcin } 11834416b707SBarry Smith 1184e5c89e4eSSatish Balay /*@C 1185e5c89e4eSSatish Balay PetscOptionsSetValue - Sets an option name-value pair in the options 1186e5c89e4eSSatish Balay database, overriding whatever is already present. 1187e5c89e4eSSatish Balay 11881c9f3c13SBarry Smith Logically Collective 1189e5c89e4eSSatish Balay 1190e5c89e4eSSatish Balay Input Parameters: 1191c5929fdfSBarry Smith + options - options database, use NULL for the default global database 1192c5929fdfSBarry Smith . name - name of option, this SHOULD have the - prepended 11932d747510SLisandro Dalcin - value - the option value (not used for all options, so can be NULL) 1194e5c89e4eSSatish Balay 1195e5c89e4eSSatish Balay Level: intermediate 1196e5c89e4eSSatish Balay 1197e5c89e4eSSatish Balay Note: 1198d49172ceSBarry Smith This function can be called BEFORE PetscInitialize() 1199d49172ceSBarry Smith 12009666a313SBarry Smith The collectivity of this routine is complex; only the MPI processes 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 12052d747510SLisandro Dalcin Developers Note: Uses malloc() directly because PETSc may not be initialized yet. 1206b0250c70SBarry Smith 1207db781477SPatrick Sanan .seealso: `PetscOptionsInsert()`, `PetscOptionsClearValue()` 1208e5c89e4eSSatish Balay @*/ 12092d747510SLisandro Dalcin PetscErrorCode PetscOptionsSetValue(PetscOptions options,const char name[],const char value[]) 1210e5c89e4eSSatish Balay { 121139a651e2SJacob Faibussowitsch PetscFunctionBegin; 12129566063dSJacob Faibussowitsch PetscCall(PetscOptionsSetValue_Private(options,name,value,NULL)); 121339a651e2SJacob Faibussowitsch PetscFunctionReturn(0); 1214c5b5d8d5SVaclav Hapla } 1215c5b5d8d5SVaclav Hapla 1216c5b5d8d5SVaclav Hapla static PetscErrorCode PetscOptionsSetValue_Private(PetscOptions options,const char name[],const char value[],int *pos) 1217c5b5d8d5SVaclav Hapla { 1218e5c89e4eSSatish Balay size_t len; 12192d747510SLisandro Dalcin int N,n,i; 1220e5c89e4eSSatish Balay char **names; 12212d747510SLisandro Dalcin char fullname[MAXOPTNAME] = ""; 1222c5b5d8d5SVaclav Hapla PetscBool flg; 1223e5c89e4eSSatish Balay 122439a651e2SJacob Faibussowitsch PetscFunctionBegin; 12257272c0d2SVaclav Hapla if (!options) { 12269566063dSJacob Faibussowitsch PetscCall(PetscOptionsCreateDefault()); 12277272c0d2SVaclav Hapla options = defaultoptions; 1228c5929fdfSBarry Smith } 122939a651e2SJacob Faibussowitsch PetscCheck(name[0] == '-',PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"name %s must start with '-'",name); 12302d747510SLisandro Dalcin 12319566063dSJacob Faibussowitsch PetscCall(PetscOptionsSkipPrecedent(options,name,&flg)); 123239a651e2SJacob Faibussowitsch if (flg) PetscFunctionReturn(0); 1233e5c89e4eSSatish Balay 12342d747510SLisandro Dalcin name++; /* skip starting dash */ 12352d747510SLisandro Dalcin 123674e0666dSJed Brown if (options->prefixind > 0) { 1237d49172ceSBarry Smith strncpy(fullname,options->prefix,sizeof(fullname)); 12382d747510SLisandro Dalcin fullname[sizeof(fullname)-1] = 0; 123989ae1891SBarry Smith strncat(fullname,name,sizeof(fullname)-strlen(fullname)-1); 12402d747510SLisandro Dalcin fullname[sizeof(fullname)-1] = 0; 124174e0666dSJed Brown name = fullname; 124274e0666dSJed Brown } 124374e0666dSJed Brown 124474e0666dSJed Brown /* check against aliases */ 1245e5c89e4eSSatish Balay N = options->Naliases; 1246e5c89e4eSSatish Balay for (i=0; i<N; i++) { 12472d747510SLisandro Dalcin int result = PetscOptNameCmp(options->aliases1[i],name); 12482d747510SLisandro Dalcin if (!result) { name = options->aliases2[i]; break; } 1249e5c89e4eSSatish Balay } 1250e5c89e4eSSatish Balay 12512d747510SLisandro Dalcin /* slow search */ 12522d747510SLisandro Dalcin N = n = options->N; 1253e5c89e4eSSatish Balay names = options->names; 1254e5c89e4eSSatish Balay for (i=0; i<N; i++) { 12552d747510SLisandro Dalcin int result = PetscOptNameCmp(names[i],name); 12562d747510SLisandro Dalcin if (!result) { 12572d747510SLisandro Dalcin n = i; goto setvalue; 12582d747510SLisandro Dalcin } else if (result > 0) { 12592d747510SLisandro Dalcin n = i; break; 1260e5c89e4eSSatish Balay } 1261e5c89e4eSSatish Balay } 126239a651e2SJacob Faibussowitsch PetscCheck(N < MAXOPTIONS,PETSC_COMM_SELF,PETSC_ERR_MEM,"Number of options %d < max number of options %d, can not allocate enough space",N,MAXOPTIONS); 126339a651e2SJacob Faibussowitsch 12642d747510SLisandro Dalcin /* shift remaining values up 1 */ 1265e5c89e4eSSatish Balay for (i=N; i>n; i--) { 12665e8c5e88SLisandro Dalcin options->names[i] = options->names[i-1]; 1267e5c89e4eSSatish Balay options->values[i] = options->values[i-1]; 1268e5c89e4eSSatish Balay options->used[i] = options->used[i-1]; 1269e5c89e4eSSatish Balay } 12702d747510SLisandro Dalcin options->names[n] = NULL; 12712d747510SLisandro Dalcin options->values[n] = NULL; 12722d747510SLisandro Dalcin options->used[n] = PETSC_FALSE; 12732d747510SLisandro Dalcin options->N++; 12742d747510SLisandro Dalcin 12752d747510SLisandro Dalcin /* destroy hash table */ 12762d747510SLisandro Dalcin kh_destroy(HO,options->ht); 12772d747510SLisandro Dalcin options->ht = NULL; 12782d747510SLisandro Dalcin 12792d747510SLisandro Dalcin /* set new name */ 128070d8d27cSBarry Smith len = strlen(name); 12815e8c5e88SLisandro Dalcin options->names[n] = (char*)malloc((len+1)*sizeof(char)); 128239a651e2SJacob Faibussowitsch PetscCheck(options->names[n],PETSC_COMM_SELF,PETSC_ERR_MEM,"Failed to allocate option name"); 1283d49172ceSBarry Smith strcpy(options->names[n],name); 12842d747510SLisandro Dalcin 12852d747510SLisandro Dalcin setvalue: 12862d747510SLisandro Dalcin /* set new value */ 12872d747510SLisandro Dalcin if (options->values[n]) free(options->values[n]); 1288d49172ceSBarry Smith len = value ? strlen(value) : 0; 12895e8c5e88SLisandro Dalcin if (len) { 1290e5c89e4eSSatish Balay options->values[n] = (char*)malloc((len+1)*sizeof(char)); 1291d49172ceSBarry Smith if (!options->values[n]) return PETSC_ERR_MEM; 1292d49172ceSBarry Smith strcpy(options->values[n],value); 12932d747510SLisandro Dalcin } else { 12942d747510SLisandro Dalcin options->values[n] = NULL; 12952d747510SLisandro Dalcin } 12962d747510SLisandro Dalcin 129791ad3481SVaclav Hapla /* handle -help so that it can be set from anywhere */ 129891ad3481SVaclav Hapla if (!PetscOptNameCmp(name,"help")) { 129991ad3481SVaclav Hapla options->help = PETSC_TRUE; 1300d06005cbSLisandro Dalcin options->help_intro = (value && !PetscOptNameCmp(value,"intro")) ? PETSC_TRUE : PETSC_FALSE; 130191ad3481SVaclav Hapla options->used[n] = PETSC_TRUE; 130291ad3481SVaclav Hapla } 130391ad3481SVaclav Hapla 13049566063dSJacob Faibussowitsch PetscCall(PetscOptionsMonitor(options,name,value)); 1305c5b5d8d5SVaclav Hapla if (pos) *pos = n; 130639a651e2SJacob Faibussowitsch PetscFunctionReturn(0); 1307e5c89e4eSSatish Balay } 1308e5c89e4eSSatish Balay 1309e5c89e4eSSatish Balay /*@C 1310e5c89e4eSSatish Balay PetscOptionsClearValue - Clears an option name-value pair in the options 1311e5c89e4eSSatish Balay database, overriding whatever is already present. 1312e5c89e4eSSatish Balay 13131c9f3c13SBarry Smith Logically Collective 1314e5c89e4eSSatish Balay 1315d8d19677SJose E. Roman Input Parameters: 1316c5929fdfSBarry Smith + options - options database, use NULL for the default global database 1317a2b725a8SWilliam Gropp - name - name of option, this SHOULD have the - prepended 1318e5c89e4eSSatish Balay 1319e5c89e4eSSatish Balay Level: intermediate 1320e5c89e4eSSatish Balay 13219666a313SBarry Smith The collectivity of this routine is complex; only the MPI processes that call this routine will 13221c9f3c13SBarry Smith have the affect of these options. If some processes that create objects call this routine and others do 13231c9f3c13SBarry Smith not the code may fail in complicated ways because the same parallel solvers may incorrectly use different options 13241c9f3c13SBarry Smith on different ranks. 13251c9f3c13SBarry Smith 1326db781477SPatrick Sanan .seealso: `PetscOptionsInsert()` 1327e5c89e4eSSatish Balay @*/ 13282d747510SLisandro Dalcin PetscErrorCode PetscOptionsClearValue(PetscOptions options,const char name[]) 1329e5c89e4eSSatish Balay { 13302d747510SLisandro Dalcin int N,n,i; 13312d747510SLisandro Dalcin char **names; 1332e5c89e4eSSatish Balay 1333e5c89e4eSSatish Balay PetscFunctionBegin; 1334c5929fdfSBarry Smith options = options ? options : defaultoptions; 1335cc73adaaSBarry Smith PetscCheck(name[0] == '-',PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Name must begin with '-': Instead %s",name); 1336c9dcd962SLisandro Dalcin if (!PetscOptNameCmp(name,"-help")) options->help = options->help_intro = PETSC_FALSE; 13372d747510SLisandro Dalcin 13382d747510SLisandro Dalcin name++; /* skip starting dash */ 13392d747510SLisandro Dalcin 13402d747510SLisandro Dalcin /* slow search */ 13412d747510SLisandro Dalcin N = n = options->N; 1342e5c89e4eSSatish Balay names = options->names; 1343e5c89e4eSSatish Balay for (i=0; i<N; i++) { 13442d747510SLisandro Dalcin int result = PetscOptNameCmp(names[i],name); 13452d747510SLisandro Dalcin if (!result) { 13462d747510SLisandro Dalcin n = i; break; 13472d747510SLisandro Dalcin } else if (result > 0) { 13482d747510SLisandro Dalcin n = N; break; 1349e5c89e4eSSatish Balay } 13502d747510SLisandro Dalcin } 13512d747510SLisandro Dalcin if (n == N) PetscFunctionReturn(0); /* it was not present */ 1352e5c89e4eSSatish Balay 13532d747510SLisandro Dalcin /* remove name and value */ 13542d747510SLisandro Dalcin if (options->names[n]) free(options->names[n]); 13552d747510SLisandro Dalcin if (options->values[n]) free(options->values[n]); 1356e5c89e4eSSatish Balay /* shift remaining values down 1 */ 1357e5c89e4eSSatish Balay for (i=n; i<N-1; i++) { 13585e8c5e88SLisandro Dalcin options->names[i] = options->names[i+1]; 1359e5c89e4eSSatish Balay options->values[i] = options->values[i+1]; 1360e5c89e4eSSatish Balay options->used[i] = options->used[i+1]; 1361e5c89e4eSSatish Balay } 1362e5c89e4eSSatish Balay options->N--; 13632d747510SLisandro Dalcin 13642d747510SLisandro Dalcin /* destroy hash table */ 13652d747510SLisandro Dalcin kh_destroy(HO,options->ht); 13662d747510SLisandro Dalcin options->ht = NULL; 13672d747510SLisandro Dalcin 13689566063dSJacob Faibussowitsch PetscCall(PetscOptionsMonitor(options,name,NULL)); 1369e5c89e4eSSatish Balay PetscFunctionReturn(0); 1370e5c89e4eSSatish Balay } 1371e5c89e4eSSatish Balay 1372e5c89e4eSSatish Balay /*@C 13732d747510SLisandro Dalcin PetscOptionsFindPair - Gets an option name-value pair from the options database. 1374e5c89e4eSSatish Balay 13752d747510SLisandro Dalcin Not Collective 1376e5c89e4eSSatish Balay 1377e5c89e4eSSatish Balay Input Parameters: 13782d747510SLisandro Dalcin + options - options database, use NULL for the default global database 13792d747510SLisandro Dalcin . pre - the string to prepend to the name or NULL, this SHOULD NOT have the "-" prepended 13802d747510SLisandro Dalcin - name - name of option, this SHOULD have the "-" prepended 1381e5c89e4eSSatish Balay 13822d747510SLisandro Dalcin Output Parameters: 13832d747510SLisandro Dalcin + value - the option value (optional, not used for all options) 13842d747510SLisandro Dalcin - set - whether the option is set (optional) 1385e5c89e4eSSatish Balay 13869666a313SBarry Smith Notes: 13879666a313SBarry Smith Each process may find different values or no value depending on how options were inserted into the database 13881c9f3c13SBarry Smith 13892d747510SLisandro Dalcin Level: developer 13902d747510SLisandro Dalcin 1391db781477SPatrick Sanan .seealso: `PetscOptionsSetValue()`, `PetscOptionsClearValue()` 1392e5c89e4eSSatish Balay @*/ 13932d747510SLisandro Dalcin PetscErrorCode PetscOptionsFindPair(PetscOptions options,const char pre[],const char name[],const char *value[],PetscBool *set) 1394e5c89e4eSSatish Balay { 13952d747510SLisandro Dalcin char buf[MAXOPTNAME]; 1396daabea38SBarry Smith PetscBool usehashtable = PETSC_TRUE; 13972d747510SLisandro Dalcin PetscBool matchnumbers = PETSC_TRUE; 1398e5c89e4eSSatish Balay 1399e5c89e4eSSatish Balay PetscFunctionBegin; 1400c5929fdfSBarry Smith options = options ? options : defaultoptions; 140108401ef6SPierre Jolivet PetscCheck(!pre || !PetscUnlikely(pre[0] == '-'),PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Prefix cannot begin with '-': Instead %s",pre); 1402cc73adaaSBarry Smith PetscCheck(name[0] == '-',PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Name must begin with '-': Instead %s",name); 1403e5c89e4eSSatish Balay 14042d747510SLisandro Dalcin name++; /* skip starting dash */ 1405e5c89e4eSSatish Balay 14067cd08cecSJed Brown /* append prefix to name, if prefix="foo_" and option='--bar", prefixed option is --foo_bar */ 14072d747510SLisandro Dalcin if (pre && pre[0]) { 14082d747510SLisandro Dalcin char *ptr = buf; 14092d747510SLisandro Dalcin if (name[0] == '-') { *ptr++ = '-'; name++; } 14109566063dSJacob Faibussowitsch PetscCall(PetscStrncpy(ptr,pre,buf+sizeof(buf)-ptr)); 14119566063dSJacob Faibussowitsch PetscCall(PetscStrlcat(buf,name,sizeof(buf))); 14122d747510SLisandro Dalcin name = buf; 14137cd08cecSJed Brown } 14142d747510SLisandro Dalcin 141576bd3646SJed Brown if (PetscDefined(USE_DEBUG)) { 14162f828895SJed Brown PetscBool valid; 14172d747510SLisandro Dalcin char key[MAXOPTNAME+1] = "-"; 14189566063dSJacob Faibussowitsch PetscCall(PetscStrncpy(key+1,name,sizeof(key)-1)); 14199566063dSJacob Faibussowitsch PetscCall(PetscOptionsValidKey(key,&valid)); 142028b400f6SJacob Faibussowitsch PetscCheck(valid,PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Invalid option '%s' obtained from pre='%s' and name='%s'",key,pre?pre:"",name); 14212f828895SJed Brown } 1422e5c89e4eSSatish Balay 14232d747510SLisandro Dalcin if (!options->ht && usehashtable) { 14242d747510SLisandro Dalcin int i,ret; 14252d747510SLisandro Dalcin khiter_t it; 14262d747510SLisandro Dalcin khash_t(HO) *ht; 14272d747510SLisandro Dalcin ht = kh_init(HO); 142828b400f6SJacob Faibussowitsch PetscCheck(ht,PETSC_COMM_SELF,PETSC_ERR_MEM,"Hash table allocation failed"); 14292d747510SLisandro Dalcin ret = kh_resize(HO,ht,options->N*2); /* twice the required size to reduce risk of collisions */ 143028b400f6SJacob Faibussowitsch PetscCheck(!ret,PETSC_COMM_SELF,PETSC_ERR_MEM,"Hash table allocation failed"); 14312d747510SLisandro Dalcin for (i=0; i<options->N; i++) { 14322d747510SLisandro Dalcin it = kh_put(HO,ht,options->names[i],&ret); 143308401ef6SPierre Jolivet PetscCheck(ret == 1,PETSC_COMM_SELF,PETSC_ERR_MEM,"Hash table allocation failed"); 14342d747510SLisandro Dalcin kh_val(ht,it) = i; 14352d747510SLisandro Dalcin } 14362d747510SLisandro Dalcin options->ht = ht; 14372d747510SLisandro Dalcin } 14382d747510SLisandro Dalcin 14392d747510SLisandro Dalcin if (usehashtable) 14402d747510SLisandro Dalcin { /* fast search */ 14412d747510SLisandro Dalcin khash_t(HO) *ht = options->ht; 14422d747510SLisandro Dalcin khiter_t it = kh_get(HO,ht,name); 14432d747510SLisandro Dalcin if (it != kh_end(ht)) { 14442d747510SLisandro Dalcin int i = kh_val(ht,it); 1445e5c89e4eSSatish Balay options->used[i] = PETSC_TRUE; 14462d747510SLisandro Dalcin if (value) *value = options->values[i]; 14472d747510SLisandro Dalcin if (set) *set = PETSC_TRUE; 14482d747510SLisandro Dalcin PetscFunctionReturn(0); 14492d747510SLisandro Dalcin } 14502d747510SLisandro Dalcin } else 14512d747510SLisandro Dalcin { /* slow search */ 14522d747510SLisandro Dalcin int i, N = options->N; 14532d747510SLisandro Dalcin for (i=0; i<N; i++) { 1454daabea38SBarry Smith int result = PetscOptNameCmp(options->names[i],name); 14552d747510SLisandro Dalcin if (!result) { 14562d747510SLisandro Dalcin options->used[i] = PETSC_TRUE; 14572d747510SLisandro Dalcin if (value) *value = options->values[i]; 14582d747510SLisandro Dalcin if (set) *set = PETSC_TRUE; 14592d747510SLisandro Dalcin PetscFunctionReturn(0); 14602d747510SLisandro Dalcin } else if (result > 0) { 1461e5c89e4eSSatish Balay break; 1462e5c89e4eSSatish Balay } 1463e5c89e4eSSatish Balay } 14642d747510SLisandro Dalcin } 14652d747510SLisandro Dalcin 14662d747510SLisandro Dalcin /* 14672d747510SLisandro Dalcin The following block slows down all lookups in the most frequent path (most lookups are unsuccessful). 14682d747510SLisandro Dalcin Maybe this special lookup mode should be enabled on request with a push/pop API. 14692d747510SLisandro Dalcin The feature of matching _%d_ used sparingly in the codebase. 14702d747510SLisandro Dalcin */ 14712d747510SLisandro Dalcin if (matchnumbers) { 14722d747510SLisandro Dalcin int i,j,cnt = 0,locs[16],loce[16]; 1473e5c89e4eSSatish Balay /* determine the location and number of all _%d_ in the key */ 14742d747510SLisandro Dalcin for (i=0; name[i]; i++) { 14752d747510SLisandro Dalcin if (name[i] == '_') { 14762d747510SLisandro Dalcin for (j=i+1; name[j]; j++) { 14772d747510SLisandro Dalcin if (name[j] >= '0' && name[j] <= '9') continue; 14782d747510SLisandro Dalcin if (name[j] == '_' && j > i+1) { /* found a number */ 1479e5c89e4eSSatish Balay locs[cnt] = i+1; 1480e5c89e4eSSatish Balay loce[cnt++] = j+1; 1481e5c89e4eSSatish Balay } 14822d747510SLisandro Dalcin i = j-1; 1483e5c89e4eSSatish Balay break; 1484e5c89e4eSSatish Balay } 1485e5c89e4eSSatish Balay } 1486e5c89e4eSSatish Balay } 1487e5c89e4eSSatish Balay for (i=0; i<cnt; i++) { 14882d747510SLisandro Dalcin PetscBool found; 14892d747510SLisandro Dalcin char opt[MAXOPTNAME+1] = "-", tmp[MAXOPTNAME]; 14909566063dSJacob Faibussowitsch PetscCall(PetscStrncpy(tmp,name,PetscMin((size_t)(locs[i]+1),sizeof(tmp)))); 14919566063dSJacob Faibussowitsch PetscCall(PetscStrlcat(opt,tmp,sizeof(opt))); 14929566063dSJacob Faibussowitsch PetscCall(PetscStrlcat(opt,name+loce[i],sizeof(opt))); 14939566063dSJacob Faibussowitsch PetscCall(PetscOptionsFindPair(options,NULL,opt,value,&found)); 14942d747510SLisandro Dalcin if (found) {if (set) *set = PETSC_TRUE; PetscFunctionReturn(0);} 1495e5c89e4eSSatish Balay } 1496e5c89e4eSSatish Balay } 14972d747510SLisandro Dalcin 14982d747510SLisandro Dalcin if (set) *set = PETSC_FALSE; 1499e5c89e4eSSatish Balay PetscFunctionReturn(0); 1500e5c89e4eSSatish Balay } 1501e5c89e4eSSatish Balay 1502d6ced9c0SMatthew G. Knepley /* Check whether any option begins with pre+name */ 15032d747510SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscOptionsFindPairPrefix_Private(PetscOptions options,const char pre[], const char name[],const char *value[],PetscBool *set) 1504514bf10dSMatthew G Knepley { 15052d747510SLisandro Dalcin char buf[MAXOPTNAME]; 1506d6ced9c0SMatthew G. Knepley int numCnt = 0, locs[16],loce[16]; 1507514bf10dSMatthew G Knepley 1508514bf10dSMatthew G Knepley PetscFunctionBegin; 1509c5929fdfSBarry Smith options = options ? options : defaultoptions; 1510cc73adaaSBarry Smith PetscCheck(!pre || pre[0] != '-',PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Prefix cannot begin with '-': Instead %s",pre); 1511cc73adaaSBarry Smith PetscCheck(name[0] == '-',PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Name must begin with '-': Instead %s",name); 1512514bf10dSMatthew G Knepley 15132d747510SLisandro Dalcin name++; /* skip starting dash */ 1514514bf10dSMatthew G Knepley 1515514bf10dSMatthew G Knepley /* append prefix to name, if prefix="foo_" and option='--bar", prefixed option is --foo_bar */ 15162d747510SLisandro Dalcin if (pre && pre[0]) { 15172d747510SLisandro Dalcin char *ptr = buf; 15182d747510SLisandro Dalcin if (name[0] == '-') { *ptr++ = '-'; name++; } 15199566063dSJacob Faibussowitsch PetscCall(PetscStrncpy(ptr,pre,sizeof(buf)+(size_t)(ptr-buf))); 15209566063dSJacob Faibussowitsch PetscCall(PetscStrlcat(buf,name,sizeof(buf))); 15212d747510SLisandro Dalcin name = buf; 1522514bf10dSMatthew G Knepley } 15232d747510SLisandro Dalcin 152476bd3646SJed Brown if (PetscDefined(USE_DEBUG)) { 1525514bf10dSMatthew G Knepley PetscBool valid; 15262d747510SLisandro Dalcin char key[MAXOPTNAME+1] = "-"; 15279566063dSJacob Faibussowitsch PetscCall(PetscStrncpy(key+1,name,sizeof(key)-1)); 15289566063dSJacob Faibussowitsch PetscCall(PetscOptionsValidKey(key,&valid)); 152928b400f6SJacob Faibussowitsch PetscCheck(valid,PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Invalid option '%s' obtained from pre='%s' and name='%s'",key,pre?pre:"",name); 1530514bf10dSMatthew G Knepley } 1531514bf10dSMatthew G Knepley 1532d6ced9c0SMatthew G. Knepley /* determine the location and number of all _%d_ in the key */ 1533d6ced9c0SMatthew G. Knepley { 1534d6ced9c0SMatthew G. Knepley int i,j; 1535d6ced9c0SMatthew G. Knepley for (i=0; name[i]; i++) { 1536d6ced9c0SMatthew G. Knepley if (name[i] == '_') { 1537d6ced9c0SMatthew G. Knepley for (j=i+1; name[j]; j++) { 1538d6ced9c0SMatthew G. Knepley if (name[j] >= '0' && name[j] <= '9') continue; 1539d6ced9c0SMatthew G. Knepley if (name[j] == '_' && j > i+1) { /* found a number */ 1540d6ced9c0SMatthew G. Knepley locs[numCnt] = i+1; 1541d6ced9c0SMatthew G. Knepley loce[numCnt++] = j+1; 1542d6ced9c0SMatthew G. Knepley } 1543d6ced9c0SMatthew G. Knepley i = j-1; 1544d6ced9c0SMatthew G. Knepley break; 1545d6ced9c0SMatthew G. Knepley } 1546d6ced9c0SMatthew G. Knepley } 1547d6ced9c0SMatthew G. Knepley } 1548d6ced9c0SMatthew G. Knepley } 1549d6ced9c0SMatthew G. Knepley 15502d747510SLisandro Dalcin { /* slow search */ 1551d6ced9c0SMatthew G. Knepley int c, i; 15522d747510SLisandro Dalcin size_t len; 15532d747510SLisandro Dalcin PetscBool match; 1554d6ced9c0SMatthew G. Knepley 1555d6ced9c0SMatthew G. Knepley for (c = -1; c < numCnt; ++c) { 1556d6ced9c0SMatthew G. Knepley char opt[MAXOPTNAME+1] = "", tmp[MAXOPTNAME]; 1557d6ced9c0SMatthew G. Knepley 1558d6ced9c0SMatthew G. Knepley if (c < 0) { 15599566063dSJacob Faibussowitsch PetscCall(PetscStrcpy(opt,name)); 1560d6ced9c0SMatthew G. Knepley } else { 15619566063dSJacob Faibussowitsch PetscCall(PetscStrncpy(tmp,name,PetscMin((size_t)(locs[c]+1),sizeof(tmp)))); 15629566063dSJacob Faibussowitsch PetscCall(PetscStrlcat(opt,tmp,sizeof(opt))); 15639566063dSJacob Faibussowitsch PetscCall(PetscStrlcat(opt,name+loce[c],sizeof(opt))); 1564d6ced9c0SMatthew G. Knepley } 15659566063dSJacob Faibussowitsch PetscCall(PetscStrlen(opt,&len)); 15662d747510SLisandro Dalcin for (i=0; i<options->N; i++) { 15679566063dSJacob Faibussowitsch PetscCall(PetscStrncmp(options->names[i],opt,len,&match)); 1568514bf10dSMatthew G Knepley if (match) { 1569514bf10dSMatthew G Knepley options->used[i] = PETSC_TRUE; 15702d747510SLisandro Dalcin if (value) *value = options->values[i]; 15712d747510SLisandro Dalcin if (set) *set = PETSC_TRUE; 15722d747510SLisandro Dalcin PetscFunctionReturn(0); 1573514bf10dSMatthew G Knepley } 1574514bf10dSMatthew G Knepley } 15752d747510SLisandro Dalcin } 1576d6ced9c0SMatthew G. Knepley } 15772d747510SLisandro Dalcin 15782d747510SLisandro Dalcin if (set) *set = PETSC_FALSE; 1579514bf10dSMatthew G Knepley PetscFunctionReturn(0); 1580514bf10dSMatthew G Knepley } 1581514bf10dSMatthew G Knepley 1582e5c89e4eSSatish Balay /*@C 1583e5c89e4eSSatish Balay PetscOptionsReject - Generates an error if a certain option is given. 1584e5c89e4eSSatish Balay 15851c9f3c13SBarry Smith Not Collective 1586e5c89e4eSSatish Balay 1587e5c89e4eSSatish Balay Input Parameters: 15885c9cc608SHong Zhang + options - options database, use NULL for default global database 15892d747510SLisandro Dalcin . pre - the option prefix (may be NULL) 15902d747510SLisandro Dalcin . name - the option name one is seeking 15910298fd71SBarry Smith - mess - error message (may be NULL) 1592e5c89e4eSSatish Balay 1593e5c89e4eSSatish Balay Level: advanced 1594e5c89e4eSSatish Balay 1595c2e3fba1SPatrick Sanan .seealso: `PetscOptionsGetInt()`, `PetscOptionsGetReal()`, `OptionsHasName()`, 1596db781477SPatrick Sanan `PetscOptionsGetString()`, `PetscOptionsGetIntArray()`, `PetscOptionsGetRealArray()`, `PetscOptionsBool()`, 1597db781477SPatrick Sanan `PetscOptionsName()`, `PetscOptionsBegin()`, `PetscOptionsEnd()`, `PetscOptionsHeadBegin()`, 1598c2e3fba1SPatrick Sanan `PetscOptionsStringArray()`, `PetscOptionsRealArray()`, `PetscOptionsScalar()`, 1599db781477SPatrick Sanan `PetscOptionsBoolGroupBegin()`, `PetscOptionsBoolGroup()`, `PetscOptionsBoolGroupEnd()`, 1600db781477SPatrick Sanan `PetscOptionsFList()`, `PetscOptionsEList()` 1601e5c89e4eSSatish Balay @*/ 16022d747510SLisandro Dalcin PetscErrorCode PetscOptionsReject(PetscOptions options,const char pre[],const char name[],const char mess[]) 1603e5c89e4eSSatish Balay { 1604ace3abfcSBarry Smith PetscBool flag = PETSC_FALSE; 1605e5c89e4eSSatish Balay 1606e5c89e4eSSatish Balay PetscFunctionBegin; 16079566063dSJacob Faibussowitsch PetscCall(PetscOptionsHasName(options,pre,name,&flag)); 1608e5c89e4eSSatish Balay if (flag) { 160908401ef6SPierre 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); 1610f7d195e4SLawrence Mitchell SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Program has disabled option: -%s%s",pre?pre:"",name+1); 1611e5c89e4eSSatish Balay } 1612e5c89e4eSSatish Balay PetscFunctionReturn(0); 1613e5c89e4eSSatish Balay } 1614e5c89e4eSSatish Balay 1615e5c89e4eSSatish Balay /*@C 16162d747510SLisandro Dalcin PetscOptionsHasHelp - Determines whether the "-help" option is in the database. 16172d747510SLisandro Dalcin 16182d747510SLisandro Dalcin Not Collective 16192d747510SLisandro Dalcin 16202d747510SLisandro Dalcin Input Parameters: 16212d747510SLisandro Dalcin . options - options database, use NULL for default global database 16222d747510SLisandro Dalcin 16232d747510SLisandro Dalcin Output Parameters: 16242d747510SLisandro Dalcin . set - PETSC_TRUE if found else PETSC_FALSE. 16252d747510SLisandro Dalcin 16262d747510SLisandro Dalcin Level: advanced 16272d747510SLisandro Dalcin 1628db781477SPatrick Sanan .seealso: `PetscOptionsHasName()` 16292d747510SLisandro Dalcin @*/ 16302d747510SLisandro Dalcin PetscErrorCode PetscOptionsHasHelp(PetscOptions options,PetscBool *set) 16312d747510SLisandro Dalcin { 16322d747510SLisandro Dalcin PetscFunctionBegin; 1633dadcf809SJacob Faibussowitsch PetscValidBoolPointer(set,2); 16342d747510SLisandro Dalcin options = options ? options : defaultoptions; 16352d747510SLisandro Dalcin *set = options->help; 16362d747510SLisandro Dalcin PetscFunctionReturn(0); 16372d747510SLisandro Dalcin } 16382d747510SLisandro Dalcin 1639d314f959SVaclav Hapla PetscErrorCode PetscOptionsHasHelpIntro_Internal(PetscOptions options,PetscBool *set) 1640d314f959SVaclav Hapla { 1641d314f959SVaclav Hapla PetscFunctionBegin; 1642dadcf809SJacob Faibussowitsch PetscValidBoolPointer(set,2); 1643d314f959SVaclav Hapla options = options ? options : defaultoptions; 1644d314f959SVaclav Hapla *set = options->help_intro; 1645d314f959SVaclav Hapla PetscFunctionReturn(0); 1646d314f959SVaclav Hapla } 1647d314f959SVaclav Hapla 16482d747510SLisandro Dalcin /*@C 1649e24fcbf7SPierre 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 1650e24fcbf7SPierre Jolivet if its value is set to false. 1651e5c89e4eSSatish Balay 1652e5c89e4eSSatish Balay Not Collective 1653e5c89e4eSSatish Balay 1654e5c89e4eSSatish Balay Input Parameters: 16555c9cc608SHong Zhang + options - options database, use NULL for default global database 16563de71b31SHong Zhang . pre - string to prepend to the name or NULL 16573de71b31SHong Zhang - name - the option one is seeking 1658e5c89e4eSSatish Balay 1659e5c89e4eSSatish Balay Output Parameters: 166096ef3cdfSSatish Balay . set - PETSC_TRUE if found else PETSC_FALSE. 1661e5c89e4eSSatish Balay 1662e5c89e4eSSatish Balay Level: beginner 1663e5c89e4eSSatish Balay 166495452b02SPatrick Sanan Notes: 1665acfcf0e5SJed Brown In many cases you probably want to use PetscOptionsGetBool() instead of calling this, to allowing toggling values. 166690d69ab7SBarry Smith 1667db781477SPatrick Sanan .seealso: `PetscOptionsGetInt()`, `PetscOptionsGetReal()`, 1668db781477SPatrick Sanan `PetscOptionsGetString()`, `PetscOptionsGetIntArray()`, `PetscOptionsGetRealArray()`, `PetscOptionsBool()`, 1669db781477SPatrick Sanan `PetscOptionsName()`, `PetscOptionsBegin()`, `PetscOptionsEnd()`, `PetscOptionsHeadBegin()`, 1670c2e3fba1SPatrick Sanan `PetscOptionsStringArray()`, `PetscOptionsRealArray()`, `PetscOptionsScalar()`, 1671db781477SPatrick Sanan `PetscOptionsBoolGroupBegin()`, `PetscOptionsBoolGroup()`, `PetscOptionsBoolGroupEnd()`, 1672db781477SPatrick Sanan `PetscOptionsFList()`, `PetscOptionsEList()` 1673e5c89e4eSSatish Balay @*/ 1674c5929fdfSBarry Smith PetscErrorCode PetscOptionsHasName(PetscOptions options,const char pre[],const char name[],PetscBool *set) 1675e5c89e4eSSatish Balay { 16762d747510SLisandro Dalcin const char *value; 1677ace3abfcSBarry Smith PetscBool flag; 1678e5c89e4eSSatish Balay 1679e5c89e4eSSatish Balay PetscFunctionBegin; 16809566063dSJacob Faibussowitsch PetscCall(PetscOptionsFindPair(options,pre,name,&value,&flag)); 168196ef3cdfSSatish Balay if (set) *set = flag; 1682e5c89e4eSSatish Balay PetscFunctionReturn(0); 1683e5c89e4eSSatish Balay } 1684e5c89e4eSSatish Balay 1685e5c89e4eSSatish Balay /*@C 16862d747510SLisandro Dalcin PetscOptionsGetAll - Lists all the options the program was run with in a single string. 16872d747510SLisandro Dalcin 16882d747510SLisandro Dalcin Not Collective 16892d747510SLisandro Dalcin 1690fd292e60Sprj- Input Parameter: 16912d747510SLisandro Dalcin . options - the options database, use NULL for the default global database 16922d747510SLisandro Dalcin 16932d747510SLisandro Dalcin Output Parameter: 16942d747510SLisandro Dalcin . copts - pointer where string pointer is stored 16952d747510SLisandro Dalcin 16962d747510SLisandro Dalcin Notes: 16971c9f3c13SBarry Smith The array and each entry in the array should be freed with PetscFree() 16981c9f3c13SBarry Smith Each process may have different values depending on how the options were inserted into the database 16992d747510SLisandro Dalcin 17002d747510SLisandro Dalcin Level: advanced 17012d747510SLisandro Dalcin 1702db781477SPatrick Sanan .seealso: `PetscOptionsAllUsed()`, `PetscOptionsView()`, `PetscOptionsPush()`, `PetscOptionsPop()` 17032d747510SLisandro Dalcin @*/ 17042d747510SLisandro Dalcin PetscErrorCode PetscOptionsGetAll(PetscOptions options,char *copts[]) 17052d747510SLisandro Dalcin { 17062d747510SLisandro Dalcin PetscInt i; 17072d747510SLisandro Dalcin size_t len = 1,lent = 0; 17082d747510SLisandro Dalcin char *coptions = NULL; 17092d747510SLisandro Dalcin 17102d747510SLisandro Dalcin PetscFunctionBegin; 17112d747510SLisandro Dalcin PetscValidPointer(copts,2); 17122d747510SLisandro Dalcin options = options ? options : defaultoptions; 17132d747510SLisandro Dalcin /* count the length of the required string */ 17142d747510SLisandro Dalcin for (i=0; i<options->N; i++) { 17159566063dSJacob Faibussowitsch PetscCall(PetscStrlen(options->names[i],&lent)); 17162d747510SLisandro Dalcin len += 2 + lent; 17172d747510SLisandro Dalcin if (options->values[i]) { 17189566063dSJacob Faibussowitsch PetscCall(PetscStrlen(options->values[i],&lent)); 17192d747510SLisandro Dalcin len += 1 + lent; 17202d747510SLisandro Dalcin } 17212d747510SLisandro Dalcin } 17229566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(len,&coptions)); 17232d747510SLisandro Dalcin coptions[0] = 0; 17242d747510SLisandro Dalcin for (i=0; i<options->N; i++) { 17259566063dSJacob Faibussowitsch PetscCall(PetscStrcat(coptions,"-")); 17269566063dSJacob Faibussowitsch PetscCall(PetscStrcat(coptions,options->names[i])); 17279566063dSJacob Faibussowitsch PetscCall(PetscStrcat(coptions," ")); 17282d747510SLisandro Dalcin if (options->values[i]) { 17299566063dSJacob Faibussowitsch PetscCall(PetscStrcat(coptions,options->values[i])); 17309566063dSJacob Faibussowitsch PetscCall(PetscStrcat(coptions," ")); 17312d747510SLisandro Dalcin } 17322d747510SLisandro Dalcin } 17332d747510SLisandro Dalcin *copts = coptions; 17342d747510SLisandro Dalcin PetscFunctionReturn(0); 17352d747510SLisandro Dalcin } 17362d747510SLisandro Dalcin 17372d747510SLisandro Dalcin /*@C 17382d747510SLisandro Dalcin PetscOptionsUsed - Indicates if PETSc has used a particular option set in the database 17392d747510SLisandro Dalcin 17402d747510SLisandro Dalcin Not Collective 17412d747510SLisandro Dalcin 1742d8d19677SJose E. Roman Input Parameters: 17432d747510SLisandro Dalcin + options - options database, use NULL for default global database 17442d747510SLisandro Dalcin - name - string name of option 17452d747510SLisandro Dalcin 17462d747510SLisandro Dalcin Output Parameter: 17472d747510SLisandro Dalcin . used - PETSC_TRUE if the option was used, otherwise false, including if option was not found in options database 17482d747510SLisandro Dalcin 17492d747510SLisandro Dalcin Level: advanced 17502d747510SLisandro Dalcin 17519666a313SBarry Smith Notes: 17529666a313SBarry Smith The value returned may be different on each process and depends on which options have been processed 17531c9f3c13SBarry Smith on the given process 17541c9f3c13SBarry Smith 1755db781477SPatrick Sanan .seealso: `PetscOptionsView()`, `PetscOptionsLeft()`, `PetscOptionsAllUsed()` 17562d747510SLisandro Dalcin @*/ 17572d747510SLisandro Dalcin PetscErrorCode PetscOptionsUsed(PetscOptions options,const char *name,PetscBool *used) 17582d747510SLisandro Dalcin { 17592d747510SLisandro Dalcin PetscInt i; 17602d747510SLisandro Dalcin 17612d747510SLisandro Dalcin PetscFunctionBegin; 17622d747510SLisandro Dalcin PetscValidCharPointer(name,2); 1763dadcf809SJacob Faibussowitsch PetscValidBoolPointer(used,3); 17642d747510SLisandro Dalcin options = options ? options : defaultoptions; 17652d747510SLisandro Dalcin *used = PETSC_FALSE; 17662d747510SLisandro Dalcin for (i=0; i<options->N; i++) { 17679566063dSJacob Faibussowitsch PetscCall(PetscStrcasecmp(options->names[i],name,used)); 17682d747510SLisandro Dalcin if (*used) { 17692d747510SLisandro Dalcin *used = options->used[i]; 17702d747510SLisandro Dalcin break; 17712d747510SLisandro Dalcin } 17722d747510SLisandro Dalcin } 17732d747510SLisandro Dalcin PetscFunctionReturn(0); 17742d747510SLisandro Dalcin } 17752d747510SLisandro Dalcin 1776487a658cSBarry Smith /*@ 17772d747510SLisandro Dalcin PetscOptionsAllUsed - Returns a count of the number of options in the 17782d747510SLisandro Dalcin database that have never been selected. 17792d747510SLisandro Dalcin 17802d747510SLisandro Dalcin Not Collective 17812d747510SLisandro Dalcin 17822d747510SLisandro Dalcin Input Parameter: 17832d747510SLisandro Dalcin . options - options database, use NULL for default global database 17842d747510SLisandro Dalcin 17852d747510SLisandro Dalcin Output Parameter: 17862d747510SLisandro Dalcin . N - count of options not used 17872d747510SLisandro Dalcin 17882d747510SLisandro Dalcin Level: advanced 17892d747510SLisandro Dalcin 17909666a313SBarry Smith Notes: 17919666a313SBarry Smith The value returned may be different on each process and depends on which options have been processed 17921c9f3c13SBarry Smith on the given process 17931c9f3c13SBarry Smith 1794db781477SPatrick Sanan .seealso: `PetscOptionsView()` 17952d747510SLisandro Dalcin @*/ 17962d747510SLisandro Dalcin PetscErrorCode PetscOptionsAllUsed(PetscOptions options,PetscInt *N) 17972d747510SLisandro Dalcin { 17982d747510SLisandro Dalcin PetscInt i,n = 0; 17992d747510SLisandro Dalcin 18002d747510SLisandro Dalcin PetscFunctionBegin; 18012d747510SLisandro Dalcin PetscValidIntPointer(N,2); 18022d747510SLisandro Dalcin options = options ? options : defaultoptions; 18032d747510SLisandro Dalcin for (i=0; i<options->N; i++) { 18042d747510SLisandro Dalcin if (!options->used[i]) n++; 18052d747510SLisandro Dalcin } 18062d747510SLisandro Dalcin *N = n; 18072d747510SLisandro Dalcin PetscFunctionReturn(0); 18082d747510SLisandro Dalcin } 18092d747510SLisandro Dalcin 1810487a658cSBarry Smith /*@ 18112d747510SLisandro Dalcin PetscOptionsLeft - Prints to screen any options that were set and never used. 18122d747510SLisandro Dalcin 18132d747510SLisandro Dalcin Not Collective 18142d747510SLisandro Dalcin 18152d747510SLisandro Dalcin Input Parameter: 18162d747510SLisandro Dalcin . options - options database; use NULL for default global database 18172d747510SLisandro Dalcin 18182d747510SLisandro Dalcin Options Database Key: 18193c6db4c4SPierre Jolivet . -options_left - activates PetscOptionsAllUsed() within PetscFinalize() 18202d747510SLisandro Dalcin 18213de2bfdfSBarry Smith Notes: 18223de2bfdfSBarry Smith This is rarely used directly, it is called by PetscFinalize() in debug more or if -options_left 18231c9f3c13SBarry Smith is passed otherwise to help users determine possible mistakes in their usage of options. This 18241c9f3c13SBarry Smith only prints values on process zero of PETSC_COMM_WORLD. Other processes depending the objects 18251c9f3c13SBarry Smith used may have different options that are left unused. 18263de2bfdfSBarry Smith 18272d747510SLisandro Dalcin Level: advanced 18282d747510SLisandro Dalcin 1829db781477SPatrick Sanan .seealso: `PetscOptionsAllUsed()` 18302d747510SLisandro Dalcin @*/ 18312d747510SLisandro Dalcin PetscErrorCode PetscOptionsLeft(PetscOptions options) 18322d747510SLisandro Dalcin { 18332d747510SLisandro Dalcin PetscInt i; 18343de2bfdfSBarry Smith PetscInt cnt = 0; 18353de2bfdfSBarry Smith PetscOptions toptions; 18362d747510SLisandro Dalcin 18372d747510SLisandro Dalcin PetscFunctionBegin; 18383de2bfdfSBarry Smith toptions = options ? options : defaultoptions; 18393de2bfdfSBarry Smith for (i=0; i<toptions->N; i++) { 18403de2bfdfSBarry Smith if (!toptions->used[i]) { 1841*660278c0SBarry Smith if (PetscCIOption(toptions->names[i])) continue; 18423de2bfdfSBarry Smith if (toptions->values[i]) { 18439566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD,"Option left: name:-%s value: %s\n",toptions->names[i],toptions->values[i])); 18442d747510SLisandro Dalcin } else { 18459566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD,"Option left: name:-%s (no value)\n",toptions->names[i])); 18462d747510SLisandro Dalcin } 18472d747510SLisandro Dalcin } 18482d747510SLisandro Dalcin } 18493de2bfdfSBarry Smith if (!options) { 18503de2bfdfSBarry Smith toptions = defaultoptions; 18513de2bfdfSBarry Smith while (toptions->previous) { 18523de2bfdfSBarry Smith cnt++; 18533de2bfdfSBarry Smith toptions = toptions->previous; 18543de2bfdfSBarry Smith } 18553de2bfdfSBarry Smith if (cnt) { 18569566063dSJacob Faibussowitsch 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)); 18573de2bfdfSBarry Smith } 18583de2bfdfSBarry Smith } 18592d747510SLisandro Dalcin PetscFunctionReturn(0); 18602d747510SLisandro Dalcin } 18612d747510SLisandro Dalcin 18622d747510SLisandro Dalcin /*@C 18632d747510SLisandro Dalcin PetscOptionsLeftGet - Returns all options that were set and never used. 18642d747510SLisandro Dalcin 18652d747510SLisandro Dalcin Not Collective 18662d747510SLisandro Dalcin 18672d747510SLisandro Dalcin Input Parameter: 18682d747510SLisandro Dalcin . options - options database, use NULL for default global database 18692d747510SLisandro Dalcin 1870d8d19677SJose E. Roman Output Parameters: 1871a2b725a8SWilliam Gropp + N - count of options not used 18722d747510SLisandro Dalcin . names - names of options not used 1873a2b725a8SWilliam Gropp - values - values of options not used 18742d747510SLisandro Dalcin 18752d747510SLisandro Dalcin Level: advanced 18762d747510SLisandro Dalcin 18772d747510SLisandro Dalcin Notes: 18782d747510SLisandro Dalcin Users should call PetscOptionsLeftRestore() to free the memory allocated in this routine 18791c9f3c13SBarry Smith Notes: The value returned may be different on each process and depends on which options have been processed 18801c9f3c13SBarry Smith on the given process 18812d747510SLisandro Dalcin 1882db781477SPatrick Sanan .seealso: `PetscOptionsAllUsed()`, `PetscOptionsLeft()` 18832d747510SLisandro Dalcin @*/ 18842d747510SLisandro Dalcin PetscErrorCode PetscOptionsLeftGet(PetscOptions options,PetscInt *N,char **names[],char **values[]) 18852d747510SLisandro Dalcin { 18862d747510SLisandro Dalcin PetscInt i,n; 18872d747510SLisandro Dalcin 18882d747510SLisandro Dalcin PetscFunctionBegin; 18892d747510SLisandro Dalcin if (N) PetscValidIntPointer(N,2); 18902d747510SLisandro Dalcin if (names) PetscValidPointer(names,3); 18912d747510SLisandro Dalcin if (values) PetscValidPointer(values,4); 18922d747510SLisandro Dalcin options = options ? options : defaultoptions; 18932d747510SLisandro Dalcin 18942d747510SLisandro Dalcin /* The number of unused PETSc options */ 18952d747510SLisandro Dalcin n = 0; 18962d747510SLisandro Dalcin for (i=0; i<options->N; i++) { 1897*660278c0SBarry Smith if (PetscCIOption(options->names[i])) continue; 18982d747510SLisandro Dalcin if (!options->used[i]) n++; 18992d747510SLisandro Dalcin } 19002d747510SLisandro Dalcin if (N) { *N = n; } 19019566063dSJacob Faibussowitsch if (names) PetscCall(PetscMalloc1(n,names)); 19029566063dSJacob Faibussowitsch if (values) PetscCall(PetscMalloc1(n,values)); 19032d747510SLisandro Dalcin 19042d747510SLisandro Dalcin n = 0; 19052d747510SLisandro Dalcin if (names || values) { 19062d747510SLisandro Dalcin for (i=0; i<options->N; i++) { 19072d747510SLisandro Dalcin if (!options->used[i]) { 1908*660278c0SBarry Smith if (PetscCIOption(options->names[i])) continue; 19092d747510SLisandro Dalcin if (names) (*names)[n] = options->names[i]; 19102d747510SLisandro Dalcin if (values) (*values)[n] = options->values[i]; 19112d747510SLisandro Dalcin n++; 19122d747510SLisandro Dalcin } 19132d747510SLisandro Dalcin } 19142d747510SLisandro Dalcin } 19152d747510SLisandro Dalcin PetscFunctionReturn(0); 19162d747510SLisandro Dalcin } 19172d747510SLisandro Dalcin 19182d747510SLisandro Dalcin /*@C 19192d747510SLisandro Dalcin PetscOptionsLeftRestore - Free memory for the unused PETSc options obtained using PetscOptionsLeftGet. 19202d747510SLisandro Dalcin 19212d747510SLisandro Dalcin Not Collective 19222d747510SLisandro Dalcin 1923d8d19677SJose E. Roman Input Parameters: 1924a2b725a8SWilliam Gropp + options - options database, use NULL for default global database 19252d747510SLisandro Dalcin . names - names of options not used 1926a2b725a8SWilliam Gropp - values - values of options not used 19272d747510SLisandro Dalcin 19282d747510SLisandro Dalcin Level: advanced 19292d747510SLisandro Dalcin 1930db781477SPatrick Sanan .seealso: `PetscOptionsAllUsed()`, `PetscOptionsLeft()`, `PetscOptionsLeftGet()` 19312d747510SLisandro Dalcin @*/ 19322d747510SLisandro Dalcin PetscErrorCode PetscOptionsLeftRestore(PetscOptions options,PetscInt *N,char **names[],char **values[]) 19332d747510SLisandro Dalcin { 19342d747510SLisandro Dalcin PetscFunctionBegin; 19352d747510SLisandro Dalcin if (N) PetscValidIntPointer(N,2); 19362d747510SLisandro Dalcin if (names) PetscValidPointer(names,3); 19372d747510SLisandro Dalcin if (values) PetscValidPointer(values,4); 19382d747510SLisandro Dalcin if (N) { *N = 0; } 19399566063dSJacob Faibussowitsch if (names) PetscCall(PetscFree(*names)); 19409566063dSJacob Faibussowitsch if (values) PetscCall(PetscFree(*values)); 19412d747510SLisandro Dalcin PetscFunctionReturn(0); 19422d747510SLisandro Dalcin } 19432d747510SLisandro Dalcin 19442d747510SLisandro Dalcin /*@C 19459060e2f9SVaclav Hapla PetscOptionsMonitorDefault - Print all options set value events using the supplied PetscViewer. 19462d747510SLisandro Dalcin 19471c9f3c13SBarry Smith Logically Collective on ctx 19482d747510SLisandro Dalcin 19492d747510SLisandro Dalcin Input Parameters: 19502d747510SLisandro Dalcin + name - option name string 19512d747510SLisandro Dalcin . value - option value string 19529060e2f9SVaclav Hapla - ctx - an ASCII viewer or NULL 19532d747510SLisandro Dalcin 19542d747510SLisandro Dalcin Level: intermediate 19552d747510SLisandro Dalcin 19569666a313SBarry Smith Notes: 19579060e2f9SVaclav Hapla If ctx=NULL, PetscPrintf() is used. 19589666a313SBarry Smith The first MPI rank in the PetscViewer viewer actually prints the values, other 19591c9f3c13SBarry Smith processes may have different values set 19601c9f3c13SBarry Smith 1961*660278c0SBarry Smith If PetscCIEnabled then do not print the test harness options 1962*660278c0SBarry Smith 1963db781477SPatrick Sanan .seealso: `PetscOptionsMonitorSet()` 19642d747510SLisandro Dalcin @*/ 19652d747510SLisandro Dalcin PetscErrorCode PetscOptionsMonitorDefault(const char name[],const char value[],void *ctx) 19662d747510SLisandro Dalcin { 19672d747510SLisandro Dalcin PetscFunctionBegin; 1968*660278c0SBarry Smith if (PetscCIOption(name)) PetscFunctionReturn(0); 1969*660278c0SBarry Smith 19709060e2f9SVaclav Hapla if (ctx) { 19719060e2f9SVaclav Hapla PetscViewer viewer = (PetscViewer)ctx; 19722d747510SLisandro Dalcin if (!value) { 19739566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer,"Removing option: %s\n",name)); 19742d747510SLisandro Dalcin } else if (!value[0]) { 19759566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer,"Setting option: %s (no value)\n",name)); 19762d747510SLisandro Dalcin } else { 19779566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer,"Setting option: %s = %s\n",name,value)); 19782d747510SLisandro Dalcin } 19799060e2f9SVaclav Hapla } else { 19809060e2f9SVaclav Hapla MPI_Comm comm = PETSC_COMM_WORLD; 19819060e2f9SVaclav Hapla if (!value) { 19829566063dSJacob Faibussowitsch PetscCall(PetscPrintf(comm,"Removing option: %s\n",name)); 19839060e2f9SVaclav Hapla } else if (!value[0]) { 19849566063dSJacob Faibussowitsch PetscCall(PetscPrintf(comm,"Setting option: %s (no value)\n",name)); 19859060e2f9SVaclav Hapla } else { 19869566063dSJacob Faibussowitsch PetscCall(PetscPrintf(comm,"Setting option: %s = %s\n",name,value)); 19879060e2f9SVaclav Hapla } 19889060e2f9SVaclav Hapla } 19892d747510SLisandro Dalcin PetscFunctionReturn(0); 19902d747510SLisandro Dalcin } 19912d747510SLisandro Dalcin 19922d747510SLisandro Dalcin /*@C 19932d747510SLisandro Dalcin PetscOptionsMonitorSet - Sets an ADDITIONAL function to be called at every method that 19942d747510SLisandro Dalcin modified the PETSc options database. 19952d747510SLisandro Dalcin 19962d747510SLisandro Dalcin Not Collective 19972d747510SLisandro Dalcin 19982d747510SLisandro Dalcin Input Parameters: 19992d747510SLisandro Dalcin + monitor - pointer to function (if this is NULL, it turns off monitoring 20002d747510SLisandro Dalcin . mctx - [optional] context for private data for the 20012d747510SLisandro Dalcin monitor routine (use NULL if no context is desired) 20022d747510SLisandro Dalcin - monitordestroy - [optional] routine that frees monitor context 20032d747510SLisandro Dalcin (may be NULL) 20042d747510SLisandro Dalcin 20052d747510SLisandro Dalcin Calling Sequence of monitor: 20062d747510SLisandro Dalcin $ monitor (const char name[], const char value[], void *mctx) 20072d747510SLisandro Dalcin 20082d747510SLisandro Dalcin + name - option name string 20092d747510SLisandro Dalcin . value - option value string 20102d747510SLisandro Dalcin - mctx - optional monitoring context, as set by PetscOptionsMonitorSet() 20112d747510SLisandro Dalcin 20122d747510SLisandro Dalcin Options Database Keys: 2013c5b5d8d5SVaclav Hapla See PetscInitialize() for options related to option database monitoring. 20142d747510SLisandro Dalcin 20152d747510SLisandro Dalcin Notes: 20162d747510SLisandro Dalcin The default is to do nothing. To print the name and value of options 20172d747510SLisandro Dalcin being inserted into the database, use PetscOptionsMonitorDefault() as the monitoring routine, 20182d747510SLisandro Dalcin with a null monitoring context. 20192d747510SLisandro Dalcin 20202d747510SLisandro Dalcin Several different monitoring routines may be set by calling 20212d747510SLisandro Dalcin PetscOptionsMonitorSet() multiple times; all will be called in the 20222d747510SLisandro Dalcin order in which they were set. 20232d747510SLisandro Dalcin 20249060e2f9SVaclav Hapla Level: intermediate 20252d747510SLisandro Dalcin 2026db781477SPatrick Sanan .seealso: `PetscOptionsMonitorDefault()`, `PetscInitialize()` 20272d747510SLisandro Dalcin @*/ 20282d747510SLisandro Dalcin PetscErrorCode PetscOptionsMonitorSet(PetscErrorCode (*monitor)(const char name[], const char value[], void*),void *mctx,PetscErrorCode (*monitordestroy)(void**)) 20292d747510SLisandro Dalcin { 20302d747510SLisandro Dalcin PetscOptions options = defaultoptions; 20312d747510SLisandro Dalcin 20322d747510SLisandro Dalcin PetscFunctionBegin; 2033c5b5d8d5SVaclav Hapla if (options->monitorCancel) PetscFunctionReturn(0); 203408401ef6SPierre Jolivet PetscCheck(options->numbermonitors < MAXOPTIONSMONITORS,PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Too many PetscOptions monitors set"); 20352d747510SLisandro Dalcin options->monitor[options->numbermonitors] = monitor; 20362d747510SLisandro Dalcin options->monitordestroy[options->numbermonitors] = monitordestroy; 20372d747510SLisandro Dalcin options->monitorcontext[options->numbermonitors++] = (void*)mctx; 20382d747510SLisandro Dalcin PetscFunctionReturn(0); 20392d747510SLisandro Dalcin } 20402d747510SLisandro Dalcin 20412d747510SLisandro Dalcin /* 20422d747510SLisandro Dalcin PetscOptionsStringToBool - Converts string to PetscBool, handles cases like "yes", "no", "true", "false", "0", "1", "off", "on". 204363fe8743SVaclav Hapla Empty string is considered as true. 20442d747510SLisandro Dalcin */ 20452d747510SLisandro Dalcin PetscErrorCode PetscOptionsStringToBool(const char value[],PetscBool *a) 20462d747510SLisandro Dalcin { 20472d747510SLisandro Dalcin PetscBool istrue,isfalse; 20482d747510SLisandro Dalcin size_t len; 20492d747510SLisandro Dalcin 20502d747510SLisandro Dalcin PetscFunctionBegin; 205163fe8743SVaclav Hapla /* PetscStrlen() returns 0 for NULL or "" */ 20529566063dSJacob Faibussowitsch PetscCall(PetscStrlen(value,&len)); 205363fe8743SVaclav Hapla if (!len) {*a = PETSC_TRUE; PetscFunctionReturn(0);} 20549566063dSJacob Faibussowitsch PetscCall(PetscStrcasecmp(value,"TRUE",&istrue)); 20552d747510SLisandro Dalcin if (istrue) {*a = PETSC_TRUE; PetscFunctionReturn(0);} 20569566063dSJacob Faibussowitsch PetscCall(PetscStrcasecmp(value,"YES",&istrue)); 20572d747510SLisandro Dalcin if (istrue) {*a = PETSC_TRUE; PetscFunctionReturn(0);} 20589566063dSJacob Faibussowitsch PetscCall(PetscStrcasecmp(value,"1",&istrue)); 20592d747510SLisandro Dalcin if (istrue) {*a = PETSC_TRUE; PetscFunctionReturn(0);} 20609566063dSJacob Faibussowitsch PetscCall(PetscStrcasecmp(value,"on",&istrue)); 20612d747510SLisandro Dalcin if (istrue) {*a = PETSC_TRUE; PetscFunctionReturn(0);} 20629566063dSJacob Faibussowitsch PetscCall(PetscStrcasecmp(value,"FALSE",&isfalse)); 20632d747510SLisandro Dalcin if (isfalse) {*a = PETSC_FALSE; PetscFunctionReturn(0);} 20649566063dSJacob Faibussowitsch PetscCall(PetscStrcasecmp(value,"NO",&isfalse)); 20652d747510SLisandro Dalcin if (isfalse) {*a = PETSC_FALSE; PetscFunctionReturn(0);} 20669566063dSJacob Faibussowitsch PetscCall(PetscStrcasecmp(value,"0",&isfalse)); 20672d747510SLisandro Dalcin if (isfalse) {*a = PETSC_FALSE; PetscFunctionReturn(0);} 20689566063dSJacob Faibussowitsch PetscCall(PetscStrcasecmp(value,"off",&isfalse)); 20692d747510SLisandro Dalcin if (isfalse) {*a = PETSC_FALSE; PetscFunctionReturn(0);} 207098921bdaSJacob Faibussowitsch SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Unknown logical value: %s",value); 20712d747510SLisandro Dalcin } 20722d747510SLisandro Dalcin 20732d747510SLisandro Dalcin /* 20742d747510SLisandro Dalcin PetscOptionsStringToInt - Converts a string to an integer value. Handles special cases such as "default" and "decide" 20752d747510SLisandro Dalcin */ 20762d747510SLisandro Dalcin PetscErrorCode PetscOptionsStringToInt(const char name[],PetscInt *a) 20772d747510SLisandro Dalcin { 20782d747510SLisandro Dalcin size_t len; 20792d747510SLisandro Dalcin PetscBool decide,tdefault,mouse; 20802d747510SLisandro Dalcin 20812d747510SLisandro Dalcin PetscFunctionBegin; 20829566063dSJacob Faibussowitsch PetscCall(PetscStrlen(name,&len)); 20835f80ce2aSJacob Faibussowitsch PetscCheck(len,PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"character string of length zero has no numerical value"); 20842d747510SLisandro Dalcin 20859566063dSJacob Faibussowitsch PetscCall(PetscStrcasecmp(name,"PETSC_DEFAULT",&tdefault)); 20862d747510SLisandro Dalcin if (!tdefault) { 20879566063dSJacob Faibussowitsch PetscCall(PetscStrcasecmp(name,"DEFAULT",&tdefault)); 20882d747510SLisandro Dalcin } 20899566063dSJacob Faibussowitsch PetscCall(PetscStrcasecmp(name,"PETSC_DECIDE",&decide)); 20902d747510SLisandro Dalcin if (!decide) { 20919566063dSJacob Faibussowitsch PetscCall(PetscStrcasecmp(name,"DECIDE",&decide)); 20922d747510SLisandro Dalcin } 20939566063dSJacob Faibussowitsch PetscCall(PetscStrcasecmp(name,"mouse",&mouse)); 20942d747510SLisandro Dalcin 20952d747510SLisandro Dalcin if (tdefault) *a = PETSC_DEFAULT; 20962d747510SLisandro Dalcin else if (decide) *a = PETSC_DECIDE; 20972d747510SLisandro Dalcin else if (mouse) *a = -1; 20982d747510SLisandro Dalcin else { 20992d747510SLisandro Dalcin char *endptr; 21002d747510SLisandro Dalcin long strtolval; 21012d747510SLisandro Dalcin 21022d747510SLisandro Dalcin strtolval = strtol(name,&endptr,10); 2103cc73adaaSBarry 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); 21042d747510SLisandro Dalcin 21052d747510SLisandro Dalcin #if defined(PETSC_USE_64BIT_INDICES) && defined(PETSC_HAVE_ATOLL) 21062d747510SLisandro Dalcin (void) strtolval; 21072d747510SLisandro Dalcin *a = atoll(name); 21082d747510SLisandro Dalcin #elif defined(PETSC_USE_64BIT_INDICES) && defined(PETSC_HAVE___INT64) 21092d747510SLisandro Dalcin (void) strtolval; 21102d747510SLisandro Dalcin *a = _atoi64(name); 21112d747510SLisandro Dalcin #else 21122d747510SLisandro Dalcin *a = (PetscInt)strtolval; 21132d747510SLisandro Dalcin #endif 21142d747510SLisandro Dalcin } 21152d747510SLisandro Dalcin PetscFunctionReturn(0); 21162d747510SLisandro Dalcin } 21172d747510SLisandro Dalcin 21182d747510SLisandro Dalcin #if defined(PETSC_USE_REAL___FLOAT128) 21192d747510SLisandro Dalcin #include <quadmath.h> 21202d747510SLisandro Dalcin #endif 21212d747510SLisandro Dalcin 21222d747510SLisandro Dalcin static PetscErrorCode PetscStrtod(const char name[],PetscReal *a,char **endptr) 21232d747510SLisandro Dalcin { 21242d747510SLisandro Dalcin PetscFunctionBegin; 21252d747510SLisandro Dalcin #if defined(PETSC_USE_REAL___FLOAT128) 21262d747510SLisandro Dalcin *a = strtoflt128(name,endptr); 21272d747510SLisandro Dalcin #else 21282d747510SLisandro Dalcin *a = (PetscReal)strtod(name,endptr); 21292d747510SLisandro Dalcin #endif 21302d747510SLisandro Dalcin PetscFunctionReturn(0); 21312d747510SLisandro Dalcin } 21322d747510SLisandro Dalcin 21332d747510SLisandro Dalcin static PetscErrorCode PetscStrtoz(const char name[],PetscScalar *a,char **endptr,PetscBool *isImaginary) 21342d747510SLisandro Dalcin { 21352d747510SLisandro Dalcin PetscBool hasi = PETSC_FALSE; 21362d747510SLisandro Dalcin char *ptr; 21372d747510SLisandro Dalcin PetscReal strtoval; 21382d747510SLisandro Dalcin 21392d747510SLisandro Dalcin PetscFunctionBegin; 21409566063dSJacob Faibussowitsch PetscCall(PetscStrtod(name,&strtoval,&ptr)); 21412d747510SLisandro Dalcin if (ptr == name) { 21422d747510SLisandro Dalcin strtoval = 1.; 21432d747510SLisandro Dalcin hasi = PETSC_TRUE; 21442d747510SLisandro Dalcin if (name[0] == 'i') { 21452d747510SLisandro Dalcin ptr++; 21462d747510SLisandro Dalcin } else if (name[0] == '+' && name[1] == 'i') { 21472d747510SLisandro Dalcin ptr += 2; 21482d747510SLisandro Dalcin } else if (name[0] == '-' && name[1] == 'i') { 21492d747510SLisandro Dalcin strtoval = -1.; 21502d747510SLisandro Dalcin ptr += 2; 21512d747510SLisandro Dalcin } 21522d747510SLisandro Dalcin } else if (*ptr == 'i') { 21532d747510SLisandro Dalcin hasi = PETSC_TRUE; 21542d747510SLisandro Dalcin ptr++; 21552d747510SLisandro Dalcin } 21562d747510SLisandro Dalcin *endptr = ptr; 21572d747510SLisandro Dalcin *isImaginary = hasi; 21582d747510SLisandro Dalcin if (hasi) { 21592d747510SLisandro Dalcin #if !defined(PETSC_USE_COMPLEX) 216098921bdaSJacob Faibussowitsch SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Input string %s contains imaginary but complex not supported ",name); 21612d747510SLisandro Dalcin #else 21622d747510SLisandro Dalcin *a = PetscCMPLX(0.,strtoval); 21632d747510SLisandro Dalcin #endif 21642d747510SLisandro Dalcin } else { 21652d747510SLisandro Dalcin *a = strtoval; 21662d747510SLisandro Dalcin } 21672d747510SLisandro Dalcin PetscFunctionReturn(0); 21682d747510SLisandro Dalcin } 21692d747510SLisandro Dalcin 21702d747510SLisandro Dalcin /* 21712d747510SLisandro Dalcin Converts a string to PetscReal value. Handles special cases like "default" and "decide" 21722d747510SLisandro Dalcin */ 21732d747510SLisandro Dalcin PetscErrorCode PetscOptionsStringToReal(const char name[],PetscReal *a) 21742d747510SLisandro Dalcin { 21752d747510SLisandro Dalcin size_t len; 21762d747510SLisandro Dalcin PetscBool match; 21772d747510SLisandro Dalcin char *endptr; 21782d747510SLisandro Dalcin 21792d747510SLisandro Dalcin PetscFunctionBegin; 21809566063dSJacob Faibussowitsch PetscCall(PetscStrlen(name,&len)); 218128b400f6SJacob Faibussowitsch PetscCheck(len,PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"String of length zero has no numerical value"); 21822d747510SLisandro Dalcin 21839566063dSJacob Faibussowitsch PetscCall(PetscStrcasecmp(name,"PETSC_DEFAULT",&match)); 21849566063dSJacob Faibussowitsch if (!match) PetscCall(PetscStrcasecmp(name,"DEFAULT",&match)); 21852d747510SLisandro Dalcin if (match) {*a = PETSC_DEFAULT; PetscFunctionReturn(0);} 21862d747510SLisandro Dalcin 21879566063dSJacob Faibussowitsch PetscCall(PetscStrcasecmp(name,"PETSC_DECIDE",&match)); 21889566063dSJacob Faibussowitsch if (!match) PetscCall(PetscStrcasecmp(name,"DECIDE",&match)); 21892d747510SLisandro Dalcin if (match) {*a = PETSC_DECIDE; PetscFunctionReturn(0);} 21902d747510SLisandro Dalcin 21919566063dSJacob Faibussowitsch PetscCall(PetscStrtod(name,a,&endptr)); 219239a651e2SJacob Faibussowitsch PetscCheck((size_t) (endptr - name) == len,PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Input string %s has no numeric value",name); 21932d747510SLisandro Dalcin PetscFunctionReturn(0); 21942d747510SLisandro Dalcin } 21952d747510SLisandro Dalcin 21962d747510SLisandro Dalcin PetscErrorCode PetscOptionsStringToScalar(const char name[],PetscScalar *a) 21972d747510SLisandro Dalcin { 21982d747510SLisandro Dalcin PetscBool imag1; 21992d747510SLisandro Dalcin size_t len; 22002d747510SLisandro Dalcin PetscScalar val = 0.; 22012d747510SLisandro Dalcin char *ptr = NULL; 22022d747510SLisandro Dalcin 22032d747510SLisandro Dalcin PetscFunctionBegin; 22049566063dSJacob Faibussowitsch PetscCall(PetscStrlen(name,&len)); 220528b400f6SJacob Faibussowitsch PetscCheck(len,PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"character string of length zero has no numerical value"); 22069566063dSJacob Faibussowitsch PetscCall(PetscStrtoz(name,&val,&ptr,&imag1)); 22072d747510SLisandro Dalcin #if defined(PETSC_USE_COMPLEX) 22082d747510SLisandro Dalcin if ((size_t) (ptr - name) < len) { 22092d747510SLisandro Dalcin PetscBool imag2; 22102d747510SLisandro Dalcin PetscScalar val2; 22112d747510SLisandro Dalcin 22129566063dSJacob Faibussowitsch PetscCall(PetscStrtoz(ptr,&val2,&ptr,&imag2)); 221339a651e2SJacob Faibussowitsch if (imag1) PetscCheck(imag2,PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Input string %s: must specify imaginary component second",name); 22142d747510SLisandro Dalcin val = PetscCMPLX(PetscRealPart(val),PetscImaginaryPart(val2)); 22152d747510SLisandro Dalcin } 22162d747510SLisandro Dalcin #endif 221739a651e2SJacob Faibussowitsch PetscCheck((size_t) (ptr - name) == len,PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Input string %s has no numeric value ",name); 22182d747510SLisandro Dalcin *a = val; 22192d747510SLisandro Dalcin PetscFunctionReturn(0); 22202d747510SLisandro Dalcin } 22212d747510SLisandro Dalcin 22222d747510SLisandro Dalcin /*@C 22232d747510SLisandro Dalcin PetscOptionsGetBool - Gets the Logical (true or false) value for a particular 22242d747510SLisandro Dalcin option in the database. 2225e5c89e4eSSatish Balay 2226e5c89e4eSSatish Balay Not Collective 2227e5c89e4eSSatish Balay 2228e5c89e4eSSatish Balay Input Parameters: 22295c9cc608SHong Zhang + options - options database, use NULL for default global database 2230c5929fdfSBarry Smith . pre - the string to prepend to the name or NULL 2231e5c89e4eSSatish Balay - name - the option one is seeking 2232e5c89e4eSSatish Balay 2233d8d19677SJose E. Roman Output Parameters: 22342d747510SLisandro Dalcin + ivalue - the logical value to return 223596ef3cdfSSatish Balay - set - PETSC_TRUE if found, else PETSC_FALSE 2236e5c89e4eSSatish Balay 2237e5c89e4eSSatish Balay Level: beginner 2238e5c89e4eSSatish Balay 223995452b02SPatrick Sanan Notes: 22402d747510SLisandro Dalcin TRUE, true, YES, yes, nostring, and 1 all translate to PETSC_TRUE 22412d747510SLisandro Dalcin FALSE, false, NO, no, and 0 all translate to PETSC_FALSE 22422d747510SLisandro Dalcin 22432d747510SLisandro Dalcin If the option is given, but no value is provided, then ivalue and set are both given the value PETSC_TRUE. That is -requested_bool 22442d747510SLisandro Dalcin is equivalent to -requested_bool true 22452d747510SLisandro Dalcin 22462d747510SLisandro Dalcin If the user does not supply the option at all ivalue is NOT changed. Thus 22472efd9cb1SBarry Smith you should ALWAYS initialize the ivalue if you access it without first checking if the set flag is true. 22482efd9cb1SBarry Smith 2249db781477SPatrick Sanan .seealso: `PetscOptionsGetReal()`, `PetscOptionsHasName()`, `PetscOptionsGetString()`, 2250db781477SPatrick Sanan `PetscOptionsGetIntArray()`, `PetscOptionsGetRealArray()`, `PetscOptionsGetInt()`, `PetscOptionsBool()`, 2251db781477SPatrick Sanan `PetscOptionsName()`, `PetscOptionsBegin()`, `PetscOptionsEnd()`, `PetscOptionsHeadBegin()`, 2252c2e3fba1SPatrick Sanan `PetscOptionsStringArray()`, `PetscOptionsRealArray()`, `PetscOptionsScalar()`, 2253db781477SPatrick Sanan `PetscOptionsBoolGroupBegin()`, `PetscOptionsBoolGroup()`, `PetscOptionsBoolGroupEnd()`, 2254db781477SPatrick Sanan `PetscOptionsFList()`, `PetscOptionsEList()` 2255e5c89e4eSSatish Balay @*/ 22562d747510SLisandro Dalcin PetscErrorCode PetscOptionsGetBool(PetscOptions options,const char pre[],const char name[],PetscBool *ivalue,PetscBool *set) 2257e5c89e4eSSatish Balay { 22582d747510SLisandro Dalcin const char *value; 2259ace3abfcSBarry Smith PetscBool flag; 2260e5c89e4eSSatish Balay 2261e5c89e4eSSatish Balay PetscFunctionBegin; 22622d747510SLisandro Dalcin PetscValidCharPointer(name,3); 2263064a246eSJacob Faibussowitsch if (ivalue) PetscValidBoolPointer(ivalue,4); 22649566063dSJacob Faibussowitsch PetscCall(PetscOptionsFindPair(options,pre,name,&value,&flag)); 2265e5c89e4eSSatish Balay if (flag) { 226696ef3cdfSSatish Balay if (set) *set = PETSC_TRUE; 22679566063dSJacob Faibussowitsch PetscCall(PetscOptionsStringToBool(value, &flag)); 22682d747510SLisandro Dalcin if (ivalue) *ivalue = flag; 2269e5c89e4eSSatish Balay } else { 227096ef3cdfSSatish Balay if (set) *set = PETSC_FALSE; 2271e5c89e4eSSatish Balay } 2272e5c89e4eSSatish Balay PetscFunctionReturn(0); 2273e5c89e4eSSatish Balay } 2274e5c89e4eSSatish Balay 2275e5c89e4eSSatish Balay /*@C 2276e5c89e4eSSatish Balay PetscOptionsGetEList - Puts a list of option values that a single one may be selected from 2277e5c89e4eSSatish Balay 2278e5c89e4eSSatish Balay Not Collective 2279e5c89e4eSSatish Balay 2280e5c89e4eSSatish Balay Input Parameters: 22815c9cc608SHong Zhang + options - options database, use NULL for default global database 2282c5929fdfSBarry Smith . pre - the string to prepend to the name or NULL 2283e5c89e4eSSatish Balay . opt - option name 2284a264d7a6SBarry Smith . list - the possible choices (one of these must be selected, anything else is invalid) 2285a2b725a8SWilliam Gropp - ntext - number of choices 2286e5c89e4eSSatish Balay 2287d8d19677SJose E. Roman Output Parameters: 22882efd9cb1SBarry Smith + value - the index of the value to return (defaults to zero if the option name is given but no choice is listed) 2289e5c89e4eSSatish Balay - set - PETSC_TRUE if found, else PETSC_FALSE 2290e5c89e4eSSatish Balay 2291e5c89e4eSSatish Balay Level: intermediate 2292e5c89e4eSSatish Balay 229395452b02SPatrick Sanan Notes: 229495452b02SPatrick Sanan If the user does not supply the option value is NOT changed. Thus 22952efd9cb1SBarry Smith you should ALWAYS initialize the ivalue if you access it without first checking if the set flag is true. 22962efd9cb1SBarry Smith 2297a264d7a6SBarry Smith See PetscOptionsFList() for when the choices are given in a PetscFunctionList() 2298e5c89e4eSSatish Balay 2299db781477SPatrick Sanan .seealso: `PetscOptionsGetInt()`, `PetscOptionsGetReal()`, 2300db781477SPatrick Sanan `PetscOptionsHasName()`, `PetscOptionsGetIntArray()`, `PetscOptionsGetRealArray()`, `PetscOptionsBool()`, 2301db781477SPatrick Sanan `PetscOptionsName()`, `PetscOptionsBegin()`, `PetscOptionsEnd()`, `PetscOptionsHeadBegin()`, 2302c2e3fba1SPatrick Sanan `PetscOptionsStringArray()`, `PetscOptionsRealArray()`, `PetscOptionsScalar()`, 2303db781477SPatrick Sanan `PetscOptionsBoolGroupBegin()`, `PetscOptionsBoolGroup()`, `PetscOptionsBoolGroupEnd()`, 2304db781477SPatrick Sanan `PetscOptionsFList()`, `PetscOptionsEList()` 2305e5c89e4eSSatish Balay @*/ 2306c5929fdfSBarry Smith PetscErrorCode PetscOptionsGetEList(PetscOptions options,const char pre[],const char opt[],const char * const *list,PetscInt ntext,PetscInt *value,PetscBool *set) 2307e5c89e4eSSatish Balay { 230858b0ac4eSStefano Zampini size_t alen,len = 0, tlen = 0; 2309e5c89e4eSSatish Balay char *svalue; 2310ace3abfcSBarry Smith PetscBool aset,flg = PETSC_FALSE; 2311e5c89e4eSSatish Balay PetscInt i; 2312e5c89e4eSSatish Balay 2313e5c89e4eSSatish Balay PetscFunctionBegin; 23142d747510SLisandro Dalcin PetscValidCharPointer(opt,3); 2315e5c89e4eSSatish Balay for (i=0; i<ntext; i++) { 23169566063dSJacob Faibussowitsch PetscCall(PetscStrlen(list[i],&alen)); 2317e5c89e4eSSatish Balay if (alen > len) len = alen; 231858b0ac4eSStefano Zampini tlen += len + 1; 2319e5c89e4eSSatish Balay } 2320e5c89e4eSSatish Balay len += 5; /* a little extra space for user mistypes */ 23219566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(len,&svalue)); 23229566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetString(options,pre,opt,svalue,len,&aset)); 2323e5c89e4eSSatish Balay if (aset) { 23249566063dSJacob Faibussowitsch PetscCall(PetscEListFind(ntext,list,svalue,value,&flg)); 232558b0ac4eSStefano Zampini if (!flg) { 232658b0ac4eSStefano Zampini char *avail,*pavl; 232758b0ac4eSStefano Zampini 23289566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(tlen,&avail)); 232958b0ac4eSStefano Zampini pavl = avail; 233058b0ac4eSStefano Zampini for (i=0; i<ntext; i++) { 23319566063dSJacob Faibussowitsch PetscCall(PetscStrlen(list[i],&alen)); 23329566063dSJacob Faibussowitsch PetscCall(PetscStrcpy(pavl,list[i])); 233358b0ac4eSStefano Zampini pavl += alen; 23349566063dSJacob Faibussowitsch PetscCall(PetscStrcpy(pavl," ")); 233558b0ac4eSStefano Zampini pavl += 1; 233658b0ac4eSStefano Zampini } 23379566063dSJacob Faibussowitsch PetscCall(PetscStrtolower(avail)); 233898921bdaSJacob Faibussowitsch SETERRQ(PETSC_COMM_SELF,PETSC_ERR_USER,"Unknown option %s for -%s%s. Available options: %s",svalue,pre ? pre : "",opt+1,avail); 233958b0ac4eSStefano Zampini } 2340fbedd5e0SJed Brown if (set) *set = PETSC_TRUE; 2341a297a907SKarl Rupp } else if (set) *set = PETSC_FALSE; 23429566063dSJacob Faibussowitsch PetscCall(PetscFree(svalue)); 2343e5c89e4eSSatish Balay PetscFunctionReturn(0); 2344e5c89e4eSSatish Balay } 2345e5c89e4eSSatish Balay 2346e5c89e4eSSatish Balay /*@C 2347e5c89e4eSSatish Balay PetscOptionsGetEnum - Gets the enum value for a particular option in the database. 2348e5c89e4eSSatish Balay 2349e5c89e4eSSatish Balay Not Collective 2350e5c89e4eSSatish Balay 2351e5c89e4eSSatish Balay Input Parameters: 23525c9cc608SHong Zhang + options - options database, use NULL for default global database 2353c5929fdfSBarry Smith . pre - option prefix or NULL 2354e5c89e4eSSatish Balay . opt - option name 23556b867d5aSJose E. Roman - list - array containing the list of choices, followed by the enum name, followed by the enum prefix, followed by a null 2356e5c89e4eSSatish Balay 2357d8d19677SJose E. Roman Output Parameters: 2358e5c89e4eSSatish Balay + value - the value to return 235996ef3cdfSSatish Balay - set - PETSC_TRUE if found, else PETSC_FALSE 2360e5c89e4eSSatish Balay 2361e5c89e4eSSatish Balay Level: beginner 2362e5c89e4eSSatish Balay 236395452b02SPatrick Sanan Notes: 236495452b02SPatrick Sanan If the user does not supply the option value is NOT changed. Thus 23652efd9cb1SBarry Smith you should ALWAYS initialize the ivalue if you access it without first checking if the set flag is true. 2366e5c89e4eSSatish Balay 23672efd9cb1SBarry Smith List is usually something like PCASMTypes or some other predefined list of enum names 2368e5c89e4eSSatish Balay 2369db781477SPatrick Sanan .seealso: `PetscOptionsGetReal()`, `PetscOptionsHasName()`, `PetscOptionsGetString()`, `PetscOptionsGetInt()`, 2370db781477SPatrick Sanan `PetscOptionsGetIntArray()`, `PetscOptionsGetRealArray()`, `PetscOptionsBool()` 2371db781477SPatrick Sanan `PetscOptionsInt()`, `PetscOptionsString()`, `PetscOptionsReal()`, `PetscOptionsBool()`, 2372db781477SPatrick Sanan `PetscOptionsName()`, `PetscOptionsBegin()`, `PetscOptionsEnd()`, `PetscOptionsHeadBegin()`, 2373c2e3fba1SPatrick Sanan `PetscOptionsStringArray()`, `PetscOptionsRealArray()`, `PetscOptionsScalar()`, 2374db781477SPatrick Sanan `PetscOptionsBoolGroupBegin()`, `PetscOptionsBoolGroup()`, `PetscOptionsBoolGroupEnd()`, 2375db781477SPatrick Sanan `PetscOptionsFList()`, `PetscOptionsEList()`, `PetscOptionsGetEList()`, `PetscOptionsEnum()` 2376e5c89e4eSSatish Balay @*/ 2377c5929fdfSBarry Smith PetscErrorCode PetscOptionsGetEnum(PetscOptions options,const char pre[],const char opt[],const char * const *list,PetscEnum *value,PetscBool *set) 2378e5c89e4eSSatish Balay { 237969a24498SJed Brown PetscInt ntext = 0,tval; 2380ace3abfcSBarry Smith PetscBool fset; 2381e5c89e4eSSatish Balay 2382e5c89e4eSSatish Balay PetscFunctionBegin; 23832d747510SLisandro Dalcin PetscValidCharPointer(opt,3); 2384e5c89e4eSSatish Balay while (list[ntext++]) { 238508401ef6SPierre Jolivet PetscCheck(ntext <= 50,PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"List argument appears to be wrong or have more than 50 entries"); 2386e5c89e4eSSatish Balay } 238708401ef6SPierre Jolivet PetscCheck(ntext >= 3,PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"List argument must have at least two entries: typename and type prefix"); 2388e5c89e4eSSatish Balay ntext -= 3; 23899566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetEList(options,pre,opt,list,ntext,&tval,&fset)); 239069a24498SJed Brown /* with PETSC_USE_64BIT_INDICES sizeof(PetscInt) != sizeof(PetscEnum) */ 2391809ceb46SBarry Smith if (fset) *value = (PetscEnum)tval; 2392809ceb46SBarry Smith if (set) *set = fset; 2393e5c89e4eSSatish Balay PetscFunctionReturn(0); 2394e5c89e4eSSatish Balay } 2395e5c89e4eSSatish Balay 2396e5c89e4eSSatish Balay /*@C 23972d747510SLisandro Dalcin PetscOptionsGetInt - Gets the integer value for a particular option in the database. 2398e5c89e4eSSatish Balay 2399e5c89e4eSSatish Balay Not Collective 2400e5c89e4eSSatish Balay 2401e5c89e4eSSatish Balay Input Parameters: 24025c9cc608SHong Zhang + options - options database, use NULL for default global database 2403c5929fdfSBarry Smith . pre - the string to prepend to the name or NULL 2404e5c89e4eSSatish Balay - name - the option one is seeking 2405e5c89e4eSSatish Balay 2406d8d19677SJose E. Roman Output Parameters: 24072d747510SLisandro Dalcin + ivalue - the integer value to return 240896ef3cdfSSatish Balay - set - PETSC_TRUE if found, else PETSC_FALSE 2409e5c89e4eSSatish Balay 2410e5c89e4eSSatish Balay Level: beginner 2411e5c89e4eSSatish Balay 2412e5c89e4eSSatish Balay Notes: 24132d747510SLisandro Dalcin If the user does not supply the option ivalue is NOT changed. Thus 24142efd9cb1SBarry Smith you should ALWAYS initialize the ivalue if you access it without first checking if the set flag is true. 24155c07ccb8SBarry Smith 2416db781477SPatrick Sanan .seealso: `PetscOptionsGetReal()`, `PetscOptionsHasName()`, `PetscOptionsGetString()`, 2417db781477SPatrick Sanan `PetscOptionsGetIntArray()`, `PetscOptionsGetRealArray()`, `PetscOptionsBool()` 2418db781477SPatrick Sanan `PetscOptionsInt()`, `PetscOptionsString()`, `PetscOptionsReal()`, `PetscOptionsBool()`, 2419db781477SPatrick Sanan `PetscOptionsName()`, `PetscOptionsBegin()`, `PetscOptionsEnd()`, `PetscOptionsHeadBegin()`, 2420c2e3fba1SPatrick Sanan `PetscOptionsStringArray()`, `PetscOptionsRealArray()`, `PetscOptionsScalar()`, 2421db781477SPatrick Sanan `PetscOptionsBoolGroupBegin()`, `PetscOptionsBoolGroup()`, `PetscOptionsBoolGroupEnd()`, 2422db781477SPatrick Sanan `PetscOptionsFList()`, `PetscOptionsEList()` 2423e5c89e4eSSatish Balay @*/ 24242d747510SLisandro Dalcin PetscErrorCode PetscOptionsGetInt(PetscOptions options,const char pre[],const char name[],PetscInt *ivalue,PetscBool *set) 2425e5c89e4eSSatish Balay { 24262d747510SLisandro Dalcin const char *value; 24272d747510SLisandro Dalcin PetscBool flag; 2428e5c89e4eSSatish Balay 2429e5c89e4eSSatish Balay PetscFunctionBegin; 24302d747510SLisandro Dalcin PetscValidCharPointer(name,3); 24312d747510SLisandro Dalcin PetscValidIntPointer(ivalue,4); 24329566063dSJacob Faibussowitsch PetscCall(PetscOptionsFindPair(options,pre,name,&value,&flag)); 2433e5c89e4eSSatish Balay if (flag) { 243434a9cc2cSBarry Smith if (!value) { 24352d747510SLisandro Dalcin if (set) *set = PETSC_FALSE; 243634a9cc2cSBarry Smith } else { 24372d747510SLisandro Dalcin if (set) *set = PETSC_TRUE; 24389566063dSJacob Faibussowitsch PetscCall(PetscOptionsStringToInt(value,ivalue)); 2439e5c89e4eSSatish Balay } 2440e5c89e4eSSatish Balay } else { 244196ef3cdfSSatish Balay if (set) *set = PETSC_FALSE; 2442e5c89e4eSSatish Balay } 2443e5c89e4eSSatish Balay PetscFunctionReturn(0); 2444e5c89e4eSSatish Balay } 2445e5c89e4eSSatish Balay 2446e2446a98SMatthew Knepley /*@C 2447e5c89e4eSSatish Balay PetscOptionsGetReal - Gets the double precision value for a particular 2448e5c89e4eSSatish Balay option in the database. 2449e5c89e4eSSatish Balay 2450e5c89e4eSSatish Balay Not Collective 2451e5c89e4eSSatish Balay 2452e5c89e4eSSatish Balay Input Parameters: 24535c9cc608SHong Zhang + options - options database, use NULL for default global database 2454c5929fdfSBarry Smith . pre - string to prepend to each name or NULL 2455e5c89e4eSSatish Balay - name - the option one is seeking 2456e5c89e4eSSatish Balay 2457d8d19677SJose E. Roman Output Parameters: 2458e5c89e4eSSatish Balay + dvalue - the double value to return 245996ef3cdfSSatish Balay - set - PETSC_TRUE if found, PETSC_FALSE if not found 2460e5c89e4eSSatish Balay 246195452b02SPatrick Sanan Notes: 246295452b02SPatrick Sanan If the user does not supply the option dvalue is NOT changed. Thus 24632efd9cb1SBarry Smith you should ALWAYS initialize the ivalue if you access it without first checking if the set flag is true. 2464e4974155SBarry Smith 2465e5c89e4eSSatish Balay Level: beginner 2466e5c89e4eSSatish Balay 2467db781477SPatrick Sanan .seealso: `PetscOptionsGetInt()`, `PetscOptionsHasName()`, 2468c2e3fba1SPatrick Sanan `PetscOptionsGetString()`, `PetscOptionsGetIntArray()`, `PetscOptionsGetRealArray()`, `PetscOptionsBool()`, 2469db781477SPatrick Sanan `PetscOptionsName()`, `PetscOptionsBegin()`, `PetscOptionsEnd()`, `PetscOptionsHeadBegin()`, 2470c2e3fba1SPatrick Sanan `PetscOptionsStringArray()`, `PetscOptionsRealArray()`, `PetscOptionsScalar()`, 2471db781477SPatrick Sanan `PetscOptionsBoolGroupBegin()`, `PetscOptionsBoolGroup()`, `PetscOptionsBoolGroupEnd()`, 2472db781477SPatrick Sanan `PetscOptionsFList()`, `PetscOptionsEList()` 2473e5c89e4eSSatish Balay @*/ 2474c5929fdfSBarry Smith PetscErrorCode PetscOptionsGetReal(PetscOptions options,const char pre[],const char name[],PetscReal *dvalue,PetscBool *set) 2475e5c89e4eSSatish Balay { 24762d747510SLisandro Dalcin const char *value; 2477ace3abfcSBarry Smith PetscBool flag; 2478e5c89e4eSSatish Balay 2479e5c89e4eSSatish Balay PetscFunctionBegin; 24802d747510SLisandro Dalcin PetscValidCharPointer(name,3); 24812d747510SLisandro Dalcin PetscValidRealPointer(dvalue,4); 24829566063dSJacob Faibussowitsch PetscCall(PetscOptionsFindPair(options,pre,name,&value,&flag)); 2483e5c89e4eSSatish Balay if (flag) { 2484a297a907SKarl Rupp if (!value) { 2485a297a907SKarl Rupp if (set) *set = PETSC_FALSE; 2486a297a907SKarl Rupp } else { 2487a297a907SKarl Rupp if (set) *set = PETSC_TRUE; 24889566063dSJacob Faibussowitsch PetscCall(PetscOptionsStringToReal(value,dvalue)); 2489a297a907SKarl Rupp } 2490e5c89e4eSSatish Balay } else { 249196ef3cdfSSatish Balay if (set) *set = PETSC_FALSE; 2492e5c89e4eSSatish Balay } 2493e5c89e4eSSatish Balay PetscFunctionReturn(0); 2494e5c89e4eSSatish Balay } 2495e5c89e4eSSatish Balay 2496e5c89e4eSSatish Balay /*@C 2497e5c89e4eSSatish Balay PetscOptionsGetScalar - Gets the scalar value for a particular 2498e5c89e4eSSatish Balay option in the database. 2499e5c89e4eSSatish Balay 2500e5c89e4eSSatish Balay Not Collective 2501e5c89e4eSSatish Balay 2502e5c89e4eSSatish Balay Input Parameters: 25035c9cc608SHong Zhang + options - options database, use NULL for default global database 2504c5929fdfSBarry Smith . pre - string to prepend to each name or NULL 2505e5c89e4eSSatish Balay - name - the option one is seeking 2506e5c89e4eSSatish Balay 2507d8d19677SJose E. Roman Output Parameters: 2508e5c89e4eSSatish Balay + dvalue - the double value to return 250996ef3cdfSSatish Balay - set - PETSC_TRUE if found, else PETSC_FALSE 2510e5c89e4eSSatish Balay 2511e5c89e4eSSatish Balay Level: beginner 2512e5c89e4eSSatish Balay 2513e5c89e4eSSatish Balay Usage: 2514eb4ae41dSBarry Smith A complex number 2+3i must be specified with NO spaces 2515e5c89e4eSSatish Balay 251695452b02SPatrick Sanan Notes: 251795452b02SPatrick Sanan If the user does not supply the option dvalue is NOT changed. Thus 25182efd9cb1SBarry Smith you should ALWAYS initialize the ivalue if you access it without first checking if the set flag is true. 2519e4974155SBarry Smith 2520db781477SPatrick Sanan .seealso: `PetscOptionsGetInt()`, `PetscOptionsHasName()`, 2521db781477SPatrick Sanan `PetscOptionsGetString()`, `PetscOptionsGetIntArray()`, `PetscOptionsGetRealArray()`, `PetscOptionsBool()`, 2522db781477SPatrick Sanan `PetscOptionsName()`, `PetscOptionsBegin()`, `PetscOptionsEnd()`, `PetscOptionsHeadBegin()`, 2523c2e3fba1SPatrick Sanan `PetscOptionsStringArray()`, `PetscOptionsRealArray()`, `PetscOptionsScalar()`, 2524db781477SPatrick Sanan `PetscOptionsBoolGroupBegin()`, `PetscOptionsBoolGroup()`, `PetscOptionsBoolGroupEnd()`, 2525db781477SPatrick Sanan `PetscOptionsFList()`, `PetscOptionsEList()` 2526e5c89e4eSSatish Balay @*/ 2527c5929fdfSBarry Smith PetscErrorCode PetscOptionsGetScalar(PetscOptions options,const char pre[],const char name[],PetscScalar *dvalue,PetscBool *set) 2528e5c89e4eSSatish Balay { 25292d747510SLisandro Dalcin const char *value; 2530ace3abfcSBarry Smith PetscBool flag; 2531e5c89e4eSSatish Balay 2532e5c89e4eSSatish Balay PetscFunctionBegin; 25332d747510SLisandro Dalcin PetscValidCharPointer(name,3); 25342d747510SLisandro Dalcin PetscValidScalarPointer(dvalue,4); 25359566063dSJacob Faibussowitsch PetscCall(PetscOptionsFindPair(options,pre,name,&value,&flag)); 2536e5c89e4eSSatish Balay if (flag) { 2537e5c89e4eSSatish Balay if (!value) { 253896ef3cdfSSatish Balay if (set) *set = PETSC_FALSE; 2539e5c89e4eSSatish Balay } else { 2540e5c89e4eSSatish Balay #if !defined(PETSC_USE_COMPLEX) 25419566063dSJacob Faibussowitsch PetscCall(PetscOptionsStringToReal(value,dvalue)); 2542e5c89e4eSSatish Balay #else 25439566063dSJacob Faibussowitsch PetscCall(PetscOptionsStringToScalar(value,dvalue)); 2544e5c89e4eSSatish Balay #endif 254596ef3cdfSSatish Balay if (set) *set = PETSC_TRUE; 2546e5c89e4eSSatish Balay } 2547e5c89e4eSSatish Balay } else { /* flag */ 254896ef3cdfSSatish Balay if (set) *set = PETSC_FALSE; 2549e5c89e4eSSatish Balay } 2550e5c89e4eSSatish Balay PetscFunctionReturn(0); 2551e5c89e4eSSatish Balay } 2552e5c89e4eSSatish Balay 2553e5c89e4eSSatish Balay /*@C 2554e5c89e4eSSatish Balay PetscOptionsGetString - Gets the string value for a particular option in 2555e5c89e4eSSatish Balay the database. 2556e5c89e4eSSatish Balay 2557e5c89e4eSSatish Balay Not Collective 2558e5c89e4eSSatish Balay 2559e5c89e4eSSatish Balay Input Parameters: 25605c9cc608SHong Zhang + options - options database, use NULL for default global database 2561c5929fdfSBarry Smith . pre - string to prepend to name or NULL 2562e5c89e4eSSatish Balay . name - the option one is seeking 2563bcbf2dc5SJed Brown - len - maximum length of the string including null termination 2564e5c89e4eSSatish Balay 2565e5c89e4eSSatish Balay Output Parameters: 2566e5c89e4eSSatish Balay + string - location to copy string 256796ef3cdfSSatish Balay - set - PETSC_TRUE if found, else PETSC_FALSE 2568e5c89e4eSSatish Balay 2569e5c89e4eSSatish Balay Level: beginner 2570e5c89e4eSSatish Balay 2571e5c89e4eSSatish Balay Fortran Note: 2572e5c89e4eSSatish Balay The Fortran interface is slightly different from the C/C++ 2573e5c89e4eSSatish Balay interface (len is not used). Sample usage in Fortran follows 2574e5c89e4eSSatish Balay .vb 2575e5c89e4eSSatish Balay character *20 string 257693e6ba5cSBarry Smith PetscErrorCode ierr 257793e6ba5cSBarry Smith PetscBool set 25781b266c99SBarry Smith call PetscOptionsGetString(PETSC_NULL_OPTIONS,PETSC_NULL_CHARACTER,'-s',string,set,ierr) 2579e5c89e4eSSatish Balay .ve 2580e5c89e4eSSatish Balay 258195452b02SPatrick Sanan Notes: 258295452b02SPatrick Sanan if the option is given but no string is provided then an empty string is returned and set is given the value of PETSC_TRUE 2583e4974155SBarry Smith 25842efd9cb1SBarry Smith If the user does not use the option then the string is not changed. Thus 25852efd9cb1SBarry Smith you should ALWAYS initialize the string if you access it without first checking if the set flag is true. 25862efd9cb1SBarry Smith 2587f3dea69dSBarry Smith Note: 2588f3dea69dSBarry 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). 2589f3dea69dSBarry Smith 2590db781477SPatrick Sanan .seealso: `PetscOptionsGetInt()`, `PetscOptionsGetReal()`, 2591db781477SPatrick Sanan `PetscOptionsHasName()`, `PetscOptionsGetIntArray()`, `PetscOptionsGetRealArray()`, `PetscOptionsBool()`, 2592db781477SPatrick Sanan `PetscOptionsName()`, `PetscOptionsBegin()`, `PetscOptionsEnd()`, `PetscOptionsHeadBegin()`, 2593c2e3fba1SPatrick Sanan `PetscOptionsStringArray()`, `PetscOptionsRealArray()`, `PetscOptionsScalar()`, 2594db781477SPatrick Sanan `PetscOptionsBoolGroupBegin()`, `PetscOptionsBoolGroup()`, `PetscOptionsBoolGroupEnd()`, 2595db781477SPatrick Sanan `PetscOptionsFList()`, `PetscOptionsEList()` 2596e5c89e4eSSatish Balay @*/ 2597c5929fdfSBarry Smith PetscErrorCode PetscOptionsGetString(PetscOptions options,const char pre[],const char name[],char string[],size_t len,PetscBool *set) 2598e5c89e4eSSatish Balay { 25992d747510SLisandro Dalcin const char *value; 2600ace3abfcSBarry Smith PetscBool flag; 2601e5c89e4eSSatish Balay 2602e5c89e4eSSatish Balay PetscFunctionBegin; 26032d747510SLisandro Dalcin PetscValidCharPointer(name,3); 26042d747510SLisandro Dalcin PetscValidCharPointer(string,4); 26059566063dSJacob Faibussowitsch PetscCall(PetscOptionsFindPair(options,pre,name,&value,&flag)); 2606e5c89e4eSSatish Balay if (!flag) { 260796ef3cdfSSatish Balay if (set) *set = PETSC_FALSE; 2608e5c89e4eSSatish Balay } else { 260996ef3cdfSSatish Balay if (set) *set = PETSC_TRUE; 26109566063dSJacob Faibussowitsch if (value) PetscCall(PetscStrncpy(string,value,len)); 26119566063dSJacob Faibussowitsch else PetscCall(PetscArrayzero(string,len)); 2612e5c89e4eSSatish Balay } 2613e5c89e4eSSatish Balay PetscFunctionReturn(0); 2614e5c89e4eSSatish Balay } 2615e5c89e4eSSatish Balay 2616c5929fdfSBarry Smith char *PetscOptionsGetStringMatlab(PetscOptions options,const char pre[],const char name[]) 261714ce751eSBarry Smith { 26182d747510SLisandro Dalcin const char *value; 261914ce751eSBarry Smith PetscBool flag; 262014ce751eSBarry Smith 262114ce751eSBarry Smith PetscFunctionBegin; 262239a651e2SJacob Faibussowitsch if (PetscOptionsFindPair(options,pre,name,&value,&flag)) PetscFunctionReturn(NULL); 26232d747510SLisandro Dalcin if (flag) PetscFunctionReturn((char*)value); 262439a651e2SJacob Faibussowitsch PetscFunctionReturn(NULL); 262514ce751eSBarry Smith } 262614ce751eSBarry Smith 26272d747510SLisandro Dalcin /*@C 26282d747510SLisandro Dalcin PetscOptionsGetBoolArray - Gets an array of Logical (true or false) values for a particular 2629f1a722f8SMatthew G. Knepley option in the database. The values must be separated with commas with no intervening spaces. 26302d747510SLisandro Dalcin 26312d747510SLisandro Dalcin Not Collective 26322d747510SLisandro Dalcin 26332d747510SLisandro Dalcin Input Parameters: 26342d747510SLisandro Dalcin + options - options database, use NULL for default global database 26352d747510SLisandro Dalcin . pre - string to prepend to each name or NULL 26366b867d5aSJose E. Roman - name - the option one is seeking 26376b867d5aSJose E. Roman 2638d8d19677SJose E. Roman Output Parameters: 26392d747510SLisandro Dalcin + dvalue - the integer values to return 2640f1a722f8SMatthew G. Knepley . nmax - On input maximum number of values to retrieve, on output the actual number of values retrieved 26412d747510SLisandro Dalcin - set - PETSC_TRUE if found, else PETSC_FALSE 26422d747510SLisandro Dalcin 26432d747510SLisandro Dalcin Level: beginner 26442d747510SLisandro Dalcin 26452d747510SLisandro Dalcin Notes: 2646f1a722f8SMatthew 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 26472d747510SLisandro Dalcin 2648db781477SPatrick Sanan .seealso: `PetscOptionsGetInt()`, `PetscOptionsHasName()`, 2649db781477SPatrick Sanan `PetscOptionsGetString()`, `PetscOptionsGetRealArray()`, `PetscOptionsBool()`, 2650db781477SPatrick Sanan `PetscOptionsName()`, `PetscOptionsBegin()`, `PetscOptionsEnd()`, `PetscOptionsHeadBegin()`, 2651c2e3fba1SPatrick Sanan `PetscOptionsStringArray()`, `PetscOptionsRealArray()`, `PetscOptionsScalar()`, 2652db781477SPatrick Sanan `PetscOptionsBoolGroupBegin()`, `PetscOptionsBoolGroup()`, `PetscOptionsBoolGroupEnd()`, 2653db781477SPatrick Sanan `PetscOptionsFList()`, `PetscOptionsEList()` 26542d747510SLisandro Dalcin @*/ 26552d747510SLisandro Dalcin PetscErrorCode PetscOptionsGetBoolArray(PetscOptions options,const char pre[],const char name[],PetscBool dvalue[],PetscInt *nmax,PetscBool *set) 26562d747510SLisandro Dalcin { 26572d747510SLisandro Dalcin const char *svalue; 26582d747510SLisandro Dalcin char *value; 26592d747510SLisandro Dalcin PetscInt n = 0; 26602d747510SLisandro Dalcin PetscBool flag; 26612d747510SLisandro Dalcin PetscToken token; 26622d747510SLisandro Dalcin 26632d747510SLisandro Dalcin PetscFunctionBegin; 26642d747510SLisandro Dalcin PetscValidCharPointer(name,3); 2665064a246eSJacob Faibussowitsch PetscValidBoolPointer(dvalue,4); 26662d747510SLisandro Dalcin PetscValidIntPointer(nmax,5); 26672d747510SLisandro Dalcin 26689566063dSJacob Faibussowitsch PetscCall(PetscOptionsFindPair(options,pre,name,&svalue,&flag)); 26692d747510SLisandro Dalcin if (!flag || !svalue) { if (set) *set = PETSC_FALSE; *nmax = 0; PetscFunctionReturn(0);} 26702d747510SLisandro Dalcin if (set) *set = PETSC_TRUE; 26719566063dSJacob Faibussowitsch PetscCall(PetscTokenCreate(svalue,',',&token)); 26729566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token,&value)); 26732d747510SLisandro Dalcin while (value && n < *nmax) { 26749566063dSJacob Faibussowitsch PetscCall(PetscOptionsStringToBool(value,dvalue)); 26759566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token,&value)); 26762d747510SLisandro Dalcin dvalue++; 26772d747510SLisandro Dalcin n++; 26782d747510SLisandro Dalcin } 26799566063dSJacob Faibussowitsch PetscCall(PetscTokenDestroy(&token)); 26802d747510SLisandro Dalcin *nmax = n; 26812d747510SLisandro Dalcin PetscFunctionReturn(0); 26822d747510SLisandro Dalcin } 26832d747510SLisandro Dalcin 26842d747510SLisandro Dalcin /*@C 26852d747510SLisandro Dalcin PetscOptionsGetEnumArray - Gets an array of enum values for a particular option in the database. 26862d747510SLisandro Dalcin 26872d747510SLisandro Dalcin Not Collective 26882d747510SLisandro Dalcin 26892d747510SLisandro Dalcin Input Parameters: 26902d747510SLisandro Dalcin + options - options database, use NULL for default global database 26912d747510SLisandro Dalcin . pre - option prefix or NULL 26922d747510SLisandro Dalcin . name - option name 26936b867d5aSJose E. Roman - list - array containing the list of choices, followed by the enum name, followed by the enum prefix, followed by a null 26946b867d5aSJose E. Roman 26952d747510SLisandro Dalcin Output Parameters: 26962d747510SLisandro Dalcin + ivalue - the enum values to return 2697f1a722f8SMatthew G. Knepley . nmax - On input maximum number of values to retrieve, on output the actual number of values retrieved 26982d747510SLisandro Dalcin - set - PETSC_TRUE if found, else PETSC_FALSE 26992d747510SLisandro Dalcin 27002d747510SLisandro Dalcin Level: beginner 27012d747510SLisandro Dalcin 27022d747510SLisandro Dalcin Notes: 27032d747510SLisandro Dalcin The array must be passed as a comma separated list. 27042d747510SLisandro Dalcin 27052d747510SLisandro Dalcin There must be no intervening spaces between the values. 27062d747510SLisandro Dalcin 27072d747510SLisandro Dalcin list is usually something like PCASMTypes or some other predefined list of enum names. 27082d747510SLisandro Dalcin 2709db781477SPatrick Sanan .seealso: `PetscOptionsGetReal()`, `PetscOptionsHasName()`, `PetscOptionsGetString()`, `PetscOptionsGetInt()`, 2710db781477SPatrick Sanan `PetscOptionsGetEnum()`, `PetscOptionsGetIntArray()`, `PetscOptionsGetRealArray()`, `PetscOptionsBool()` 2711db781477SPatrick Sanan `PetscOptionsInt()`, `PetscOptionsString()`, `PetscOptionsReal()`, `PetscOptionsBool()`, `PetscOptionsName()`, 2712c2e3fba1SPatrick Sanan `PetscOptionsBegin()`, `PetscOptionsEnd()`, `PetscOptionsHeadBegin()`, `PetscOptionsStringArray()`, `PetscOptionsRealArray()`, 2713db781477SPatrick Sanan `PetscOptionsScalar()`, `PetscOptionsBoolGroupBegin()`, `PetscOptionsBoolGroup()`, `PetscOptionsBoolGroupEnd()`, 2714db781477SPatrick Sanan `PetscOptionsFList()`, `PetscOptionsEList()`, `PetscOptionsGetEList()`, `PetscOptionsEnum()` 27152d747510SLisandro Dalcin @*/ 27162d747510SLisandro Dalcin PetscErrorCode PetscOptionsGetEnumArray(PetscOptions options,const char pre[],const char name[],const char *const *list,PetscEnum ivalue[],PetscInt *nmax,PetscBool *set) 27172d747510SLisandro Dalcin { 27182d747510SLisandro Dalcin const char *svalue; 27192d747510SLisandro Dalcin char *value; 27202d747510SLisandro Dalcin PetscInt n = 0; 27212d747510SLisandro Dalcin PetscEnum evalue; 27222d747510SLisandro Dalcin PetscBool flag; 27232d747510SLisandro Dalcin PetscToken token; 27242d747510SLisandro Dalcin 27252d747510SLisandro Dalcin PetscFunctionBegin; 27262d747510SLisandro Dalcin PetscValidCharPointer(name,3); 27272d747510SLisandro Dalcin PetscValidPointer(list,4); 27282d747510SLisandro Dalcin PetscValidPointer(ivalue,5); 27292d747510SLisandro Dalcin PetscValidIntPointer(nmax,6); 27302d747510SLisandro Dalcin 27319566063dSJacob Faibussowitsch PetscCall(PetscOptionsFindPair(options,pre,name,&svalue,&flag)); 27322d747510SLisandro Dalcin if (!flag || !svalue) { if (set) *set = PETSC_FALSE; *nmax = 0; PetscFunctionReturn(0);} 27332d747510SLisandro Dalcin if (set) *set = PETSC_TRUE; 27349566063dSJacob Faibussowitsch PetscCall(PetscTokenCreate(svalue,',',&token)); 27359566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token,&value)); 27362d747510SLisandro Dalcin while (value && n < *nmax) { 27379566063dSJacob Faibussowitsch PetscCall(PetscEnumFind(list,value,&evalue,&flag)); 273828b400f6SJacob Faibussowitsch PetscCheck(flag,PETSC_COMM_SELF,PETSC_ERR_USER,"Unknown enum value '%s' for -%s%s",svalue,pre ? pre : "",name+1); 27392d747510SLisandro Dalcin ivalue[n++] = evalue; 27409566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token,&value)); 27412d747510SLisandro Dalcin } 27429566063dSJacob Faibussowitsch PetscCall(PetscTokenDestroy(&token)); 27432d747510SLisandro Dalcin *nmax = n; 27442d747510SLisandro Dalcin PetscFunctionReturn(0); 27452d747510SLisandro Dalcin } 27462d747510SLisandro Dalcin 27472d747510SLisandro Dalcin /*@C 2748f1a722f8SMatthew G. Knepley PetscOptionsGetIntArray - Gets an array of integer values for a particular option in the database. 27492d747510SLisandro Dalcin 27502d747510SLisandro Dalcin Not Collective 27512d747510SLisandro Dalcin 27522d747510SLisandro Dalcin Input Parameters: 27532d747510SLisandro Dalcin + options - options database, use NULL for default global database 27542d747510SLisandro Dalcin . pre - string to prepend to each name or NULL 27556b867d5aSJose E. Roman - name - the option one is seeking 27566b867d5aSJose E. Roman 2757d8d19677SJose E. Roman Output Parameters: 27582d747510SLisandro Dalcin + ivalue - the integer values to return 2759f1a722f8SMatthew G. Knepley . nmax - On input maximum number of values to retrieve, on output the actual number of values retrieved 27602d747510SLisandro Dalcin - set - PETSC_TRUE if found, else PETSC_FALSE 27612d747510SLisandro Dalcin 27622d747510SLisandro Dalcin Level: beginner 27632d747510SLisandro Dalcin 27642d747510SLisandro Dalcin Notes: 27652d747510SLisandro Dalcin The array can be passed as 2766f1a722f8SMatthew G. Knepley .vb 27672d747510SLisandro Dalcin a comma separated list: 0,1,2,3,4,5,6,7 27682d747510SLisandro Dalcin a range (start-end+1): 0-8 27692d747510SLisandro Dalcin a range with given increment (start-end+1:inc): 0-7:2 27702d747510SLisandro Dalcin a combination of values and ranges separated by commas: 0,1-8,8-15:2 2771f1a722f8SMatthew G. Knepley .ve 27722d747510SLisandro Dalcin 27732d747510SLisandro Dalcin There must be no intervening spaces between the values. 27742d747510SLisandro Dalcin 2775db781477SPatrick Sanan .seealso: `PetscOptionsGetInt()`, `PetscOptionsHasName()`, 2776db781477SPatrick Sanan `PetscOptionsGetString()`, `PetscOptionsGetRealArray()`, `PetscOptionsBool()`, 2777db781477SPatrick Sanan `PetscOptionsName()`, `PetscOptionsBegin()`, `PetscOptionsEnd()`, `PetscOptionsHeadBegin()`, 2778c2e3fba1SPatrick Sanan `PetscOptionsStringArray()`, `PetscOptionsRealArray()`, `PetscOptionsScalar()`, 2779db781477SPatrick Sanan `PetscOptionsBoolGroupBegin()`, `PetscOptionsBoolGroup()`, `PetscOptionsBoolGroupEnd()`, 2780db781477SPatrick Sanan `PetscOptionsFList()`, `PetscOptionsEList()` 27812d747510SLisandro Dalcin @*/ 27822d747510SLisandro Dalcin PetscErrorCode PetscOptionsGetIntArray(PetscOptions options,const char pre[],const char name[],PetscInt ivalue[],PetscInt *nmax,PetscBool *set) 27832d747510SLisandro Dalcin { 27842d747510SLisandro Dalcin const char *svalue; 27852d747510SLisandro Dalcin char *value; 27862d747510SLisandro Dalcin PetscInt n = 0,i,j,start,end,inc,nvalues; 27872d747510SLisandro Dalcin size_t len; 27882d747510SLisandro Dalcin PetscBool flag,foundrange; 27892d747510SLisandro Dalcin PetscToken token; 27902d747510SLisandro Dalcin 27912d747510SLisandro Dalcin PetscFunctionBegin; 27922d747510SLisandro Dalcin PetscValidCharPointer(name,3); 27932d747510SLisandro Dalcin PetscValidIntPointer(ivalue,4); 27942d747510SLisandro Dalcin PetscValidIntPointer(nmax,5); 27952d747510SLisandro Dalcin 27969566063dSJacob Faibussowitsch PetscCall(PetscOptionsFindPair(options,pre,name,&svalue,&flag)); 27972d747510SLisandro Dalcin if (!flag || !svalue) { if (set) *set = PETSC_FALSE; *nmax = 0; PetscFunctionReturn(0);} 27982d747510SLisandro Dalcin if (set) *set = PETSC_TRUE; 27999566063dSJacob Faibussowitsch PetscCall(PetscTokenCreate(svalue,',',&token)); 28009566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token,&value)); 28012d747510SLisandro Dalcin while (value && n < *nmax) { 28022d747510SLisandro Dalcin /* look for form d-D where d and D are integers */ 28032d747510SLisandro Dalcin foundrange = PETSC_FALSE; 28049566063dSJacob Faibussowitsch PetscCall(PetscStrlen(value,&len)); 28052d747510SLisandro Dalcin if (value[0] == '-') i=2; 28062d747510SLisandro Dalcin else i=1; 28072d747510SLisandro Dalcin for (;i<(int)len; i++) { 28082d747510SLisandro Dalcin if (value[i] == '-') { 2809cc73adaaSBarry Smith PetscCheck(i != (int)len-1,PETSC_COMM_SELF,PETSC_ERR_USER,"Error in %" PetscInt_FMT "-th array entry %s",n,value); 28102d747510SLisandro Dalcin value[i] = 0; 28112d747510SLisandro Dalcin 28129566063dSJacob Faibussowitsch PetscCall(PetscOptionsStringToInt(value,&start)); 28132d747510SLisandro Dalcin inc = 1; 28142d747510SLisandro Dalcin j = i+1; 28152d747510SLisandro Dalcin for (;j<(int)len; j++) { 28162d747510SLisandro Dalcin if (value[j] == ':') { 28172d747510SLisandro Dalcin value[j] = 0; 28182d747510SLisandro Dalcin 28199566063dSJacob Faibussowitsch PetscCall(PetscOptionsStringToInt(value+j+1,&inc)); 282008401ef6SPierre 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); 28212d747510SLisandro Dalcin break; 28222d747510SLisandro Dalcin } 28232d747510SLisandro Dalcin } 28249566063dSJacob Faibussowitsch PetscCall(PetscOptionsStringToInt(value+i+1,&end)); 282508401ef6SPierre 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); 28262d747510SLisandro Dalcin nvalues = (end-start)/inc + (end-start)%inc; 2827cc73adaaSBarry 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); 28282d747510SLisandro Dalcin for (;start<end; start+=inc) { 28292d747510SLisandro Dalcin *ivalue = start; ivalue++;n++; 28302d747510SLisandro Dalcin } 28312d747510SLisandro Dalcin foundrange = PETSC_TRUE; 28322d747510SLisandro Dalcin break; 28332d747510SLisandro Dalcin } 28342d747510SLisandro Dalcin } 28352d747510SLisandro Dalcin if (!foundrange) { 28369566063dSJacob Faibussowitsch PetscCall(PetscOptionsStringToInt(value,ivalue)); 28372d747510SLisandro Dalcin ivalue++; 28382d747510SLisandro Dalcin n++; 28392d747510SLisandro Dalcin } 28409566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token,&value)); 28412d747510SLisandro Dalcin } 28429566063dSJacob Faibussowitsch PetscCall(PetscTokenDestroy(&token)); 28432d747510SLisandro Dalcin *nmax = n; 28442d747510SLisandro Dalcin PetscFunctionReturn(0); 28452d747510SLisandro Dalcin } 28462d747510SLisandro Dalcin 28472d747510SLisandro Dalcin /*@C 28482d747510SLisandro Dalcin PetscOptionsGetRealArray - Gets an array of double precision values for a 2849f1a722f8SMatthew G. Knepley particular option in the database. The values must be separated with commas with no intervening spaces. 28502d747510SLisandro Dalcin 28512d747510SLisandro Dalcin Not Collective 28522d747510SLisandro Dalcin 28532d747510SLisandro Dalcin Input Parameters: 28542d747510SLisandro Dalcin + options - options database, use NULL for default global database 28552d747510SLisandro Dalcin . pre - string to prepend to each name or NULL 28566b867d5aSJose E. Roman - name - the option one is seeking 28576b867d5aSJose E. Roman 28582d747510SLisandro Dalcin Output Parameters: 28592d747510SLisandro Dalcin + dvalue - the double values to return 2860f1a722f8SMatthew G. Knepley . nmax - On input maximum number of values to retrieve, on output the actual number of values retrieved 28612d747510SLisandro Dalcin - set - PETSC_TRUE if found, else PETSC_FALSE 28622d747510SLisandro Dalcin 28632d747510SLisandro Dalcin Level: beginner 28642d747510SLisandro Dalcin 2865db781477SPatrick Sanan .seealso: `PetscOptionsGetInt()`, `PetscOptionsHasName()`, 2866db781477SPatrick Sanan `PetscOptionsGetString()`, `PetscOptionsGetIntArray()`, `PetscOptionsBool()`, 2867db781477SPatrick Sanan `PetscOptionsName()`, `PetscOptionsBegin()`, `PetscOptionsEnd()`, `PetscOptionsHeadBegin()`, 2868c2e3fba1SPatrick Sanan `PetscOptionsStringArray()`, `PetscOptionsRealArray()`, `PetscOptionsScalar()`, 2869db781477SPatrick Sanan `PetscOptionsBoolGroupBegin()`, `PetscOptionsBoolGroup()`, `PetscOptionsBoolGroupEnd()`, 2870db781477SPatrick Sanan `PetscOptionsFList()`, `PetscOptionsEList()` 28712d747510SLisandro Dalcin @*/ 28722d747510SLisandro Dalcin PetscErrorCode PetscOptionsGetRealArray(PetscOptions options,const char pre[],const char name[],PetscReal dvalue[],PetscInt *nmax,PetscBool *set) 28732d747510SLisandro Dalcin { 28742d747510SLisandro Dalcin const char *svalue; 28752d747510SLisandro Dalcin char *value; 28762d747510SLisandro Dalcin PetscInt n = 0; 28772d747510SLisandro Dalcin PetscBool flag; 28782d747510SLisandro Dalcin PetscToken token; 28792d747510SLisandro Dalcin 28802d747510SLisandro Dalcin PetscFunctionBegin; 28812d747510SLisandro Dalcin PetscValidCharPointer(name,3); 28822d747510SLisandro Dalcin PetscValidRealPointer(dvalue,4); 28832d747510SLisandro Dalcin PetscValidIntPointer(nmax,5); 28842d747510SLisandro Dalcin 28859566063dSJacob Faibussowitsch PetscCall(PetscOptionsFindPair(options,pre,name,&svalue,&flag)); 28862d747510SLisandro Dalcin if (!flag || !svalue) { if (set) *set = PETSC_FALSE; *nmax = 0; PetscFunctionReturn(0);} 28872d747510SLisandro Dalcin if (set) *set = PETSC_TRUE; 28889566063dSJacob Faibussowitsch PetscCall(PetscTokenCreate(svalue,',',&token)); 28899566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token,&value)); 28902d747510SLisandro Dalcin while (value && n < *nmax) { 28919566063dSJacob Faibussowitsch PetscCall(PetscOptionsStringToReal(value,dvalue++)); 28929566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token,&value)); 28932d747510SLisandro Dalcin n++; 28942d747510SLisandro Dalcin } 28959566063dSJacob Faibussowitsch PetscCall(PetscTokenDestroy(&token)); 28962d747510SLisandro Dalcin *nmax = n; 28972d747510SLisandro Dalcin PetscFunctionReturn(0); 28982d747510SLisandro Dalcin } 28992d747510SLisandro Dalcin 29002d747510SLisandro Dalcin /*@C 29012d747510SLisandro Dalcin PetscOptionsGetScalarArray - Gets an array of scalars for a 2902f1a722f8SMatthew G. Knepley particular option in the database. The values must be separated with commas with no intervening spaces. 29032d747510SLisandro Dalcin 29042d747510SLisandro Dalcin Not Collective 29052d747510SLisandro Dalcin 29062d747510SLisandro Dalcin Input Parameters: 29072d747510SLisandro Dalcin + options - options database, use NULL for default global database 29082d747510SLisandro Dalcin . pre - string to prepend to each name or NULL 29096b867d5aSJose E. Roman - name - the option one is seeking 29106b867d5aSJose E. Roman 29112d747510SLisandro Dalcin Output Parameters: 29122d747510SLisandro Dalcin + dvalue - the scalar values to return 2913f1a722f8SMatthew G. Knepley . nmax - On input maximum number of values to retrieve, on output the actual number of values retrieved 29142d747510SLisandro Dalcin - set - PETSC_TRUE if found, else PETSC_FALSE 29152d747510SLisandro Dalcin 29162d747510SLisandro Dalcin Level: beginner 29172d747510SLisandro Dalcin 2918db781477SPatrick Sanan .seealso: `PetscOptionsGetInt()`, `PetscOptionsHasName()`, 2919db781477SPatrick Sanan `PetscOptionsGetString()`, `PetscOptionsGetIntArray()`, `PetscOptionsBool()`, 2920db781477SPatrick Sanan `PetscOptionsName()`, `PetscOptionsBegin()`, `PetscOptionsEnd()`, `PetscOptionsHeadBegin()`, 2921c2e3fba1SPatrick Sanan `PetscOptionsStringArray()`, `PetscOptionsRealArray()`, `PetscOptionsScalar()`, 2922db781477SPatrick Sanan `PetscOptionsBoolGroupBegin()`, `PetscOptionsBoolGroup()`, `PetscOptionsBoolGroupEnd()`, 2923db781477SPatrick Sanan `PetscOptionsFList()`, `PetscOptionsEList()` 29242d747510SLisandro Dalcin @*/ 29252d747510SLisandro Dalcin PetscErrorCode PetscOptionsGetScalarArray(PetscOptions options,const char pre[],const char name[],PetscScalar dvalue[],PetscInt *nmax,PetscBool *set) 29262d747510SLisandro Dalcin { 29272d747510SLisandro Dalcin const char *svalue; 29282d747510SLisandro Dalcin char *value; 29292d747510SLisandro Dalcin PetscInt n = 0; 29302d747510SLisandro Dalcin PetscBool flag; 29312d747510SLisandro Dalcin PetscToken token; 29322d747510SLisandro Dalcin 29332d747510SLisandro Dalcin PetscFunctionBegin; 29342d747510SLisandro Dalcin PetscValidCharPointer(name,3); 2935064a246eSJacob Faibussowitsch PetscValidScalarPointer(dvalue,4); 29362d747510SLisandro Dalcin PetscValidIntPointer(nmax,5); 29372d747510SLisandro Dalcin 29389566063dSJacob Faibussowitsch PetscCall(PetscOptionsFindPair(options,pre,name,&svalue,&flag)); 29392d747510SLisandro Dalcin if (!flag || !svalue) { if (set) *set = PETSC_FALSE; *nmax = 0; PetscFunctionReturn(0);} 29402d747510SLisandro Dalcin if (set) *set = PETSC_TRUE; 29419566063dSJacob Faibussowitsch PetscCall(PetscTokenCreate(svalue,',',&token)); 29429566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token,&value)); 29432d747510SLisandro Dalcin while (value && n < *nmax) { 29449566063dSJacob Faibussowitsch PetscCall(PetscOptionsStringToScalar(value,dvalue++)); 29459566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token,&value)); 29462d747510SLisandro Dalcin n++; 29472d747510SLisandro Dalcin } 29489566063dSJacob Faibussowitsch PetscCall(PetscTokenDestroy(&token)); 29492d747510SLisandro Dalcin *nmax = n; 29502d747510SLisandro Dalcin PetscFunctionReturn(0); 29512d747510SLisandro Dalcin } 295214ce751eSBarry Smith 2953e5c89e4eSSatish Balay /*@C 2954e5c89e4eSSatish Balay PetscOptionsGetStringArray - Gets an array of string values for a particular 2955f1a722f8SMatthew G. Knepley option in the database. The values must be separated with commas with no intervening spaces. 2956e5c89e4eSSatish Balay 2957e5c89e4eSSatish Balay Not Collective 2958e5c89e4eSSatish Balay 2959e5c89e4eSSatish Balay Input Parameters: 29605c9cc608SHong Zhang + options - options database, use NULL for default global database 2961c5929fdfSBarry Smith . pre - string to prepend to name or NULL 29626b867d5aSJose E. Roman - name - the option one is seeking 29636b867d5aSJose E. Roman 2964e7b76fa7SPatrick Sanan Output Parameters: 2965e5c89e4eSSatish Balay + strings - location to copy strings 2966f1a722f8SMatthew G. Knepley . nmax - On input maximum number of strings, on output the actual number of strings found 296796ef3cdfSSatish Balay - set - PETSC_TRUE if found, else PETSC_FALSE 2968e5c89e4eSSatish Balay 2969e5c89e4eSSatish Balay Level: beginner 2970e5c89e4eSSatish Balay 2971e5c89e4eSSatish Balay Notes: 2972e7b76fa7SPatrick Sanan The nmax parameter is used for both input and output. 2973e7b76fa7SPatrick Sanan 2974e5c89e4eSSatish Balay The user should pass in an array of pointers to char, to hold all the 2975e5c89e4eSSatish Balay strings returned by this function. 2976e5c89e4eSSatish Balay 2977e5c89e4eSSatish Balay The user is responsible for deallocating the strings that are 2978e5c89e4eSSatish Balay returned. The Fortran interface for this routine is not supported. 2979e5c89e4eSSatish Balay 2980db781477SPatrick Sanan .seealso: `PetscOptionsGetInt()`, `PetscOptionsGetReal()`, 2981db781477SPatrick Sanan `PetscOptionsHasName()`, `PetscOptionsGetIntArray()`, `PetscOptionsGetRealArray()`, `PetscOptionsBool()`, 2982db781477SPatrick Sanan `PetscOptionsName()`, `PetscOptionsBegin()`, `PetscOptionsEnd()`, `PetscOptionsHeadBegin()`, 2983c2e3fba1SPatrick Sanan `PetscOptionsStringArray()`, `PetscOptionsRealArray()`, `PetscOptionsScalar()`, 2984db781477SPatrick Sanan `PetscOptionsBoolGroupBegin()`, `PetscOptionsBoolGroup()`, `PetscOptionsBoolGroupEnd()`, 2985db781477SPatrick Sanan `PetscOptionsFList()`, `PetscOptionsEList()` 2986e5c89e4eSSatish Balay @*/ 2987c5929fdfSBarry Smith PetscErrorCode PetscOptionsGetStringArray(PetscOptions options,const char pre[],const char name[],char *strings[],PetscInt *nmax,PetscBool *set) 2988e5c89e4eSSatish Balay { 29892d747510SLisandro Dalcin const char *svalue; 2990e5c89e4eSSatish Balay char *value; 29912d747510SLisandro Dalcin PetscInt n = 0; 2992ace3abfcSBarry Smith PetscBool flag; 29939c9d3cfdSBarry Smith PetscToken token; 2994e5c89e4eSSatish Balay 2995e5c89e4eSSatish Balay PetscFunctionBegin; 29962d747510SLisandro Dalcin PetscValidCharPointer(name,3); 29972d747510SLisandro Dalcin PetscValidPointer(strings,4); 29982d747510SLisandro Dalcin PetscValidIntPointer(nmax,5); 2999e5c89e4eSSatish Balay 30009566063dSJacob Faibussowitsch PetscCall(PetscOptionsFindPair(options,pre,name,&svalue,&flag)); 30012d747510SLisandro Dalcin if (!flag || !svalue) { if (set) *set = PETSC_FALSE; *nmax = 0; PetscFunctionReturn(0);} 30022d747510SLisandro Dalcin if (set) *set = PETSC_TRUE; 30039566063dSJacob Faibussowitsch PetscCall(PetscTokenCreate(svalue,',',&token)); 30049566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token,&value)); 30052d747510SLisandro Dalcin while (value && n < *nmax) { 30069566063dSJacob Faibussowitsch PetscCall(PetscStrallocpy(value,&strings[n])); 30079566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token,&value)); 3008e5c89e4eSSatish Balay n++; 3009e5c89e4eSSatish Balay } 30109566063dSJacob Faibussowitsch PetscCall(PetscTokenDestroy(&token)); 3011e5c89e4eSSatish Balay *nmax = n; 3012e5c89e4eSSatish Balay PetscFunctionReturn(0); 3013e5c89e4eSSatish Balay } 301406824ed3SPatrick Sanan 301506824ed3SPatrick Sanan /*@C 301606824ed3SPatrick Sanan PetscOptionsDeprecated - mark an option as deprecated, optionally replacing it with a new one 301706824ed3SPatrick Sanan 301806824ed3SPatrick Sanan Prints a deprecation warning, unless an option is supplied to suppress. 301906824ed3SPatrick Sanan 30201c9f3c13SBarry Smith Logically Collective 302106824ed3SPatrick Sanan 302206824ed3SPatrick Sanan Input Parameters: 30239503aa97SPatrick Sanan + pre - string to prepend to name or NULL 302406824ed3SPatrick Sanan . oldname - the old, deprecated option 302506824ed3SPatrick Sanan . newname - the new option, or NULL if option is purely removed 30269f3a6782SPatrick Sanan . version - a string describing the version of first deprecation, e.g. "3.9" 30279f3a6782SPatrick Sanan - info - additional information string, or NULL. 302806824ed3SPatrick Sanan 302906824ed3SPatrick Sanan Options Database Keys: 303006824ed3SPatrick Sanan . -options_suppress_deprecated_warnings - do not print deprecation warnings 303106824ed3SPatrick Sanan 303206824ed3SPatrick Sanan Notes: 30331c9f3c13SBarry Smith Must be called between PetscOptionsBegin() (or PetscObjectOptionsBegin()) and PetscOptionsEnd(). 30341c9f3c13SBarry Smith Only the proces of rank zero that owns the PetscOptionsItems are argument (managed by PetscOptionsBegin() or 30351c9f3c13SBarry Smith PetscObjectOptionsBegin() prints the information 3036b40114eaSPatrick Sanan If newname is provided, the old option is replaced. Otherwise, it remains 3037b40114eaSPatrick Sanan in the options database. 30389f3a6782SPatrick Sanan If an option is not replaced, the info argument should be used to advise the user 30399f3a6782SPatrick Sanan on how to proceed. 30409f3a6782SPatrick Sanan There is a limit on the length of the warning printed, so very long strings 30419f3a6782SPatrick Sanan provided as info may be truncated. 304206824ed3SPatrick Sanan 304306824ed3SPatrick Sanan Level: developer 304406824ed3SPatrick Sanan 3045db781477SPatrick Sanan .seealso: `PetscOptionsBegin()`, `PetscOptionsEnd()`, `PetscOptionsScalar()`, `PetscOptionsBool()`, `PetscOptionsString()`, `PetscOptionsSetValue()` 304606824ed3SPatrick Sanan 304706824ed3SPatrick Sanan @*/ 30489f3a6782SPatrick Sanan PetscErrorCode PetscOptionsDeprecated_Private(PetscOptionItems *PetscOptionsObject,const char oldname[],const char newname[],const char version[],const char info[]) 304906824ed3SPatrick Sanan { 305006824ed3SPatrick Sanan PetscBool found,quiet; 305106824ed3SPatrick Sanan const char *value; 305206824ed3SPatrick Sanan const char * const quietopt="-options_suppress_deprecated_warnings"; 30539f3a6782SPatrick Sanan char msg[4096]; 3054b0bdc838SStefano Zampini char *prefix = NULL; 3055b0bdc838SStefano Zampini PetscOptions options = NULL; 3056b0bdc838SStefano Zampini MPI_Comm comm = PETSC_COMM_SELF; 305706824ed3SPatrick Sanan 305806824ed3SPatrick Sanan PetscFunctionBegin; 305906824ed3SPatrick Sanan PetscValidCharPointer(oldname,2); 306006824ed3SPatrick Sanan PetscValidCharPointer(version,4); 3061b0bdc838SStefano Zampini if (PetscOptionsObject) { 3062b0bdc838SStefano Zampini prefix = PetscOptionsObject->prefix; 3063b0bdc838SStefano Zampini options = PetscOptionsObject->options; 3064b0bdc838SStefano Zampini comm = PetscOptionsObject->comm; 3065b0bdc838SStefano Zampini } 30669566063dSJacob Faibussowitsch PetscCall(PetscOptionsFindPair(options,prefix,oldname,&value,&found)); 306706824ed3SPatrick Sanan if (found) { 306806824ed3SPatrick Sanan if (newname) { 30691baa6e33SBarry Smith if (prefix) PetscCall(PetscOptionsPrefixPush(options,prefix)); 30709566063dSJacob Faibussowitsch PetscCall(PetscOptionsSetValue(options,newname,value)); 30711baa6e33SBarry Smith if (prefix) PetscCall(PetscOptionsPrefixPop(options)); 30729566063dSJacob Faibussowitsch PetscCall(PetscOptionsClearValue(options,oldname)); 3073b40114eaSPatrick Sanan } 307406824ed3SPatrick Sanan quiet = PETSC_FALSE; 30759566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetBool(options,NULL,quietopt,&quiet,NULL)); 307606824ed3SPatrick Sanan if (!quiet) { 30779566063dSJacob Faibussowitsch PetscCall(PetscStrcpy(msg,"** PETSc DEPRECATION WARNING ** : the option ")); 30789566063dSJacob Faibussowitsch PetscCall(PetscStrcat(msg,oldname)); 30799566063dSJacob Faibussowitsch PetscCall(PetscStrcat(msg," is deprecated as of version ")); 30809566063dSJacob Faibussowitsch PetscCall(PetscStrcat(msg,version)); 30819566063dSJacob Faibussowitsch PetscCall(PetscStrcat(msg," and will be removed in a future release.")); 308206824ed3SPatrick Sanan if (newname) { 30839566063dSJacob Faibussowitsch PetscCall(PetscStrcat(msg," Please use the option ")); 30849566063dSJacob Faibussowitsch PetscCall(PetscStrcat(msg,newname)); 30859566063dSJacob Faibussowitsch PetscCall(PetscStrcat(msg," instead.")); 308606824ed3SPatrick Sanan } 30879f3a6782SPatrick Sanan if (info) { 30889566063dSJacob Faibussowitsch PetscCall(PetscStrcat(msg," ")); 30899566063dSJacob Faibussowitsch PetscCall(PetscStrcat(msg,info)); 30909f3a6782SPatrick Sanan } 30919566063dSJacob Faibussowitsch PetscCall(PetscStrcat(msg," (Silence this warning with ")); 30929566063dSJacob Faibussowitsch PetscCall(PetscStrcat(msg,quietopt)); 30939566063dSJacob Faibussowitsch PetscCall(PetscStrcat(msg,")\n")); 30949566063dSJacob Faibussowitsch PetscCall(PetscPrintf(comm,"%s",msg)); 309506824ed3SPatrick Sanan } 309606824ed3SPatrick Sanan } 309706824ed3SPatrick Sanan PetscFunctionReturn(0); 309806824ed3SPatrick Sanan } 3099