173fca5a0SBarry Smith /* Define Feature test macros to make sure atoll is available (SVr4, POSIX.1-2001, 4.3BSD, C99), not in (C89 and POSIX.1-1996) */ 20039db0dSBarry Smith #define PETSC_DESIRE_FEATURE_TEST_MACROS /* for atoll() */ 3e5ea902fSJed Brown 4e5c89e4eSSatish Balay /* 53fc1eb6aSBarry Smith These routines simplify the use of command line, file options, etc., and are used to manipulate the options database. 63fc1eb6aSBarry Smith This provides the low-level interface, the high level interface is in aoptions.c 7e5c89e4eSSatish Balay 83fc1eb6aSBarry Smith Some routines use regular malloc and free because it cannot know what malloc is requested with the 93fc1eb6aSBarry Smith options database until it has already processed the input. 10e5c89e4eSSatish Balay */ 11e5c89e4eSSatish Balay 12af0996ceSBarry Smith #include <petsc/private/petscimpl.h> /*I "petscsys.h" I*/ 13665c2dedSJed Brown #include <petscviewer.h> 14ad1ac5ecSJed Brown #include <ctype.h> 15e5c89e4eSSatish Balay #if defined(PETSC_HAVE_MALLOC_H) 16e5c89e4eSSatish Balay #include <malloc.h> 17e5c89e4eSSatish Balay #endif 18ef279fd6SBarry Smith #if defined(PETSC_HAVE_STRINGS_H) 19ef279fd6SBarry Smith # include <strings.h> /* strcasecmp */ 20ef279fd6SBarry Smith #endif 21e5c89e4eSSatish Balay 222d747510SLisandro Dalcin #if defined(PETSC_HAVE_STRCASECMP) 232d747510SLisandro Dalcin #define PetscOptNameCmp(a,b) strcasecmp(a,b) 242d747510SLisandro Dalcin #elif defined(PETSC_HAVE_STRICMP) 252d747510SLisandro Dalcin #define PetscOptNameCmp(a,b) stricmp(a,b) 262d747510SLisandro Dalcin #else 272d747510SLisandro Dalcin #define PetscOptNameCmp(a,b) Error_strcasecmp_not_found 282d747510SLisandro Dalcin #endif 292d747510SLisandro Dalcin 302d747510SLisandro Dalcin #include <petsc/private/hashtable.h> 312d747510SLisandro Dalcin 322d747510SLisandro Dalcin /* This assumes ASCII encoding and ignores locale settings */ 332d747510SLisandro Dalcin /* Using tolower() is about 2X slower in microbenchmarks */ 342d747510SLisandro Dalcin PETSC_STATIC_INLINE int PetscToLower(int c) 352d747510SLisandro Dalcin { 362d747510SLisandro Dalcin return ((c >= 'A') & (c <= 'Z')) ? c + 'a' - 'A' : c; 372d747510SLisandro Dalcin } 382d747510SLisandro Dalcin 392d747510SLisandro Dalcin /* Bob Jenkins's one at a time hash function (case-insensitive) */ 402d747510SLisandro Dalcin PETSC_STATIC_INLINE unsigned int PetscOptHash(const char key[]) 412d747510SLisandro Dalcin { 422d747510SLisandro Dalcin unsigned int hash = 0; 432d747510SLisandro Dalcin while (*key) { 442d747510SLisandro Dalcin hash += PetscToLower(*key++); 452d747510SLisandro Dalcin hash += hash << 10; 462d747510SLisandro Dalcin hash ^= hash >> 6; 472d747510SLisandro Dalcin } 482d747510SLisandro Dalcin hash += hash << 3; 492d747510SLisandro Dalcin hash ^= hash >> 11; 502d747510SLisandro Dalcin hash += hash << 15; 512d747510SLisandro Dalcin return hash; 522d747510SLisandro Dalcin } 532d747510SLisandro Dalcin 542d747510SLisandro Dalcin PETSC_STATIC_INLINE int PetscOptEqual(const char a[],const char b[]) 552d747510SLisandro Dalcin { 562d747510SLisandro Dalcin return !PetscOptNameCmp(a,b); 572d747510SLisandro Dalcin } 582d747510SLisandro Dalcin 592d747510SLisandro Dalcin KHASH_INIT(HO, kh_cstr_t, int, 1, PetscOptHash, PetscOptEqual) 602d747510SLisandro Dalcin 61e5c89e4eSSatish Balay /* 623fc1eb6aSBarry Smith This table holds all the options set by the user. For simplicity, we use a static size database 63e5c89e4eSSatish Balay */ 64c5c1f447SLisandro Dalcin #define MAXOPTNAME PETSC_MAX_OPTION_NAME 65e5c89e4eSSatish Balay #define MAXOPTIONS 512 66e5c89e4eSSatish Balay #define MAXALIASES 25 6774e0666dSJed Brown #define MAXPREFIXES 25 682d747510SLisandro Dalcin #define MAXOPTIONSMONITORS 5 69e5c89e4eSSatish Balay 704416b707SBarry Smith struct _n_PetscOptions { 713de2bfdfSBarry Smith PetscOptions previous; 722d747510SLisandro Dalcin int N; /* number of options */ 732d747510SLisandro Dalcin char *names[MAXOPTIONS]; /* option names */ 742d747510SLisandro Dalcin char *values[MAXOPTIONS]; /* option values */ 752d747510SLisandro Dalcin PetscBool used[MAXOPTIONS]; /* flag option use */ 76c5b5d8d5SVaclav Hapla PetscBool precedentProcessed; 77081c24baSBoyana Norris 782d747510SLisandro Dalcin /* Hash table */ 792d747510SLisandro Dalcin khash_t(HO) *ht; 802d747510SLisandro Dalcin 812d747510SLisandro Dalcin /* Prefixes */ 822d747510SLisandro Dalcin int prefixind; 832d747510SLisandro Dalcin int prefixstack[MAXPREFIXES]; 842d747510SLisandro Dalcin char prefix[MAXOPTNAME]; 852d747510SLisandro Dalcin 862d747510SLisandro Dalcin /* Aliases */ 872d747510SLisandro Dalcin int Naliases; /* number or aliases */ 882d747510SLisandro Dalcin char *aliases1[MAXALIASES]; /* aliased */ 892d747510SLisandro Dalcin char *aliases2[MAXALIASES]; /* aliasee */ 902d747510SLisandro Dalcin 912d747510SLisandro Dalcin /* Help */ 922d747510SLisandro Dalcin PetscBool help; /* flag whether "-help" is in the database */ 93d314f959SVaclav Hapla PetscBool help_intro; /* flag whether "-help intro" is in the database */ 942d747510SLisandro Dalcin 952d747510SLisandro Dalcin /* Monitors */ 96c5b5d8d5SVaclav Hapla PetscBool monitorFromOptions, monitorCancel; 97081c24baSBoyana Norris PetscErrorCode (*monitor[MAXOPTIONSMONITORS])(const char[],const char[],void*); /* returns control to user after */ 98c2efdce3SBarry Smith PetscErrorCode (*monitordestroy[MAXOPTIONSMONITORS])(void**); /* */ 99081c24baSBoyana Norris void *monitorcontext[MAXOPTIONSMONITORS]; /* to pass arbitrary user data into monitor */ 100081c24baSBoyana Norris PetscInt numbermonitors; /* to, for instance, detect options being set */ 1014416b707SBarry Smith }; 102e5c89e4eSSatish Balay 103b4205f0bSBarry Smith static PetscOptions defaultoptions = NULL; /* the options database routines query this object for options */ 1042d747510SLisandro Dalcin 105c5b5d8d5SVaclav Hapla /* list of options which preceed others, i.e., are processed in PetscOptionsProcessPrecedentFlags() */ 106d06005cbSLisandro Dalcin static const char *precedentOptions[] = {"-options_monitor","-options_monitor_cancel","-help","-skip_petscrc"}; 107d06005cbSLisandro Dalcin enum PetscPrecedentOption {PO_OPTIONS_MONITOR,PO_OPTIONS_MONITOR_CANCEL,PO_HELP,PO_SKIP_PETSCRC,PO_NUM}; 108c5b5d8d5SVaclav Hapla 109c5b5d8d5SVaclav Hapla static PetscErrorCode PetscOptionsSetValue_Private(PetscOptions,const char[],const char[],int*); 110c5b5d8d5SVaclav Hapla 111081c24baSBoyana Norris /* 112081c24baSBoyana Norris Options events monitor 113081c24baSBoyana Norris */ 1142d747510SLisandro Dalcin static PetscErrorCode PetscOptionsMonitor(PetscOptions options,const char name[],const char value[]) 115e5c89e4eSSatish Balay { 1162d747510SLisandro Dalcin PetscInt i; 117e5c89e4eSSatish Balay PetscErrorCode ierr; 118e5c89e4eSSatish Balay 1198ad20175SVaclav Hapla if (!PetscErrorHandlingInitialized) return 0; 120e5c89e4eSSatish Balay PetscFunctionBegin; 121c5b5d8d5SVaclav Hapla if (!value) value = ""; 122c5b5d8d5SVaclav Hapla if (options->monitorFromOptions) { 123c5b5d8d5SVaclav Hapla ierr = PetscOptionsMonitorDefault(name,value,NULL);CHKERRQ(ierr); 124c5b5d8d5SVaclav Hapla } 1252d747510SLisandro Dalcin for (i=0; i<options->numbermonitors; i++) { 1262d747510SLisandro Dalcin ierr = (*options->monitor[i])(name,value,options->monitorcontext[i]);CHKERRQ(ierr); 127e5c89e4eSSatish Balay } 128e5c89e4eSSatish Balay PetscFunctionReturn(0); 129e5c89e4eSSatish Balay } 130e5c89e4eSSatish Balay 1312d747510SLisandro Dalcin /*@ 1322d747510SLisandro Dalcin PetscOptionsCreate - Creates an empty options database. 133e5c89e4eSSatish Balay 1341c9f3c13SBarry Smith Logically collective 1351c9f3c13SBarry Smith 136e5c89e4eSSatish Balay Output Parameter: 1372d747510SLisandro Dalcin . options - Options database object 138e5c89e4eSSatish Balay 139e5c89e4eSSatish Balay Level: advanced 140e5c89e4eSSatish Balay 1411c9f3c13SBarry Smith Developer Note: We may want eventually to pass a MPI_Comm to determine the ownership of the object 1421c9f3c13SBarry Smith 143b4205f0bSBarry Smith .seealso: PetscOptionsDestroy(), PetscOptionsPush(), PetscOptionsPop(), PetscOptionsInsert(), PetscOptionsSetValue() 144e5c89e4eSSatish Balay @*/ 1452d747510SLisandro Dalcin PetscErrorCode PetscOptionsCreate(PetscOptions *options) 1462d747510SLisandro Dalcin { 1472d747510SLisandro Dalcin if (!options) return PETSC_ERR_ARG_NULL; 1482d747510SLisandro Dalcin *options = (PetscOptions)calloc(1,sizeof(**options)); 1492d747510SLisandro Dalcin if (!*options) return PETSC_ERR_MEM; 1502d747510SLisandro Dalcin return 0; 1512d747510SLisandro Dalcin } 1522d747510SLisandro Dalcin 1532d747510SLisandro Dalcin /*@ 1542d747510SLisandro Dalcin PetscOptionsDestroy - Destroys an option database. 1552d747510SLisandro Dalcin 1561c9f3c13SBarry Smith Logically collective on whatever communicator was associated with the call to PetscOptionsCreate() 1571c9f3c13SBarry Smith 1582d747510SLisandro Dalcin Input Parameter: 1592d747510SLisandro Dalcin . options - the PetscOptions object 1602d747510SLisandro Dalcin 1613de2bfdfSBarry Smith Level: advanced 1622d747510SLisandro Dalcin 163b4205f0bSBarry Smith .seealso: PetscOptionsInsert(), PetscOptionsPush(), PetscOptionsPop(), PetscOptionsInsert(), PetscOptionsSetValue() 1642d747510SLisandro Dalcin @*/ 1652d747510SLisandro Dalcin PetscErrorCode PetscOptionsDestroy(PetscOptions *options) 166e5c89e4eSSatish Balay { 167e5c89e4eSSatish Balay PetscErrorCode ierr; 168e5c89e4eSSatish Balay 1692d747510SLisandro Dalcin if (!*options) return 0; 1703de2bfdfSBarry Smith if ((*options)->previous) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"You are destroying an option that has been used with PetscOptionsPush() but does not have a corresponding PetscOptionsPop()"); 1712d747510SLisandro Dalcin ierr = PetscOptionsClear(*options);if (ierr) return ierr; 1722d747510SLisandro Dalcin /* XXX what about monitors ? */ 1732800570dSLisandro Dalcin free(*options); 1742d747510SLisandro Dalcin *options = NULL; 175e5c89e4eSSatish Balay PetscFunctionReturn(0); 176e5c89e4eSSatish Balay } 177e5c89e4eSSatish Balay 1782d747510SLisandro Dalcin /* 1792d747510SLisandro Dalcin PetscOptionsCreateDefault - Creates the default global options database 1802d747510SLisandro Dalcin */ 1812d747510SLisandro Dalcin PetscErrorCode PetscOptionsCreateDefault(void) 182e5c89e4eSSatish Balay { 183e5c89e4eSSatish Balay PetscErrorCode ierr; 184e5c89e4eSSatish Balay 1852d747510SLisandro Dalcin if (!defaultoptions) { 1862d747510SLisandro Dalcin ierr = PetscOptionsCreate(&defaultoptions);if (ierr) return ierr; 1872d747510SLisandro Dalcin } 1882d747510SLisandro Dalcin return 0; 1892d747510SLisandro Dalcin } 1902d747510SLisandro Dalcin 191b4205f0bSBarry Smith /*@ 192b4205f0bSBarry Smith PetscOptionsPush - Push a new PetscOptions object as the default provider of options 1931c9f3c13SBarry Smith Allows using different parts of a code to use different options databases 194b4205f0bSBarry Smith 195b4205f0bSBarry Smith Logically Collective 196b4205f0bSBarry Smith 197b4205f0bSBarry Smith Input Parameter: 198b4205f0bSBarry Smith . opt - the options obtained with PetscOptionsCreate() 199b4205f0bSBarry Smith 200b4205f0bSBarry Smith Notes: 201b4205f0bSBarry Smith Use PetscOptionsPop() to return to the previous default options database 2021c9f3c13SBarry Smith 2039666a313SBarry Smith The collectivity of this routine is complex; only the MPI processes that call this routine will 2041c9f3c13SBarry Smith have the affect of these options. If some processes that create objects call this routine and others do 2051c9f3c13SBarry Smith not the code may fail in complicated ways because the same parallel solvers may incorrectly use different options 2061c9f3c13SBarry Smith on different ranks. 207b4205f0bSBarry Smith 2083de2bfdfSBarry Smith Level: advanced 2093de2bfdfSBarry Smith 2103c6db4c4SPierre Jolivet .seealso: PetscOptionsPop(), PetscOptionsCreate(), PetscOptionsInsert(), PetscOptionsSetValue(), PetscOptionsLeft() 211b4205f0bSBarry Smith 212b4205f0bSBarry Smith @*/ 213b4205f0bSBarry Smith PetscErrorCode PetscOptionsPush(PetscOptions opt) 214b4205f0bSBarry Smith { 215b4205f0bSBarry Smith PetscErrorCode ierr; 216b4205f0bSBarry Smith 217b4205f0bSBarry Smith PetscFunctionBegin; 218b4205f0bSBarry Smith ierr = PetscOptionsCreateDefault();CHKERRQ(ierr); 219b4205f0bSBarry Smith opt->previous = defaultoptions; 220b4205f0bSBarry Smith defaultoptions = opt; 221b4205f0bSBarry Smith PetscFunctionReturn(0); 222b4205f0bSBarry Smith } 223b4205f0bSBarry Smith 224b4205f0bSBarry Smith /*@ 225b4205f0bSBarry Smith PetscOptionsPop - Pop the most recent PetscOptionsPush() to return to the previous default options 226b4205f0bSBarry Smith 2271c9f3c13SBarry Smith Logically collective on whatever communicator was associated with the call to PetscOptionsCreate() 228b4205f0bSBarry Smith 229b4205f0bSBarry Smith Notes: 230b4205f0bSBarry Smith Use PetscOptionsPop() to return to the previous default options database 231b4205f0bSBarry Smith Allows using different parts of a code to use different options databases 232b4205f0bSBarry Smith 2333de2bfdfSBarry Smith Level: advanced 2343de2bfdfSBarry Smith 2353c6db4c4SPierre Jolivet .seealso: PetscOptionsPop(), PetscOptionsCreate(), PetscOptionsInsert(), PetscOptionsSetValue(), PetscOptionsLeft() 236b4205f0bSBarry Smith 237b4205f0bSBarry Smith @*/ 238b4205f0bSBarry Smith PetscErrorCode PetscOptionsPop(void) 239b4205f0bSBarry Smith { 2403de2bfdfSBarry Smith PetscOptions current = defaultoptions; 2413de2bfdfSBarry Smith 242b4205f0bSBarry Smith PetscFunctionBegin; 243b4205f0bSBarry Smith if (!defaultoptions) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Missing default options"); 244b4205f0bSBarry Smith if (!defaultoptions->previous) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"PetscOptionsPop() called too many times"); 245b4205f0bSBarry Smith defaultoptions = defaultoptions->previous; 2463de2bfdfSBarry Smith current->previous = NULL; 247b4205f0bSBarry Smith PetscFunctionReturn(0); 248b4205f0bSBarry Smith } 249b4205f0bSBarry Smith 2502d747510SLisandro Dalcin /* 2512d747510SLisandro Dalcin PetscOptionsDestroyDefault - Destroys the default global options database 2522d747510SLisandro Dalcin */ 2532d747510SLisandro Dalcin PetscErrorCode PetscOptionsDestroyDefault(void) 2542d747510SLisandro Dalcin { 2552d747510SLisandro Dalcin PetscErrorCode ierr; 2563de2bfdfSBarry Smith PetscOptions tmp; 2572d747510SLisandro Dalcin 25886dbd7c4SLisandro Dalcin if (!defaultoptions) return 0; 2593de2bfdfSBarry Smith /* Destroy any options that the user forgot to pop */ 2603de2bfdfSBarry Smith while (defaultoptions->previous) { 2613de2bfdfSBarry Smith tmp = defaultoptions; 2623de2bfdfSBarry Smith ierr = PetscOptionsPop();CHKERRQ(ierr); 2633de2bfdfSBarry Smith ierr = PetscOptionsDestroy(&tmp);CHKERRQ(ierr); 2643de2bfdfSBarry Smith } 2652d747510SLisandro Dalcin ierr = PetscOptionsDestroy(&defaultoptions);if (ierr) return ierr; 2662d747510SLisandro Dalcin return 0; 267e5c89e4eSSatish Balay } 268e5c89e4eSSatish Balay 26994ef8ddeSSatish Balay /*@C 2707cd08cecSJed Brown PetscOptionsValidKey - PETSc Options database keys must begin with one or two dashes (-) followed by a letter. 2713fc1eb6aSBarry Smith 272447722d5SBarry Smith Not collective 2731c9f3c13SBarry Smith 2743fc1eb6aSBarry Smith Input Parameter: 2752d747510SLisandro Dalcin . key - string to check if valid 2763fc1eb6aSBarry Smith 2773fc1eb6aSBarry Smith Output Parameter: 2782d747510SLisandro Dalcin . valid - PETSC_TRUE if a valid key 2793fc1eb6aSBarry Smith 280f6680f47SSatish Balay Level: intermediate 2813fc1eb6aSBarry Smith @*/ 2822d747510SLisandro Dalcin PetscErrorCode PetscOptionsValidKey(const char key[],PetscBool *valid) 28396fc60bcSBarry Smith { 284f603b5e9SToby Isaac char *ptr; 2857c5db45bSBarry Smith 28696fc60bcSBarry Smith PetscFunctionBegin; 2872d747510SLisandro Dalcin if (key) PetscValidCharPointer(key,1); 2882d747510SLisandro Dalcin PetscValidPointer(valid,2); 2892d747510SLisandro Dalcin *valid = PETSC_FALSE; 2902d747510SLisandro Dalcin if (!key) PetscFunctionReturn(0); 2912d747510SLisandro Dalcin if (key[0] != '-') PetscFunctionReturn(0); 2922d747510SLisandro Dalcin if (key[1] == '-') key++; 293c850d057SPierre Jolivet if (!isalpha((int)key[1])) PetscFunctionReturn(0); 2942d747510SLisandro Dalcin (void) strtod(key,&ptr); 295c850d057SPierre Jolivet if (ptr != key && !(*ptr == '_' || isalnum((int)*ptr))) PetscFunctionReturn(0); 2962d747510SLisandro Dalcin *valid = PETSC_TRUE; 29796fc60bcSBarry Smith PetscFunctionReturn(0); 29896fc60bcSBarry Smith } 29996fc60bcSBarry Smith 300e5c89e4eSSatish Balay /*@C 301e5c89e4eSSatish Balay PetscOptionsInsertString - Inserts options into the database from a string 302e5c89e4eSSatish Balay 3031c9f3c13SBarry Smith Logically Collective 304e5c89e4eSSatish Balay 305e5c89e4eSSatish Balay Input Parameter: 306080f0011SToby Isaac + options - options object 307080f0011SToby Isaac - in_str - string that contains options separated by blanks 308e5c89e4eSSatish Balay 309e5c89e4eSSatish Balay Level: intermediate 310e5c89e4eSSatish Balay 3119666a313SBarry Smith The collectivity of this routine is complex; only the MPI processes that call this routine will 3121c9f3c13SBarry Smith have the affect of these options. If some processes that create objects call this routine and others do 3131c9f3c13SBarry Smith not the code may fail in complicated ways because the same parallel solvers may incorrectly use different options 3141c9f3c13SBarry Smith on different ranks. 3151c9f3c13SBarry Smith 316e5c89e4eSSatish Balay Contributed by Boyana Norris 317e5c89e4eSSatish Balay 31888c29154SBarry Smith .seealso: PetscOptionsSetValue(), PetscOptionsView(), PetscOptionsHasName(), PetscOptionsGetInt(), 319acfcf0e5SJed Brown PetscOptionsGetReal(), PetscOptionsGetString(), PetscOptionsGetIntArray(), PetscOptionsBool(), 320e5c89e4eSSatish Balay PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 321e5c89e4eSSatish Balay PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 322acfcf0e5SJed Brown PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 323a264d7a6SBarry Smith PetscOptionsFList(), PetscOptionsEList(), PetscOptionsInsertFile() 324e5c89e4eSSatish Balay @*/ 325c5929fdfSBarry Smith PetscErrorCode PetscOptionsInsertString(PetscOptions options,const char in_str[]) 326e5c89e4eSSatish Balay { 327d06005cbSLisandro Dalcin MPI_Comm comm = PETSC_COMM_SELF; 328e5c89e4eSSatish Balay PetscErrorCode ierr; 329d06005cbSLisandro Dalcin char *first,*second; 3309c9d3cfdSBarry Smith PetscToken token; 331e5c89e4eSSatish Balay 332e5c89e4eSSatish Balay PetscFunctionBegin; 33396fc60bcSBarry Smith ierr = PetscTokenCreate(in_str,' ',&token);CHKERRQ(ierr); 334e5c89e4eSSatish Balay ierr = PetscTokenFind(token,&first);CHKERRQ(ierr); 33596fc60bcSBarry Smith while (first) { 336d06005cbSLisandro Dalcin PetscBool isfile,isfileyaml,isstringyaml,ispush,ispop,key; 337d06005cbSLisandro Dalcin ierr = PetscStrcasecmp(first,"-options_file",&isfile);CHKERRQ(ierr); 338d06005cbSLisandro Dalcin ierr = PetscStrcasecmp(first,"-options_file_yaml",&isfileyaml);CHKERRQ(ierr); 339d06005cbSLisandro Dalcin ierr = PetscStrcasecmp(first,"-options_string_yaml",&isstringyaml);CHKERRQ(ierr); 3409db968c8SJed Brown ierr = PetscStrcasecmp(first,"-prefix_push",&ispush);CHKERRQ(ierr); 3419db968c8SJed Brown ierr = PetscStrcasecmp(first,"-prefix_pop",&ispop);CHKERRQ(ierr); 34296fc60bcSBarry Smith ierr = PetscOptionsValidKey(first,&key);CHKERRQ(ierr); 343d06005cbSLisandro Dalcin if (!key) { 344d06005cbSLisandro Dalcin ierr = PetscTokenFind(token,&first);CHKERRQ(ierr); 345d06005cbSLisandro Dalcin } else if (isfile) { 346d06005cbSLisandro Dalcin ierr = PetscTokenFind(token,&second);CHKERRQ(ierr); 347d06005cbSLisandro Dalcin ierr = PetscOptionsInsertFile(comm,options,second,PETSC_TRUE);CHKERRQ(ierr); 348d06005cbSLisandro Dalcin ierr = PetscTokenFind(token,&first);CHKERRQ(ierr); 349d06005cbSLisandro Dalcin } else if (isfileyaml) { 350d06005cbSLisandro Dalcin ierr = PetscTokenFind(token,&second);CHKERRQ(ierr); 351d06005cbSLisandro Dalcin ierr = PetscOptionsInsertFileYAML(comm,options,second,PETSC_TRUE);CHKERRQ(ierr); 352d06005cbSLisandro Dalcin ierr = PetscTokenFind(token,&first);CHKERRQ(ierr); 353d06005cbSLisandro Dalcin } else if (isstringyaml) { 354d06005cbSLisandro Dalcin ierr = PetscTokenFind(token,&second);CHKERRQ(ierr); 355d06005cbSLisandro Dalcin ierr = PetscOptionsInsertStringYAML(options,second);CHKERRQ(ierr); 356d06005cbSLisandro Dalcin ierr = PetscTokenFind(token,&first);CHKERRQ(ierr); 357d06005cbSLisandro Dalcin } else if (ispush) { 3589db968c8SJed Brown ierr = PetscTokenFind(token,&second);CHKERRQ(ierr); 359c5929fdfSBarry Smith ierr = PetscOptionsPrefixPush(options,second);CHKERRQ(ierr); 3609db968c8SJed Brown ierr = PetscTokenFind(token,&first);CHKERRQ(ierr); 3619db968c8SJed Brown } else if (ispop) { 362c5929fdfSBarry Smith ierr = PetscOptionsPrefixPop(options);CHKERRQ(ierr); 3639db968c8SJed Brown ierr = PetscTokenFind(token,&first);CHKERRQ(ierr); 364d06005cbSLisandro Dalcin } else { 365e5c89e4eSSatish Balay ierr = PetscTokenFind(token,&second);CHKERRQ(ierr); 36696fc60bcSBarry Smith ierr = PetscOptionsValidKey(second,&key);CHKERRQ(ierr); 36796fc60bcSBarry Smith if (!key) { 368c5929fdfSBarry Smith ierr = PetscOptionsSetValue(options,first,second);CHKERRQ(ierr); 36996fc60bcSBarry Smith ierr = PetscTokenFind(token,&first);CHKERRQ(ierr); 37096fc60bcSBarry Smith } else { 371c5929fdfSBarry Smith ierr = PetscOptionsSetValue(options,first,NULL);CHKERRQ(ierr); 37296fc60bcSBarry Smith first = second; 37396fc60bcSBarry Smith } 374e5c89e4eSSatish Balay } 375e5c89e4eSSatish Balay } 3768c74ee41SBarry Smith ierr = PetscTokenDestroy(&token);CHKERRQ(ierr); 377e5c89e4eSSatish Balay PetscFunctionReturn(0); 378e5c89e4eSSatish Balay } 379e5c89e4eSSatish Balay 3803fc1eb6aSBarry Smith /* 3813fc1eb6aSBarry Smith Returns a line (ended by a \n, \r or null character of any length. Result should be freed with free() 3823fc1eb6aSBarry Smith */ 3835fa91da5SBarry Smith static char *Petscgetline(FILE * f) 3845fa91da5SBarry Smith { 3855fa91da5SBarry Smith size_t size = 0; 3865fa91da5SBarry Smith size_t len = 0; 3875fa91da5SBarry Smith size_t last = 0; 3880298fd71SBarry Smith char *buf = NULL; 3895fa91da5SBarry Smith 39002c9f0b5SLisandro Dalcin if (feof(f)) return NULL; 3915fa91da5SBarry Smith do { 3925fa91da5SBarry Smith size += 1024; /* BUFSIZ is defined as "the optimal read size for this platform" */ 3936e0c8459SSatish Balay buf = (char*)realloc((void*)buf,size); /* realloc(NULL,n) is the same as malloc(n) */ 3945fa91da5SBarry Smith /* Actually do the read. Note that fgets puts a terminal '\0' on the 3955fa91da5SBarry Smith end of the string, so we make sure we overwrite this */ 396e86f3e45SDave May if (!fgets(buf+len,1024,f)) buf[len]=0; 3975fa91da5SBarry Smith PetscStrlen(buf,&len); 3985fa91da5SBarry Smith last = len - 1; 3995fa91da5SBarry Smith } while (!feof(f) && buf[last] != '\n' && buf[last] != '\r'); 40008ac41f7SSatish Balay if (len) return buf; 4015fa91da5SBarry Smith free(buf); 40202c9f0b5SLisandro Dalcin return NULL; 4035fa91da5SBarry Smith } 4045fa91da5SBarry Smith 405be10d61cSLisandro Dalcin static PetscErrorCode PetscOptionsFilename(MPI_Comm comm,const char file[],char filename[PETSC_MAX_PATH_LEN],PetscBool *yaml) 406be10d61cSLisandro Dalcin { 407be10d61cSLisandro Dalcin char fname[PETSC_MAX_PATH_LEN+8],path[PETSC_MAX_PATH_LEN+8],*tail; 408be10d61cSLisandro Dalcin PetscErrorCode ierr; 409e5c89e4eSSatish Balay 410be10d61cSLisandro Dalcin *yaml = PETSC_FALSE; 411be10d61cSLisandro Dalcin PetscFunctionBegin; 412be10d61cSLisandro Dalcin ierr = PetscStrreplace(comm,file,fname,sizeof(fname));CHKERRQ(ierr); 413be10d61cSLisandro Dalcin ierr = PetscFixFilename(fname,path);CHKERRQ(ierr); 414be10d61cSLisandro Dalcin ierr = PetscStrendswith(path,":yaml",yaml);CHKERRQ(ierr); 415be10d61cSLisandro Dalcin if (*yaml) { 416be10d61cSLisandro Dalcin ierr = PetscStrrchr(path,':',&tail);CHKERRQ(ierr); 417be10d61cSLisandro Dalcin tail[-1] = 0; /* remove ":yaml" suffix from path */ 418be10d61cSLisandro Dalcin } 419be10d61cSLisandro Dalcin ierr = PetscStrncpy(filename,path,PETSC_MAX_PATH_LEN);CHKERRQ(ierr); 420*a1d2f846SLisandro Dalcin /* check for standard YAML and JSON filename extensions */ 421*a1d2f846SLisandro Dalcin if (!*yaml) {ierr = PetscStrendswith(filename,".yaml",yaml);CHKERRQ(ierr);} 422*a1d2f846SLisandro Dalcin if (!*yaml) {ierr = PetscStrendswith(filename,".yml", yaml);CHKERRQ(ierr);} 423*a1d2f846SLisandro Dalcin if (!*yaml) {ierr = PetscStrendswith(filename,".json",yaml);CHKERRQ(ierr);} 424*a1d2f846SLisandro Dalcin if (!*yaml) { /* check file contents */ 425*a1d2f846SLisandro Dalcin PetscMPIInt rank; 426*a1d2f846SLisandro Dalcin ierr = MPI_Comm_rank(comm,&rank);CHKERRMPI(ierr); 427*a1d2f846SLisandro Dalcin if (!rank) { 428*a1d2f846SLisandro Dalcin FILE *fh = fopen(filename,"r"); 429*a1d2f846SLisandro Dalcin if (fh) { 430*a1d2f846SLisandro Dalcin char buf[6] = ""; 431*a1d2f846SLisandro Dalcin if (fread(buf,1,6,fh) > 0) { 432*a1d2f846SLisandro Dalcin ierr = PetscStrncmp(buf,"%YAML ",6,yaml);CHKERRQ(ierr); /* check for '%YAML' tag */ 433*a1d2f846SLisandro Dalcin if (!*yaml) {ierr = PetscStrncmp(buf,"---",3,yaml);CHKERRQ(ierr);} /* check for document start */ 434*a1d2f846SLisandro Dalcin } 435*a1d2f846SLisandro Dalcin (void)fclose(fh); 436*a1d2f846SLisandro Dalcin } 437*a1d2f846SLisandro Dalcin } 438*a1d2f846SLisandro Dalcin ierr = MPI_Bcast(yaml,1,MPIU_BOOL,0,comm);CHKERRMPI(ierr); 439*a1d2f846SLisandro Dalcin } 440be10d61cSLisandro Dalcin PetscFunctionReturn(0); 441be10d61cSLisandro Dalcin } 442e5c89e4eSSatish Balay 443be10d61cSLisandro Dalcin static PetscErrorCode PetscOptionsInsertFilePetsc(MPI_Comm comm,PetscOptions options,const char file[],PetscBool require) 444e5c89e4eSSatish Balay { 4458c0b561eSLisandro Dalcin char *string,*vstring = NULL,*astring = NULL,*packed = NULL; 4467fb43599SVaclav Hapla char *tokens[4]; 447e5c89e4eSSatish Balay PetscErrorCode ierr; 44813e3f751SJed Brown size_t i,len,bytes; 449e5c89e4eSSatish Balay FILE *fd; 4507fb43599SVaclav Hapla PetscToken token=NULL; 451ed9cf6e9SBarry Smith int err; 452581bbe83SVaclav Hapla char *cmatch; 453581bbe83SVaclav Hapla const char cmt='#'; 4549210b8eaSVaclav Hapla PetscInt line=1; 4553a018368SJed Brown PetscMPIInt rank,cnt=0,acnt=0,counts[2]; 4569210b8eaSVaclav Hapla PetscBool isdir,alias=PETSC_FALSE,valid; 457e5c89e4eSSatish Balay 458e5c89e4eSSatish Balay PetscFunctionBegin; 459be10d61cSLisandro Dalcin 4607fb43599SVaclav Hapla ierr = PetscMemzero(tokens,sizeof(tokens));CHKERRQ(ierr); 4618c0b561eSLisandro Dalcin ierr = MPI_Comm_rank(comm,&rank);CHKERRMPI(ierr); 46205c7dedfSBarry Smith if (!rank) { 4638c0b561eSLisandro Dalcin char fpath[PETSC_MAX_PATH_LEN]; 4648c0b561eSLisandro Dalcin char fname[PETSC_MAX_PATH_LEN]; 46505c7dedfSBarry Smith 4668c0b561eSLisandro Dalcin ierr = PetscStrreplace(PETSC_COMM_SELF,file,fpath,sizeof(fpath));CHKERRQ(ierr); 4678c0b561eSLisandro Dalcin ierr = PetscFixFilename(fpath,fname);CHKERRQ(ierr); 4688c0b561eSLisandro Dalcin 469e5c89e4eSSatish Balay fd = fopen(fname,"r"); 470ad38b122SPatrick Sanan ierr = PetscTestDirectory(fname,'r',&isdir);CHKERRQ(ierr); 471ad38b122SPatrick Sanan if (isdir && require) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_USER,"Specified options file %s is a directory",fname); 472ad38b122SPatrick Sanan if (fd && !isdir) { 4733a018368SJed Brown PetscSegBuffer vseg,aseg; 4743a018368SJed Brown ierr = PetscSegBufferCreate(1,4000,&vseg);CHKERRQ(ierr); 4753a018368SJed Brown ierr = PetscSegBufferCreate(1,2000,&aseg);CHKERRQ(ierr); 4763a018368SJed Brown 4779b754dc9SBarry Smith /* the following line will not work when opening initial files (like .petscrc) since info is not yet set */ 47802c9f0b5SLisandro Dalcin ierr = PetscInfo1(NULL,"Opened options file %s\n",file);CHKERRQ(ierr); 479e24ecc5dSJed Brown 4805fa91da5SBarry Smith while ((string = Petscgetline(fd))) { 4814704e885SBarry Smith /* eliminate comments from each line */ 482581bbe83SVaclav Hapla ierr = PetscStrchr(string,cmt,&cmatch);CHKERRQ(ierr); 48390f79514SSatish Balay if (cmatch) *cmatch = 0; 484e5c89e4eSSatish Balay ierr = PetscStrlen(string,&len);CHKERRQ(ierr); 4855981331cSSatish Balay /* replace tabs, ^M, \n with " " */ 486e5c89e4eSSatish Balay for (i=0; i<len; i++) { 4875981331cSSatish Balay if (string[i] == '\t' || string[i] == '\r' || string[i] == '\n') { 488e5c89e4eSSatish Balay string[i] = ' '; 489e5c89e4eSSatish Balay } 490e5c89e4eSSatish Balay } 49190f79514SSatish Balay ierr = PetscTokenCreate(string,' ',&token);CHKERRQ(ierr); 4927fb43599SVaclav Hapla ierr = PetscTokenFind(token,&tokens[0]);CHKERRQ(ierr); 4937fb43599SVaclav Hapla if (!tokens[0]) { 49402b0d46eSSatish Balay goto destroy; 4957fb43599SVaclav Hapla } else if (!tokens[0][0]) { /* if token 0 is empty (string begins with spaces), redo */ 4967fb43599SVaclav Hapla ierr = PetscTokenFind(token,&tokens[0]);CHKERRQ(ierr); 49790f79514SSatish Balay } 4987fb43599SVaclav Hapla for (i=1; i<4; i++) { 4997fb43599SVaclav Hapla ierr = PetscTokenFind(token,&tokens[i]);CHKERRQ(ierr); 5007fb43599SVaclav Hapla } 5017fb43599SVaclav Hapla if (!tokens[0]) { 5022662f744SSatish Balay goto destroy; 5037fb43599SVaclav Hapla } else if (tokens[0][0] == '-') { 5049210b8eaSVaclav Hapla ierr = PetscOptionsValidKey(tokens[0],&valid);CHKERRQ(ierr); 5059210b8eaSVaclav Hapla if (!valid) SETERRQ3(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Error in options file %s line %D: invalid option %s",fname,line,tokens[0]); 5067fb43599SVaclav Hapla ierr = PetscStrlen(tokens[0],&len);CHKERRQ(ierr); 50713e3f751SJed Brown ierr = PetscSegBufferGet(vseg,len+1,&vstring);CHKERRQ(ierr); 5087fb43599SVaclav Hapla ierr = PetscArraycpy(vstring,tokens[0],len);CHKERRQ(ierr); 509e24ecc5dSJed Brown vstring[len] = ' '; 5107fb43599SVaclav Hapla if (tokens[1]) { 5119210b8eaSVaclav Hapla ierr = PetscOptionsValidKey(tokens[1],&valid);CHKERRQ(ierr); 5129210b8eaSVaclav Hapla if (valid) SETERRQ4(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Error in options file %s line %D: cannot specify two options per line (%s %s)",fname,line,tokens[0],tokens[1]); 5137fb43599SVaclav Hapla ierr = PetscStrlen(tokens[1],&len);CHKERRQ(ierr); 51413e3f751SJed Brown ierr = PetscSegBufferGet(vseg,len+3,&vstring);CHKERRQ(ierr); 515e24ecc5dSJed Brown vstring[0] = '"'; 5167fb43599SVaclav Hapla ierr = PetscArraycpy(vstring+1,tokens[1],len);CHKERRQ(ierr); 517e24ecc5dSJed Brown vstring[len+1] = '"'; 518e24ecc5dSJed Brown vstring[len+2] = ' '; 51909192fe3SBarry Smith } 52090f79514SSatish Balay } else { 5219210b8eaSVaclav Hapla ierr = PetscStrcasecmp(tokens[0],"alias",&alias);CHKERRQ(ierr); 5229210b8eaSVaclav Hapla if (alias) { 5239210b8eaSVaclav Hapla ierr = PetscOptionsValidKey(tokens[1],&valid);CHKERRQ(ierr); 5249210b8eaSVaclav Hapla if (!valid) SETERRQ3(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Error in options file %s line %D: invalid aliased option %s",fname,line,tokens[1]); 5259210b8eaSVaclav Hapla if (!tokens[2]) SETERRQ3(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Error in options file %s line %D: alias missing for %s",fname,line,tokens[1]); 5269210b8eaSVaclav Hapla ierr = PetscOptionsValidKey(tokens[2],&valid);CHKERRQ(ierr); 5279210b8eaSVaclav Hapla if (!valid) SETERRQ3(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Error in options file %s line %D: invalid aliasee option %s",fname,line,tokens[2]); 5287fb43599SVaclav Hapla ierr = PetscStrlen(tokens[1],&len);CHKERRQ(ierr); 52913e3f751SJed Brown ierr = PetscSegBufferGet(aseg,len+1,&astring);CHKERRQ(ierr); 5307fb43599SVaclav Hapla ierr = PetscArraycpy(astring,tokens[1],len);CHKERRQ(ierr); 531e24ecc5dSJed Brown astring[len] = ' '; 532e24ecc5dSJed Brown 5337fb43599SVaclav Hapla ierr = PetscStrlen(tokens[2],&len);CHKERRQ(ierr); 53413e3f751SJed Brown ierr = PetscSegBufferGet(aseg,len+1,&astring);CHKERRQ(ierr); 5357fb43599SVaclav Hapla ierr = PetscArraycpy(astring,tokens[2],len);CHKERRQ(ierr); 536e24ecc5dSJed Brown astring[len] = ' '; 5379210b8eaSVaclav Hapla } else SETERRQ3(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Unknown first token in options file %s line %D: %s",fname,line,tokens[0]); 5389210b8eaSVaclav Hapla } 5399210b8eaSVaclav Hapla { 5409210b8eaSVaclav Hapla const char *extraToken = alias ? tokens[3] : tokens[2]; 5419210b8eaSVaclav Hapla if (extraToken) SETERRQ3(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Error in options file %s line %D: extra token %s",fname,line,extraToken); 542e5c89e4eSSatish Balay } 54302b0d46eSSatish Balay destroy: 5444b40f50bSBarry Smith free(string); 5458c74ee41SBarry Smith ierr = PetscTokenDestroy(&token);CHKERRQ(ierr); 5469210b8eaSVaclav Hapla alias = PETSC_FALSE; 5479210b8eaSVaclav Hapla line++; 548e5c89e4eSSatish Balay } 549ed9cf6e9SBarry Smith err = fclose(fd); 5509210b8eaSVaclav Hapla if (err) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SYS,"fclose() failed on file %s",fname); 551e24ecc5dSJed Brown ierr = PetscSegBufferGetSize(aseg,&bytes);CHKERRQ(ierr); /* size without null termination */ 552e24ecc5dSJed Brown ierr = PetscMPIIntCast(bytes,&acnt);CHKERRQ(ierr); 553e24ecc5dSJed Brown ierr = PetscSegBufferGet(aseg,1,&astring);CHKERRQ(ierr); 554e24ecc5dSJed Brown astring[0] = 0; 555e24ecc5dSJed Brown ierr = PetscSegBufferGetSize(vseg,&bytes);CHKERRQ(ierr); /* size without null termination */ 556e24ecc5dSJed Brown ierr = PetscMPIIntCast(bytes,&cnt);CHKERRQ(ierr); 557e24ecc5dSJed Brown ierr = PetscSegBufferGet(vseg,1,&vstring);CHKERRQ(ierr); 558e24ecc5dSJed Brown vstring[0] = 0; 559854ce69bSBarry Smith ierr = PetscMalloc1(2+acnt+cnt,&packed);CHKERRQ(ierr); 5603a018368SJed Brown ierr = PetscSegBufferExtractTo(aseg,packed);CHKERRQ(ierr); 5613a018368SJed Brown ierr = PetscSegBufferExtractTo(vseg,packed+acnt+1);CHKERRQ(ierr); 5623a018368SJed Brown ierr = PetscSegBufferDestroy(&aseg);CHKERRQ(ierr); 5633a018368SJed Brown ierr = PetscSegBufferDestroy(&vseg);CHKERRQ(ierr); 5649210b8eaSVaclav Hapla } else if (require) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_USER,"Unable to open options file %s",fname); 5659b754dc9SBarry Smith } 56605c7dedfSBarry Smith 5673a018368SJed Brown counts[0] = acnt; 5683a018368SJed Brown counts[1] = cnt; 5694201f521SBarry Smith err = MPI_Bcast(counts,2,MPI_INT,0,comm); 5704201f521SBarry Smith if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Error in first MPI collective call, could be caused by using an incorrect mpiexec or a network problem, it can be caused by having VPN running: see https://www.mcs.anl.gov/petsc/documentation/faq.html"); 5713a018368SJed Brown acnt = counts[0]; 5723a018368SJed Brown cnt = counts[1]; 5733a018368SJed Brown if (rank) { 574854ce69bSBarry Smith ierr = PetscMalloc1(2+acnt+cnt,&packed);CHKERRQ(ierr); 5753a018368SJed Brown } 5763a018368SJed Brown if (acnt || cnt) { 577ffc4695bSBarry Smith ierr = MPI_Bcast(packed,2+acnt+cnt,MPI_CHAR,0,comm);CHKERRMPI(ierr); 5783a018368SJed Brown astring = packed; 5793a018368SJed Brown vstring = packed + acnt + 1; 5803a018368SJed Brown } 5813a018368SJed Brown 5829b754dc9SBarry Smith if (acnt) { 5839b754dc9SBarry Smith ierr = PetscTokenCreate(astring,' ',&token);CHKERRQ(ierr); 5847fb43599SVaclav Hapla ierr = PetscTokenFind(token,&tokens[0]);CHKERRQ(ierr); 5857fb43599SVaclav Hapla while (tokens[0]) { 5867fb43599SVaclav Hapla ierr = PetscTokenFind(token,&tokens[1]);CHKERRQ(ierr); 5877fb43599SVaclav Hapla ierr = PetscOptionsSetAlias(options,tokens[0],tokens[1]);CHKERRQ(ierr); 5887fb43599SVaclav Hapla ierr = PetscTokenFind(token,&tokens[0]);CHKERRQ(ierr); 5899b754dc9SBarry Smith } 5908c74ee41SBarry Smith ierr = PetscTokenDestroy(&token);CHKERRQ(ierr); 5919b754dc9SBarry Smith } 5929b754dc9SBarry Smith 5939b754dc9SBarry Smith if (cnt) { 594c5929fdfSBarry Smith ierr = PetscOptionsInsertString(options,vstring);CHKERRQ(ierr); 595e5c89e4eSSatish Balay } 5963a018368SJed Brown ierr = PetscFree(packed);CHKERRQ(ierr); 597e5c89e4eSSatish Balay PetscFunctionReturn(0); 598e5c89e4eSSatish Balay } 599e5c89e4eSSatish Balay 600d06005cbSLisandro Dalcin /*@C 601be10d61cSLisandro Dalcin PetscOptionsInsertFile - Inserts options into the database from a file. 602be10d61cSLisandro Dalcin 603be10d61cSLisandro Dalcin Collective 604be10d61cSLisandro Dalcin 605be10d61cSLisandro Dalcin Input Parameter: 606be10d61cSLisandro Dalcin + comm - the processes that will share the options (usually PETSC_COMM_WORLD) 607be10d61cSLisandro Dalcin . options - options database, use NULL for default global database 608be10d61cSLisandro Dalcin . file - name of file, 609be10d61cSLisandro Dalcin ".yml" and ".yaml" filename extensions are inserted as YAML options, 610be10d61cSLisandro Dalcin append ":yaml" to filename to force YAML options. 611be10d61cSLisandro Dalcin - require - if PETSC_TRUE will generate an error if the file does not exist 612be10d61cSLisandro Dalcin 613be10d61cSLisandro Dalcin 614be10d61cSLisandro Dalcin Notes: 615be10d61cSLisandro Dalcin Use # for lines that are comments and which should be ignored. 616be10d61cSLisandro Dalcin Usually, instead of using this command, one should list the file name in the call to PetscInitialize(), this insures that certain options 617be10d61cSLisandro 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 618be10d61cSLisandro Dalcin calls to XXXSetFromOptions() it should not be used for options listed under PetscInitialize(). 619be10d61cSLisandro Dalcin The collectivity of this routine is complex; only the MPI processes in comm will 620be10d61cSLisandro Dalcin have the affect of these options. If some processes that create objects call this routine and others do 621be10d61cSLisandro Dalcin not the code may fail in complicated ways because the same parallel solvers may incorrectly use different options 622be10d61cSLisandro Dalcin on different ranks. 623be10d61cSLisandro Dalcin 624be10d61cSLisandro Dalcin Level: developer 625be10d61cSLisandro Dalcin 626be10d61cSLisandro Dalcin .seealso: PetscOptionsSetValue(), PetscOptionsView(), PetscOptionsHasName(), PetscOptionsGetInt(), 627be10d61cSLisandro Dalcin PetscOptionsGetReal(), PetscOptionsGetString(), PetscOptionsGetIntArray(), PetscOptionsBool(), 628be10d61cSLisandro Dalcin PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 629be10d61cSLisandro Dalcin PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 630be10d61cSLisandro Dalcin PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 631be10d61cSLisandro Dalcin PetscOptionsFList(), PetscOptionsEList() 632be10d61cSLisandro Dalcin 633be10d61cSLisandro Dalcin @*/ 634be10d61cSLisandro Dalcin PetscErrorCode PetscOptionsInsertFile(MPI_Comm comm,PetscOptions options,const char file[],PetscBool require) 635be10d61cSLisandro Dalcin { 636be10d61cSLisandro Dalcin char filename[PETSC_MAX_PATH_LEN]; 637be10d61cSLisandro Dalcin PetscBool yaml; 638be10d61cSLisandro Dalcin PetscErrorCode ierr; 639be10d61cSLisandro Dalcin 640be10d61cSLisandro Dalcin PetscFunctionBegin; 641be10d61cSLisandro Dalcin ierr = PetscOptionsFilename(comm,file,filename,&yaml);CHKERRQ(ierr); 642be10d61cSLisandro Dalcin if (yaml) { 643be10d61cSLisandro Dalcin ierr = PetscOptionsInsertFileYAML(comm,options,filename,require);CHKERRQ(ierr); 644be10d61cSLisandro Dalcin } else { 645be10d61cSLisandro Dalcin ierr = PetscOptionsInsertFilePetsc(comm,options,filename,require);CHKERRQ(ierr); 646be10d61cSLisandro Dalcin } 647be10d61cSLisandro Dalcin PetscFunctionReturn(0); 648be10d61cSLisandro Dalcin } 649be10d61cSLisandro Dalcin 650be10d61cSLisandro Dalcin /*@C 651d06005cbSLisandro Dalcin PetscOptionsInsertArgs - Inserts options into the database from a array of strings 652d06005cbSLisandro Dalcin 653d06005cbSLisandro Dalcin Logically Collective 654d06005cbSLisandro Dalcin 655d06005cbSLisandro Dalcin Input Parameter: 656d06005cbSLisandro Dalcin + options - options object 657d06005cbSLisandro Dalcin . argc - the array lenght 658d06005cbSLisandro Dalcin - args - the string array 659d06005cbSLisandro Dalcin 660d06005cbSLisandro Dalcin Level: intermediate 661d06005cbSLisandro Dalcin 662d06005cbSLisandro Dalcin .seealso: PetscOptions, PetscOptionsInsertString(), PetscOptionsInsertFile() 663d06005cbSLisandro Dalcin @*/ 664d06005cbSLisandro Dalcin PetscErrorCode PetscOptionsInsertArgs(PetscOptions options,int argc,char *args[]) 66585079163SJed Brown { 666d06005cbSLisandro Dalcin MPI_Comm comm = PETSC_COMM_WORLD; 66785079163SJed Brown PetscErrorCode ierr; 668d06005cbSLisandro Dalcin int left = PetscMax(argc,0); 669d06005cbSLisandro Dalcin char *const *eargs = args; 67085079163SJed Brown 67185079163SJed Brown PetscFunctionBegin; 67285079163SJed Brown while (left) { 673d06005cbSLisandro Dalcin PetscBool isfile,isfileyaml,isstringyaml,ispush,ispop,key; 674d06005cbSLisandro Dalcin ierr = PetscStrcasecmp(eargs[0],"-options_file",&isfile);CHKERRQ(ierr); 675d06005cbSLisandro Dalcin ierr = PetscStrcasecmp(eargs[0],"-options_file_yaml",&isfileyaml);CHKERRQ(ierr); 676d06005cbSLisandro Dalcin ierr = PetscStrcasecmp(eargs[0],"-options_string_yaml",&isstringyaml);CHKERRQ(ierr); 677d06005cbSLisandro Dalcin ierr = PetscStrcasecmp(eargs[0],"-prefix_push",&ispush);CHKERRQ(ierr); 678d06005cbSLisandro Dalcin ierr = PetscStrcasecmp(eargs[0],"-prefix_pop",&ispop);CHKERRQ(ierr); 679093de6efSBarry Smith ierr = PetscOptionsValidKey(eargs[0],&key);CHKERRQ(ierr); 680093de6efSBarry Smith if (!key) { 68185079163SJed Brown eargs++; left--; 682d06005cbSLisandro Dalcin } else if (isfile) { 683d06005cbSLisandro Dalcin if (left <= 1 || eargs[1][0] == '-') SETERRQ(PETSC_COMM_SELF,PETSC_ERR_USER,"Missing filename for -options_file filename option"); 684d06005cbSLisandro Dalcin ierr = PetscOptionsInsertFile(comm,options,eargs[1],PETSC_TRUE);CHKERRQ(ierr); 68585079163SJed Brown eargs += 2; left -= 2; 686d06005cbSLisandro Dalcin } else if (isfileyaml) { 687d06005cbSLisandro Dalcin if (left <= 1 || eargs[1][0] == '-') SETERRQ(PETSC_COMM_SELF,PETSC_ERR_USER,"Missing filename for -options_file_yaml filename option"); 688d06005cbSLisandro Dalcin ierr = PetscOptionsInsertFileYAML(comm,options,eargs[1],PETSC_TRUE);CHKERRQ(ierr); 689d06005cbSLisandro Dalcin eargs += 2; left -= 2; 690d06005cbSLisandro Dalcin } else if (isstringyaml) { 691d06005cbSLisandro Dalcin if (left <= 1 || eargs[1][0] == '-') SETERRQ(PETSC_COMM_SELF,PETSC_ERR_USER,"Missing string for -options_string_yaml string option"); 692d06005cbSLisandro Dalcin ierr = PetscOptionsInsertStringYAML(options,eargs[1]);CHKERRQ(ierr); 693d06005cbSLisandro Dalcin eargs += 2; left -= 2; 694d06005cbSLisandro Dalcin } else if (ispush) { 6959db968c8SJed Brown if (left <= 1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_USER,"Missing prefix for -prefix_push option"); 6969db968c8SJed Brown if (eargs[1][0] == '-') SETERRQ(PETSC_COMM_SELF,PETSC_ERR_USER,"Missing prefix for -prefix_push option (prefixes cannot start with '-')"); 697c5929fdfSBarry Smith ierr = PetscOptionsPrefixPush(options,eargs[1]);CHKERRQ(ierr); 6989db968c8SJed Brown eargs += 2; left -= 2; 699d06005cbSLisandro Dalcin } else if (ispop) { 700c5929fdfSBarry Smith ierr = PetscOptionsPrefixPop(options);CHKERRQ(ierr); 7019db968c8SJed Brown eargs++; left--; 7027935c3d8SJed Brown } else { 7037935c3d8SJed Brown PetscBool nextiskey = PETSC_FALSE; 7047935c3d8SJed Brown if (left >= 2) {ierr = PetscOptionsValidKey(eargs[1],&nextiskey);CHKERRQ(ierr);} 70598b6bf53SJed Brown if (left < 2 || nextiskey) { 706c5929fdfSBarry Smith ierr = PetscOptionsSetValue(options,eargs[0],NULL);CHKERRQ(ierr); 70785079163SJed Brown eargs++; left--; 70885079163SJed Brown } else { 709c5929fdfSBarry Smith ierr = PetscOptionsSetValue(options,eargs[0],eargs[1]);CHKERRQ(ierr); 71085079163SJed Brown eargs += 2; left -= 2; 71185079163SJed Brown } 71285079163SJed Brown } 7137935c3d8SJed Brown } 71485079163SJed Brown PetscFunctionReturn(0); 71585079163SJed Brown } 71685079163SJed Brown 717c5b5d8d5SVaclav Hapla PETSC_STATIC_INLINE PetscErrorCode PetscOptionsStringToBoolIfSet_Private(enum PetscPrecedentOption opt,const char *val[],PetscBool set[],PetscBool *flg) 718c5b5d8d5SVaclav Hapla { 719c5b5d8d5SVaclav Hapla PetscErrorCode ierr; 720c5b5d8d5SVaclav Hapla 721c5b5d8d5SVaclav Hapla PetscFunctionBegin; 722c5b5d8d5SVaclav Hapla if (set[opt]) { 723c5b5d8d5SVaclav Hapla ierr = PetscOptionsStringToBool(val[opt],flg);CHKERRQ(ierr); 724c5b5d8d5SVaclav Hapla } else *flg = PETSC_FALSE; 725c5b5d8d5SVaclav Hapla PetscFunctionReturn(0); 726c5b5d8d5SVaclav Hapla } 727c5b5d8d5SVaclav Hapla 728c5b5d8d5SVaclav Hapla /* Process options with absolute precedence */ 729c5b5d8d5SVaclav Hapla static PetscErrorCode PetscOptionsProcessPrecedentFlags(PetscOptions options,int argc,char *args[],PetscBool *skip_petscrc,PetscBool *skip_petscrc_set) 730c5b5d8d5SVaclav Hapla { 731c5b5d8d5SVaclav Hapla const char* const *opt = precedentOptions; 732c5b5d8d5SVaclav Hapla const size_t n = PO_NUM; 733c5b5d8d5SVaclav Hapla size_t o; 734c5b5d8d5SVaclav Hapla int a; 735c5b5d8d5SVaclav Hapla const char **val; 736c5b5d8d5SVaclav Hapla PetscBool *set; 737c5b5d8d5SVaclav Hapla PetscErrorCode ierr; 738c5b5d8d5SVaclav Hapla 739c5b5d8d5SVaclav Hapla PetscFunctionBegin; 740c5b5d8d5SVaclav Hapla ierr = PetscCalloc2(n,&val,n,&set);CHKERRQ(ierr); 741c5b5d8d5SVaclav Hapla 742c5b5d8d5SVaclav Hapla /* Look for options possibly set using PetscOptionsSetValue beforehand */ 743c5b5d8d5SVaclav Hapla for (o=0; o<n; o++) { 744c5b5d8d5SVaclav Hapla ierr = PetscOptionsFindPair(options,NULL,opt[o],&val[o],&set[o]);CHKERRQ(ierr); 745c5b5d8d5SVaclav Hapla } 746c5b5d8d5SVaclav Hapla 747c5b5d8d5SVaclav Hapla /* Loop through all args to collect last occuring value of each option */ 748c5b5d8d5SVaclav Hapla for (a=1; a<argc; a++) { 749c5b5d8d5SVaclav Hapla PetscBool valid, eq; 750c5b5d8d5SVaclav Hapla 751c5b5d8d5SVaclav Hapla ierr = PetscOptionsValidKey(args[a],&valid);CHKERRQ(ierr); 752c5b5d8d5SVaclav Hapla if (!valid) continue; 753c5b5d8d5SVaclav Hapla for (o=0; o<n; o++) { 754c5b5d8d5SVaclav Hapla ierr = PetscStrcasecmp(args[a],opt[o],&eq);CHKERRQ(ierr); 755c5b5d8d5SVaclav Hapla if (eq) { 756c5b5d8d5SVaclav Hapla set[o] = PETSC_TRUE; 757c5b5d8d5SVaclav Hapla if (a == argc-1 || !args[a+1] || !args[a+1][0] || args[a+1][0] == '-') val[o] = NULL; 758c5b5d8d5SVaclav Hapla else val[o] = args[a+1]; 759c5b5d8d5SVaclav Hapla break; 760c5b5d8d5SVaclav Hapla } 761c5b5d8d5SVaclav Hapla } 762c5b5d8d5SVaclav Hapla } 763c5b5d8d5SVaclav Hapla 764c5b5d8d5SVaclav Hapla /* Process flags */ 765d314f959SVaclav Hapla ierr = PetscStrcasecmp(val[PO_HELP], "intro", &options->help_intro);CHKERRQ(ierr); 766d314f959SVaclav Hapla if (options->help_intro) options->help = PETSC_TRUE; 767d314f959SVaclav Hapla else {ierr = PetscOptionsStringToBoolIfSet_Private(PO_HELP, val,set,&options->help);CHKERRQ(ierr);} 768c5b5d8d5SVaclav Hapla ierr = PetscOptionsStringToBoolIfSet_Private(PO_OPTIONS_MONITOR_CANCEL,val,set,&options->monitorCancel);CHKERRQ(ierr); 769c5b5d8d5SVaclav Hapla ierr = PetscOptionsStringToBoolIfSet_Private(PO_OPTIONS_MONITOR, val,set,&options->monitorFromOptions);CHKERRQ(ierr); 770c5b5d8d5SVaclav Hapla ierr = PetscOptionsStringToBoolIfSet_Private(PO_SKIP_PETSCRC, val,set,skip_petscrc);CHKERRQ(ierr); 771c5b5d8d5SVaclav Hapla *skip_petscrc_set = set[PO_SKIP_PETSCRC]; 772c5b5d8d5SVaclav Hapla 773c5b5d8d5SVaclav Hapla /* Store precedent options in database and mark them as used */ 774c5b5d8d5SVaclav Hapla for (o=0; o<n; o++) { 775c5b5d8d5SVaclav Hapla if (set[o]) { 776d06005cbSLisandro Dalcin ierr = PetscOptionsSetValue_Private(options,opt[o],val[o],&a);CHKERRQ(ierr); 777d06005cbSLisandro Dalcin options->used[a] = PETSC_TRUE; 778c5b5d8d5SVaclav Hapla } 779c5b5d8d5SVaclav Hapla } 780c5b5d8d5SVaclav Hapla 781c5b5d8d5SVaclav Hapla ierr = PetscFree2(val,set);CHKERRQ(ierr); 782c5b5d8d5SVaclav Hapla options->precedentProcessed = PETSC_TRUE; 783c5b5d8d5SVaclav Hapla PetscFunctionReturn(0); 784c5b5d8d5SVaclav Hapla } 785c5b5d8d5SVaclav Hapla 786c5b5d8d5SVaclav Hapla PETSC_STATIC_INLINE PetscErrorCode PetscOptionsSkipPrecedent(PetscOptions options,const char name[],PetscBool *flg) 787c5b5d8d5SVaclav Hapla { 788c5b5d8d5SVaclav Hapla int i; 789c5b5d8d5SVaclav Hapla PetscErrorCode ierr; 790c5b5d8d5SVaclav Hapla 791c5b5d8d5SVaclav Hapla *flg = PETSC_FALSE; 792c5b5d8d5SVaclav Hapla if (options->precedentProcessed) { 793c5b5d8d5SVaclav Hapla for (i=0; i<PO_NUM; i++) { 794c5b5d8d5SVaclav Hapla if (!PetscOptNameCmp(precedentOptions[i],name)) { 795c5b5d8d5SVaclav Hapla /* check if precedent option has been set already */ 796d06005cbSLisandro Dalcin ierr = PetscOptionsFindPair(options,NULL,name,NULL,flg);if (ierr) return ierr; 797c5b5d8d5SVaclav Hapla if (*flg) break; 798c5b5d8d5SVaclav Hapla } 799c5b5d8d5SVaclav Hapla } 800c5b5d8d5SVaclav Hapla } 801d06005cbSLisandro Dalcin return 0; 802c5b5d8d5SVaclav Hapla } 80385079163SJed Brown 804e5c89e4eSSatish Balay /*@C 805e5c89e4eSSatish Balay PetscOptionsInsert - Inserts into the options database from the command line, 806e5c89e4eSSatish Balay the environmental variable and a file. 807e5c89e4eSSatish Balay 8081c9f3c13SBarry Smith Collective on PETSC_COMM_WORLD 8091c9f3c13SBarry Smith 810e5c89e4eSSatish Balay Input Parameters: 811c5929fdfSBarry Smith + options - options database or NULL for the default global database 812c5929fdfSBarry Smith . argc - count of number of command line arguments 813e5c89e4eSSatish Balay . args - the command line arguments 814be10d61cSLisandro Dalcin - file - [optional] PETSc database file, append ":yaml" to filename to specify YAML options format. 815be10d61cSLisandro Dalcin Use NULL or empty string to not check for code specific file. 816be10d61cSLisandro Dalcin Also checks ~/.petscrc, .petscrc and petscrc. 817c5b5d8d5SVaclav Hapla Use -skip_petscrc in the code specific file (or command line) to skip ~/.petscrc, .petscrc and petscrc files. 818e5c89e4eSSatish Balay 819e5c89e4eSSatish Balay Note: 820e5c89e4eSSatish Balay Since PetscOptionsInsert() is automatically called by PetscInitialize(), 821e5c89e4eSSatish Balay the user does not typically need to call this routine. PetscOptionsInsert() 822e5c89e4eSSatish Balay can be called several times, adding additional entries into the database. 823e5c89e4eSSatish Balay 824081c24baSBoyana Norris Options Database Keys: 825d06005cbSLisandro Dalcin + -options_file <filename> - read options from a file 826d06005cbSLisandro Dalcin - -options_file_yaml <filename> - read options from a YAML file 827c5b5d8d5SVaclav Hapla 828c5b5d8d5SVaclav Hapla See PetscInitialize() for options related to option database monitoring. 829081c24baSBoyana Norris 830e5c89e4eSSatish Balay Level: advanced 831e5c89e4eSSatish Balay 8322d747510SLisandro Dalcin .seealso: PetscOptionsDestroy(), PetscOptionsView(), PetscOptionsInsertString(), PetscOptionsInsertFile(), 83396fc60bcSBarry Smith PetscInitialize() 834e5c89e4eSSatish Balay @*/ 835c5929fdfSBarry Smith PetscErrorCode PetscOptionsInsert(PetscOptions options,int *argc,char ***args,const char file[]) 836e5c89e4eSSatish Balay { 837d06005cbSLisandro Dalcin MPI_Comm comm = PETSC_COMM_WORLD; 838e5c89e4eSSatish Balay PetscErrorCode ierr; 839e5c89e4eSSatish Balay PetscMPIInt rank; 840c5b5d8d5SVaclav Hapla PetscBool hasArgs = (argc && *argc) ? PETSC_TRUE : PETSC_FALSE; 841c5b5d8d5SVaclav Hapla PetscBool skipPetscrc = PETSC_FALSE, skipPetscrcSet = PETSC_FALSE; 842e5c89e4eSSatish Balay 843e5c89e4eSSatish Balay PetscFunctionBegin; 844d06005cbSLisandro Dalcin if (hasArgs && !(args && *args)) SETERRQ(comm,PETSC_ERR_ARG_NULL,"*argc > 1 but *args not given"); 845d06005cbSLisandro Dalcin ierr = MPI_Comm_rank(comm,&rank);CHKERRMPI(ierr); 846e5c89e4eSSatish Balay 847c5b5d8d5SVaclav Hapla if (!options) { 848c5b5d8d5SVaclav Hapla ierr = PetscOptionsCreateDefault();CHKERRQ(ierr); 849c5b5d8d5SVaclav Hapla options = defaultoptions; 850c5b5d8d5SVaclav Hapla } 851c5b5d8d5SVaclav Hapla if (hasArgs) { 852c5b5d8d5SVaclav Hapla /* process options with absolute precedence */ 853c5b5d8d5SVaclav Hapla ierr = PetscOptionsProcessPrecedentFlags(options,*argc,*args,&skipPetscrc,&skipPetscrcSet);CHKERRQ(ierr); 854c5b5d8d5SVaclav Hapla } 8554b09e917SBarry Smith if (file && file[0]) { 856be10d61cSLisandro Dalcin ierr = PetscOptionsInsertFile(comm,options,file,PETSC_TRUE);CHKERRQ(ierr); 857c5b5d8d5SVaclav Hapla /* if -skip_petscrc has not been set from command line, check whether it has been set in the file */ 858c5b5d8d5SVaclav Hapla if (!skipPetscrcSet) {ierr = PetscOptionsGetBool(options,NULL,"-skip_petscrc",&skipPetscrc,NULL);CHKERRQ(ierr);} 859321366bcSBarry Smith } 860c5b5d8d5SVaclav Hapla if (!skipPetscrc) { 861be10d61cSLisandro Dalcin char filename[PETSC_MAX_PATH_LEN]; 862be10d61cSLisandro Dalcin ierr = PetscGetHomeDirectory(filename,sizeof(filename));CHKERRQ(ierr); 863be10d61cSLisandro Dalcin ierr = MPI_Bcast(filename,(int)sizeof(filename),MPI_CHAR,0,comm);CHKERRMPI(ierr); 8642d747510SLisandro Dalcin if (filename[0]) {ierr = PetscStrcat(filename,"/.petscrc");CHKERRQ(ierr);} 865d06005cbSLisandro Dalcin ierr = PetscOptionsInsertFile(comm,options,filename,PETSC_FALSE);CHKERRQ(ierr); 866d06005cbSLisandro Dalcin ierr = PetscOptionsInsertFile(comm,options,".petscrc",PETSC_FALSE);CHKERRQ(ierr); 867d06005cbSLisandro Dalcin ierr = PetscOptionsInsertFile(comm,options,"petscrc",PETSC_FALSE);CHKERRQ(ierr); 868e5c89e4eSSatish Balay } 869e5c89e4eSSatish Balay 8702d747510SLisandro Dalcin /* insert environment options */ 871e5c89e4eSSatish Balay { 8722d747510SLisandro Dalcin char *eoptions = NULL; 873e5c89e4eSSatish Balay size_t len = 0; 874e5c89e4eSSatish Balay if (!rank) { 875e5c89e4eSSatish Balay eoptions = (char*)getenv("PETSC_OPTIONS"); 876e5c89e4eSSatish Balay ierr = PetscStrlen(eoptions,&len);CHKERRQ(ierr); 877e5c89e4eSSatish Balay } 878be10d61cSLisandro Dalcin ierr = MPI_Bcast(&len,1,MPIU_SIZE_T,0,comm);CHKERRMPI(ierr); 879e5c89e4eSSatish Balay if (len) { 880d06005cbSLisandro Dalcin if (rank) {ierr = PetscMalloc1(len+1,&eoptions);CHKERRQ(ierr);} 881d06005cbSLisandro Dalcin ierr = MPI_Bcast(eoptions,len,MPI_CHAR,0,comm);CHKERRMPI(ierr); 88296fc60bcSBarry Smith if (rank) eoptions[len] = 0; 883c5929fdfSBarry Smith ierr = PetscOptionsInsertString(options,eoptions);CHKERRQ(ierr); 884e5c89e4eSSatish Balay if (rank) {ierr = PetscFree(eoptions);CHKERRQ(ierr);} 885e5c89e4eSSatish Balay } 886e5c89e4eSSatish Balay } 887e5c89e4eSSatish Balay 888d06005cbSLisandro Dalcin /* insert YAML environment options */ 88956a31166SBarry Smith { 8909fc438c3SToby Isaac char *eoptions = NULL; 8919fc438c3SToby Isaac size_t len = 0; 8929fc438c3SToby Isaac if (!rank) { 8939fc438c3SToby Isaac eoptions = (char*)getenv("PETSC_OPTIONS_YAML"); 8949fc438c3SToby Isaac ierr = PetscStrlen(eoptions,&len);CHKERRQ(ierr); 8959fc438c3SToby Isaac } 896be10d61cSLisandro Dalcin ierr = MPI_Bcast(&len,1,MPIU_SIZE_T,0,comm);CHKERRMPI(ierr); 8979fc438c3SToby Isaac if (len) { 898d06005cbSLisandro Dalcin if (rank) {ierr = PetscMalloc1(len+1,&eoptions);CHKERRQ(ierr);} 899d06005cbSLisandro Dalcin ierr = MPI_Bcast(eoptions,len,MPI_CHAR,0,comm);CHKERRMPI(ierr); 9009fc438c3SToby Isaac if (rank) eoptions[len] = 0; 9019fc438c3SToby Isaac ierr = PetscOptionsInsertStringYAML(options,eoptions);CHKERRQ(ierr); 9029fc438c3SToby Isaac if (rank) {ierr = PetscFree(eoptions);CHKERRQ(ierr);} 9039fc438c3SToby Isaac } 9049fc438c3SToby Isaac } 9053bcbd388SSean Farley 906c5b5d8d5SVaclav Hapla /* insert command line options here because they take precedence over arguments in petscrc/environment */ 907d06005cbSLisandro Dalcin if (hasArgs) {ierr = PetscOptionsInsertArgs(options,*argc-1,*args+1);CHKERRQ(ierr);} 908e5c89e4eSSatish Balay PetscFunctionReturn(0); 909e5c89e4eSSatish Balay } 910e5c89e4eSSatish Balay 911e5c89e4eSSatish Balay /*@C 91288c29154SBarry Smith PetscOptionsView - Prints the options that have been loaded. This is 913e5c89e4eSSatish Balay useful for debugging purposes. 914e5c89e4eSSatish Balay 915c139c21fSBarry Smith Logically Collective on PetscViewer 916e5c89e4eSSatish Balay 917e5c89e4eSSatish Balay Input Parameter: 918a2b725a8SWilliam Gropp + options - options database, use NULL for default global database 919a2b725a8SWilliam Gropp - viewer - must be an PETSCVIEWERASCII viewer 920e5c89e4eSSatish Balay 921e5c89e4eSSatish Balay Options Database Key: 92226a7e8d4SBarry Smith . -options_view - Activates PetscOptionsView() within PetscFinalize() 923e5c89e4eSSatish Balay 9249666a313SBarry Smith Notes: 9259666a313SBarry Smith Only the rank zero process of MPI_Comm used to create view prints the option values. Other processes 9261c9f3c13SBarry Smith may have different values but they are not printed. 9271c9f3c13SBarry Smith 928e5c89e4eSSatish Balay Level: advanced 929e5c89e4eSSatish Balay 930e5c89e4eSSatish Balay .seealso: PetscOptionsAllUsed() 931e5c89e4eSSatish Balay @*/ 932c5929fdfSBarry Smith PetscErrorCode PetscOptionsView(PetscOptions options,PetscViewer viewer) 933e5c89e4eSSatish Balay { 934e5c89e4eSSatish Balay PetscErrorCode ierr; 935431c96f7SBarry Smith PetscInt i; 93688c29154SBarry Smith PetscBool isascii; 937e5c89e4eSSatish Balay 938e5c89e4eSSatish Balay PetscFunctionBegin; 9392d747510SLisandro Dalcin if (viewer) PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2); 940c5929fdfSBarry Smith options = options ? options : defaultoptions; 94188c29154SBarry Smith if (!viewer) viewer = PETSC_VIEWER_STDOUT_WORLD; 942251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&isascii);CHKERRQ(ierr); 943ce94432eSBarry Smith if (!isascii) SETERRQ(PetscObjectComm((PetscObject)viewer),PETSC_ERR_SUP,"Only supports ASCII viewer"); 94488c29154SBarry Smith 9452d747510SLisandro Dalcin if (!options->N) { 94688c29154SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"#No PETSc Option Table entries\n");CHKERRQ(ierr); 9472d747510SLisandro Dalcin PetscFunctionReturn(0); 94830694fe9SBarry Smith } 9492d747510SLisandro Dalcin 9502d747510SLisandro Dalcin ierr = PetscViewerASCIIPrintf(viewer,"#PETSc Option Table entries:\n");CHKERRQ(ierr); 951e5c89e4eSSatish Balay for (i=0; i<options->N; i++) { 952e5c89e4eSSatish Balay if (options->values[i]) { 95388c29154SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"-%s %s\n",options->names[i],options->values[i]);CHKERRQ(ierr); 954e5c89e4eSSatish Balay } else { 95588c29154SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"-%s\n",options->names[i]);CHKERRQ(ierr); 956e5c89e4eSSatish Balay } 957e5c89e4eSSatish Balay } 95888c29154SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"#End of PETSc Option Table entries\n");CHKERRQ(ierr); 959e5c89e4eSSatish Balay PetscFunctionReturn(0); 960e5c89e4eSSatish Balay } 961e5c89e4eSSatish Balay 962e11779c2SBarry Smith /* 963e11779c2SBarry Smith Called by error handlers to print options used in run 964e11779c2SBarry Smith */ 96595c0884eSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscOptionsViewError(void) 966e11779c2SBarry Smith { 967e11779c2SBarry Smith PetscInt i; 9684416b707SBarry Smith PetscOptions options = defaultoptions; 969e11779c2SBarry Smith 970e11779c2SBarry Smith PetscFunctionBegin; 971e11779c2SBarry Smith if (options->N) { 972e11779c2SBarry Smith (*PetscErrorPrintf)("PETSc Option Table entries:\n"); 973e11779c2SBarry Smith } else { 974e11779c2SBarry Smith (*PetscErrorPrintf)("No PETSc Option Table entries\n"); 975e11779c2SBarry Smith } 976e11779c2SBarry Smith for (i=0; i<options->N; i++) { 977e11779c2SBarry Smith if (options->values[i]) { 978e11779c2SBarry Smith (*PetscErrorPrintf)("-%s %s\n",options->names[i],options->values[i]); 979e11779c2SBarry Smith } else { 980e11779c2SBarry Smith (*PetscErrorPrintf)("-%s\n",options->names[i]); 981e11779c2SBarry Smith } 982e11779c2SBarry Smith } 983e11779c2SBarry Smith PetscFunctionReturn(0); 984e11779c2SBarry Smith } 985e11779c2SBarry Smith 986e5c89e4eSSatish Balay /*@C 98774e0666dSJed Brown PetscOptionsPrefixPush - Designate a prefix to be used by all options insertions to follow. 98874e0666dSJed Brown 9891c9f3c13SBarry Smith Logically Collective 99074e0666dSJed Brown 9919db968c8SJed Brown Input Parameter: 992c5929fdfSBarry Smith + options - options database, or NULL for the default global database 993c5929fdfSBarry Smith - prefix - The string to append to the existing prefix 9949db968c8SJed Brown 9959db968c8SJed Brown Options Database Keys: 9969db968c8SJed Brown + -prefix_push <some_prefix_> - push the given prefix 9979db968c8SJed Brown - -prefix_pop - pop the last prefix 9989db968c8SJed Brown 9999db968c8SJed Brown Notes: 10009db968c8SJed Brown It is common to use this in conjunction with -options_file as in 10019db968c8SJed Brown 10029db968c8SJed Brown $ -prefix_push system1_ -options_file system1rc -prefix_pop -prefix_push system2_ -options_file system2rc -prefix_pop 10039db968c8SJed Brown 10049db968c8SJed Brown where the files no longer require all options to be prefixed with -system2_. 100574e0666dSJed Brown 10069666a313SBarry Smith The collectivity of this routine is complex; only the MPI processes that call this routine will 10071c9f3c13SBarry Smith have the affect of these options. If some processes that create objects call this routine and others do 10081c9f3c13SBarry Smith not the code may fail in complicated ways because the same parallel solvers may incorrectly use different options 10091c9f3c13SBarry Smith on different ranks. 10101c9f3c13SBarry Smith 101174e0666dSJed Brown Level: advanced 101274e0666dSJed Brown 10131c9f3c13SBarry Smith .seealso: PetscOptionsPrefixPop(), PetscOptionsPush(), PetscOptionsPop(), PetscOptionsCreate(), PetscOptionsSetValue() 101474e0666dSJed Brown @*/ 1015c5929fdfSBarry Smith PetscErrorCode PetscOptionsPrefixPush(PetscOptions options,const char prefix[]) 101674e0666dSJed Brown { 101774e0666dSJed Brown PetscErrorCode ierr; 101874e0666dSJed Brown size_t n; 101974e0666dSJed Brown PetscInt start; 10202d747510SLisandro Dalcin char key[MAXOPTNAME+1]; 10212d747510SLisandro Dalcin PetscBool valid; 102274e0666dSJed Brown 102374e0666dSJed Brown PetscFunctionBegin; 10249db968c8SJed Brown PetscValidCharPointer(prefix,1); 1025c5929fdfSBarry Smith options = options ? options : defaultoptions; 102674e0666dSJed Brown if (options->prefixind >= MAXPREFIXES) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Maximum depth of prefix stack %d exceeded, recompile \n src/sys/objects/options.c with larger value for MAXPREFIXES",MAXPREFIXES); 10272d747510SLisandro Dalcin key[0] = '-'; /* keys must start with '-' */ 10282d747510SLisandro Dalcin ierr = PetscStrncpy(key+1,prefix,sizeof(key)-1);CHKERRQ(ierr); 10292d747510SLisandro Dalcin ierr = PetscOptionsValidKey(key,&valid);CHKERRQ(ierr); 10308bf569ecSLisandro 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 */ 10318bf569ecSLisandro Dalcin if (!valid) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_USER,"Given prefix \"%s\" not valid (the first character must be a letter%s, do not include leading '-')",prefix,options->prefixind?" or digit":""); 103274e0666dSJed Brown start = options->prefixind ? options->prefixstack[options->prefixind-1] : 0; 103374e0666dSJed Brown ierr = PetscStrlen(prefix,&n);CHKERRQ(ierr); 103474e0666dSJed Brown if (n+1 > sizeof(options->prefix)-start) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Maximum prefix length %d exceeded",sizeof(options->prefix)); 1035580bdb30SBarry Smith ierr = PetscArraycpy(options->prefix+start,prefix,n+1);CHKERRQ(ierr); 103674e0666dSJed Brown options->prefixstack[options->prefixind++] = start+n; 103774e0666dSJed Brown PetscFunctionReturn(0); 103874e0666dSJed Brown } 103974e0666dSJed Brown 1040c5929fdfSBarry Smith /*@C 104174e0666dSJed Brown PetscOptionsPrefixPop - Remove the latest options prefix, see PetscOptionsPrefixPush() for details 104274e0666dSJed Brown 10431c9f3c13SBarry Smith Logically Collective on the MPI_Comm that called PetscOptionsPrefixPush() 104474e0666dSJed Brown 1045c5929fdfSBarry Smith Input Parameters: 1046c5929fdfSBarry Smith . options - options database, or NULL for the default global database 1047c5929fdfSBarry Smith 104874e0666dSJed Brown Level: advanced 104974e0666dSJed Brown 10501c9f3c13SBarry Smith .seealso: PetscOptionsPrefixPush(), PetscOptionsPush(), PetscOptionsPop(), PetscOptionsCreate(), PetscOptionsSetValue() 105174e0666dSJed Brown @*/ 1052c5929fdfSBarry Smith PetscErrorCode PetscOptionsPrefixPop(PetscOptions options) 105374e0666dSJed Brown { 105474e0666dSJed Brown PetscInt offset; 105574e0666dSJed Brown 105674e0666dSJed Brown PetscFunctionBegin; 1057c5929fdfSBarry Smith options = options ? options : defaultoptions; 105874e0666dSJed Brown if (options->prefixind < 1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"More prefixes popped than pushed"); 105974e0666dSJed Brown options->prefixind--; 106074e0666dSJed Brown offset = options->prefixind ? options->prefixstack[options->prefixind-1] : 0; 106174e0666dSJed Brown options->prefix[offset] = 0; 106274e0666dSJed Brown PetscFunctionReturn(0); 106374e0666dSJed Brown } 106474e0666dSJed Brown 1065a542b6e8SBarry Smith /*@C 1066a542b6e8SBarry Smith PetscOptionsClear - Removes all options form the database leaving it empty. 1067a542b6e8SBarry Smith 10681c9f3c13SBarry Smith Logically Collective 10691c9f3c13SBarry Smith 1070c5929fdfSBarry Smith Input Parameters: 1071c5929fdfSBarry Smith . options - options database, use NULL for the default global database 1072c5929fdfSBarry Smith 10739666a313SBarry Smith The collectivity of this routine is complex; only the MPI processes that call this routine will 10741c9f3c13SBarry Smith have the affect of these options. If some processes that create objects call this routine and others do 10751c9f3c13SBarry Smith not the code may fail in complicated ways because the same parallel solvers may incorrectly use different options 10761c9f3c13SBarry Smith on different ranks. 10771c9f3c13SBarry Smith 1078a542b6e8SBarry Smith Level: developer 1079a542b6e8SBarry Smith 1080a542b6e8SBarry Smith .seealso: PetscOptionsInsert() 1081a542b6e8SBarry Smith @*/ 1082c5929fdfSBarry Smith PetscErrorCode PetscOptionsClear(PetscOptions options) 1083a542b6e8SBarry Smith { 1084a542b6e8SBarry Smith PetscInt i; 1085a542b6e8SBarry Smith 1086c5929fdfSBarry Smith options = options ? options : defaultoptions; 10872d747510SLisandro Dalcin if (!options) return 0; 10882d747510SLisandro Dalcin 1089a542b6e8SBarry Smith for (i=0; i<options->N; i++) { 1090a542b6e8SBarry Smith if (options->names[i]) free(options->names[i]); 1091a542b6e8SBarry Smith if (options->values[i]) free(options->values[i]); 1092a542b6e8SBarry Smith } 10932d747510SLisandro Dalcin options->N = 0; 10942d747510SLisandro Dalcin 1095a542b6e8SBarry Smith for (i=0; i<options->Naliases; i++) { 1096a542b6e8SBarry Smith free(options->aliases1[i]); 1097a542b6e8SBarry Smith free(options->aliases2[i]); 1098a542b6e8SBarry Smith } 1099a542b6e8SBarry Smith options->Naliases = 0; 1100a542b6e8SBarry Smith 11012d747510SLisandro Dalcin /* destroy hash table */ 11022d747510SLisandro Dalcin kh_destroy(HO,options->ht); 11032d747510SLisandro Dalcin options->ht = NULL; 11040eb63584SBarry Smith 11052d747510SLisandro Dalcin options->prefixind = 0; 11062d747510SLisandro Dalcin options->prefix[0] = 0; 11072d747510SLisandro Dalcin options->help = PETSC_FALSE; 11084416b707SBarry Smith return 0; 11094416b707SBarry Smith } 11104416b707SBarry Smith 11112d747510SLisandro Dalcin /*@C 11122d747510SLisandro Dalcin PetscOptionsSetAlias - Makes a key and alias for another key 11132d747510SLisandro Dalcin 11141c9f3c13SBarry Smith Logically Collective 11152d747510SLisandro Dalcin 11162d747510SLisandro Dalcin Input Parameters: 11172d747510SLisandro Dalcin + options - options database, or NULL for default global database 11182d747510SLisandro Dalcin . newname - the alias 11192d747510SLisandro Dalcin - oldname - the name that alias will refer to 11202d747510SLisandro Dalcin 11212d747510SLisandro Dalcin Level: advanced 11222d747510SLisandro Dalcin 11239666a313SBarry Smith The collectivity of this routine is complex; only the MPI processes that call this routine will 11241c9f3c13SBarry Smith have the affect of these options. If some processes that create objects call this routine and others do 11251c9f3c13SBarry Smith not the code may fail in complicated ways because the same parallel solvers may incorrectly use different options 11261c9f3c13SBarry Smith on different ranks. 11271c9f3c13SBarry Smith 11282d747510SLisandro Dalcin .seealso: PetscOptionsGetInt(), PetscOptionsGetReal(),OptionsHasName(), 11292d747510SLisandro Dalcin PetscOptionsGetString(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(),PetscOptionsBool(), 11302d747510SLisandro Dalcin PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 11312d747510SLisandro Dalcin PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 11322d747510SLisandro Dalcin PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 11332d747510SLisandro Dalcin PetscOptionsFList(), PetscOptionsEList() 11342d747510SLisandro Dalcin @*/ 11352d747510SLisandro Dalcin PetscErrorCode PetscOptionsSetAlias(PetscOptions options,const char newname[],const char oldname[]) 11362d747510SLisandro Dalcin { 11372d747510SLisandro Dalcin PetscInt n; 11382d747510SLisandro Dalcin size_t len; 11399210b8eaSVaclav Hapla PetscBool valid; 11402d747510SLisandro Dalcin PetscErrorCode ierr; 11412d747510SLisandro Dalcin 11422d747510SLisandro Dalcin PetscFunctionBegin; 11432d747510SLisandro Dalcin PetscValidCharPointer(newname,2); 11442d747510SLisandro Dalcin PetscValidCharPointer(oldname,3); 11452d747510SLisandro Dalcin options = options ? options : defaultoptions; 11469210b8eaSVaclav Hapla ierr = PetscOptionsValidKey(newname,&valid);CHKERRQ(ierr); 11479210b8eaSVaclav Hapla if (!valid) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Invalid aliased option %s",newname); 11489210b8eaSVaclav Hapla ierr = PetscOptionsValidKey(oldname,&valid);CHKERRQ(ierr); 11499210b8eaSVaclav Hapla if (!valid) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Invalid aliasee option %s",oldname); 11502d747510SLisandro Dalcin 11512d747510SLisandro Dalcin n = options->Naliases; 11522d747510SLisandro Dalcin if (n >= MAXALIASES) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_MEM,"You have defined to many PETSc options aliases, limit %d recompile \n src/sys/objects/options.c with larger value for MAXALIASES",MAXALIASES); 11532d747510SLisandro Dalcin 11542d747510SLisandro Dalcin newname++; oldname++; 11552d747510SLisandro Dalcin ierr = PetscStrlen(newname,&len);CHKERRQ(ierr); 11562d747510SLisandro Dalcin options->aliases1[n] = (char*)malloc((len+1)*sizeof(char)); 11572d747510SLisandro Dalcin ierr = PetscStrcpy(options->aliases1[n],newname);CHKERRQ(ierr); 11582d747510SLisandro Dalcin ierr = PetscStrlen(oldname,&len);CHKERRQ(ierr); 11592d747510SLisandro Dalcin options->aliases2[n] = (char*)malloc((len+1)*sizeof(char)); 11602d747510SLisandro Dalcin ierr = PetscStrcpy(options->aliases2[n],oldname);CHKERRQ(ierr); 11612d747510SLisandro Dalcin options->Naliases++; 11622d747510SLisandro Dalcin PetscFunctionReturn(0); 11632d747510SLisandro Dalcin } 11644416b707SBarry Smith 1165e5c89e4eSSatish Balay /*@C 1166e5c89e4eSSatish Balay PetscOptionsSetValue - Sets an option name-value pair in the options 1167e5c89e4eSSatish Balay database, overriding whatever is already present. 1168e5c89e4eSSatish Balay 11691c9f3c13SBarry Smith Logically Collective 1170e5c89e4eSSatish Balay 1171e5c89e4eSSatish Balay Input Parameters: 1172c5929fdfSBarry Smith + options - options database, use NULL for the default global database 1173c5929fdfSBarry Smith . name - name of option, this SHOULD have the - prepended 11742d747510SLisandro Dalcin - value - the option value (not used for all options, so can be NULL) 1175e5c89e4eSSatish Balay 1176e5c89e4eSSatish Balay Level: intermediate 1177e5c89e4eSSatish Balay 1178e5c89e4eSSatish Balay Note: 1179d49172ceSBarry Smith This function can be called BEFORE PetscInitialize() 1180d49172ceSBarry Smith 11819666a313SBarry Smith The collectivity of this routine is complex; only the MPI processes that call this routine will 11821c9f3c13SBarry Smith have the affect of these options. If some processes that create objects call this routine and others do 11831c9f3c13SBarry Smith not the code may fail in complicated ways because the same parallel solvers may incorrectly use different options 11841c9f3c13SBarry Smith on different ranks. 11851c9f3c13SBarry Smith 11862d747510SLisandro Dalcin Developers Note: Uses malloc() directly because PETSc may not be initialized yet. 1187b0250c70SBarry Smith 11882d747510SLisandro Dalcin .seealso: PetscOptionsInsert(), PetscOptionsClearValue() 1189e5c89e4eSSatish Balay @*/ 11902d747510SLisandro Dalcin PetscErrorCode PetscOptionsSetValue(PetscOptions options,const char name[],const char value[]) 1191e5c89e4eSSatish Balay { 1192c5b5d8d5SVaclav Hapla return PetscOptionsSetValue_Private(options,name,value,NULL); 1193c5b5d8d5SVaclav Hapla } 1194c5b5d8d5SVaclav Hapla 1195c5b5d8d5SVaclav Hapla static PetscErrorCode PetscOptionsSetValue_Private(PetscOptions options,const char name[],const char value[],int *pos) 1196c5b5d8d5SVaclav Hapla { 1197e5c89e4eSSatish Balay size_t len; 11982d747510SLisandro Dalcin int N,n,i; 1199e5c89e4eSSatish Balay char **names; 12002d747510SLisandro Dalcin char fullname[MAXOPTNAME] = ""; 1201c5b5d8d5SVaclav Hapla PetscBool flg; 12022d747510SLisandro Dalcin PetscErrorCode ierr; 1203e5c89e4eSSatish Balay 12047272c0d2SVaclav Hapla if (!options) { 12052d747510SLisandro Dalcin ierr = PetscOptionsCreateDefault();if (ierr) return ierr; 12067272c0d2SVaclav Hapla options = defaultoptions; 1207c5929fdfSBarry Smith } 12082d747510SLisandro Dalcin 12092d747510SLisandro Dalcin if (name[0] != '-') return PETSC_ERR_ARG_OUTOFRANGE; 1210e5c89e4eSSatish Balay 1211d06005cbSLisandro Dalcin ierr = PetscOptionsSkipPrecedent(options,name,&flg);if (ierr) return ierr; 1212c5b5d8d5SVaclav Hapla if (flg) return 0; 1213e5c89e4eSSatish Balay 12142d747510SLisandro Dalcin name++; /* skip starting dash */ 12152d747510SLisandro Dalcin 121674e0666dSJed Brown if (options->prefixind > 0) { 1217d49172ceSBarry Smith strncpy(fullname,options->prefix,sizeof(fullname)); 12182d747510SLisandro Dalcin fullname[sizeof(fullname)-1] = 0; 121989ae1891SBarry Smith strncat(fullname,name,sizeof(fullname)-strlen(fullname)-1); 12202d747510SLisandro Dalcin fullname[sizeof(fullname)-1] = 0; 122174e0666dSJed Brown name = fullname; 122274e0666dSJed Brown } 122374e0666dSJed Brown 122474e0666dSJed Brown /* check against aliases */ 1225e5c89e4eSSatish Balay N = options->Naliases; 1226e5c89e4eSSatish Balay for (i=0; i<N; i++) { 12272d747510SLisandro Dalcin int result = PetscOptNameCmp(options->aliases1[i],name); 12282d747510SLisandro Dalcin if (!result) { name = options->aliases2[i]; break; } 1229e5c89e4eSSatish Balay } 1230e5c89e4eSSatish Balay 12312d747510SLisandro Dalcin /* slow search */ 12322d747510SLisandro Dalcin N = n = options->N; 1233e5c89e4eSSatish Balay names = options->names; 1234e5c89e4eSSatish Balay for (i=0; i<N; i++) { 12352d747510SLisandro Dalcin int result = PetscOptNameCmp(names[i],name); 12362d747510SLisandro Dalcin if (!result) { 12372d747510SLisandro Dalcin n = i; goto setvalue; 12382d747510SLisandro Dalcin } else if (result > 0) { 12392d747510SLisandro Dalcin n = i; break; 1240e5c89e4eSSatish Balay } 1241e5c89e4eSSatish Balay } 12422d747510SLisandro Dalcin if (N >= MAXOPTIONS) return PETSC_ERR_MEM; 12432d747510SLisandro Dalcin /* shift remaining values up 1 */ 1244e5c89e4eSSatish Balay for (i=N; i>n; i--) { 12455e8c5e88SLisandro Dalcin options->names[i] = options->names[i-1]; 1246e5c89e4eSSatish Balay options->values[i] = options->values[i-1]; 1247e5c89e4eSSatish Balay options->used[i] = options->used[i-1]; 1248e5c89e4eSSatish Balay } 12492d747510SLisandro Dalcin options->names[n] = NULL; 12502d747510SLisandro Dalcin options->values[n] = NULL; 12512d747510SLisandro Dalcin options->used[n] = PETSC_FALSE; 12522d747510SLisandro Dalcin options->N++; 12532d747510SLisandro Dalcin 12542d747510SLisandro Dalcin /* destroy hash table */ 12552d747510SLisandro Dalcin kh_destroy(HO,options->ht); 12562d747510SLisandro Dalcin options->ht = NULL; 12572d747510SLisandro Dalcin 12582d747510SLisandro Dalcin /* set new name */ 125970d8d27cSBarry Smith len = strlen(name); 12605e8c5e88SLisandro Dalcin options->names[n] = (char*)malloc((len+1)*sizeof(char)); 1261d49172ceSBarry Smith if (!options->names[n]) return PETSC_ERR_MEM; 1262d49172ceSBarry Smith strcpy(options->names[n],name); 12632d747510SLisandro Dalcin 12642d747510SLisandro Dalcin setvalue: 12652d747510SLisandro Dalcin /* set new value */ 12662d747510SLisandro Dalcin if (options->values[n]) free(options->values[n]); 1267d49172ceSBarry Smith len = value ? strlen(value) : 0; 12685e8c5e88SLisandro Dalcin if (len) { 1269e5c89e4eSSatish Balay options->values[n] = (char*)malloc((len+1)*sizeof(char)); 1270d49172ceSBarry Smith if (!options->values[n]) return PETSC_ERR_MEM; 1271d49172ceSBarry Smith strcpy(options->values[n],value); 12722d747510SLisandro Dalcin } else { 12732d747510SLisandro Dalcin options->values[n] = NULL; 12742d747510SLisandro Dalcin } 12752d747510SLisandro Dalcin 127691ad3481SVaclav Hapla /* handle -help so that it can be set from anywhere */ 127791ad3481SVaclav Hapla if (!PetscOptNameCmp(name,"help")) { 127891ad3481SVaclav Hapla options->help = PETSC_TRUE; 1279d06005cbSLisandro Dalcin options->help_intro = (value && !PetscOptNameCmp(value,"intro")) ? PETSC_TRUE : PETSC_FALSE; 128091ad3481SVaclav Hapla options->used[n] = PETSC_TRUE; 128191ad3481SVaclav Hapla } 128291ad3481SVaclav Hapla 1283c5b5d8d5SVaclav Hapla if (PetscErrorHandlingInitialized) { 1284c5b5d8d5SVaclav Hapla ierr = PetscOptionsMonitor(options,name,value);CHKERRQ(ierr); 1285c5b5d8d5SVaclav Hapla } 1286c5b5d8d5SVaclav Hapla if (pos) *pos = n; 1287d49172ceSBarry Smith return 0; 1288e5c89e4eSSatish Balay } 1289e5c89e4eSSatish Balay 1290e5c89e4eSSatish Balay /*@C 1291e5c89e4eSSatish Balay PetscOptionsClearValue - Clears an option name-value pair in the options 1292e5c89e4eSSatish Balay database, overriding whatever is already present. 1293e5c89e4eSSatish Balay 12941c9f3c13SBarry Smith Logically Collective 1295e5c89e4eSSatish Balay 1296e5c89e4eSSatish Balay Input Parameter: 1297c5929fdfSBarry Smith + options - options database, use NULL for the default global database 1298a2b725a8SWilliam Gropp - name - name of option, this SHOULD have the - prepended 1299e5c89e4eSSatish Balay 1300e5c89e4eSSatish Balay Level: intermediate 1301e5c89e4eSSatish Balay 13029666a313SBarry Smith The collectivity of this routine is complex; only the MPI processes that call this routine will 13031c9f3c13SBarry Smith have the affect of these options. If some processes that create objects call this routine and others do 13041c9f3c13SBarry Smith not the code may fail in complicated ways because the same parallel solvers may incorrectly use different options 13051c9f3c13SBarry Smith on different ranks. 13061c9f3c13SBarry Smith 1307e5c89e4eSSatish Balay .seealso: PetscOptionsInsert() 1308e5c89e4eSSatish Balay @*/ 13092d747510SLisandro Dalcin PetscErrorCode PetscOptionsClearValue(PetscOptions options,const char name[]) 1310e5c89e4eSSatish Balay { 13112d747510SLisandro Dalcin int N,n,i; 13122d747510SLisandro Dalcin char **names; 1313e5c89e4eSSatish Balay PetscErrorCode ierr; 1314e5c89e4eSSatish Balay 1315e5c89e4eSSatish Balay PetscFunctionBegin; 1316c5929fdfSBarry Smith options = options ? options : defaultoptions; 13172d747510SLisandro Dalcin if (name[0] != '-') SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Name must begin with '-': Instead %s",name); 1318c9dcd962SLisandro Dalcin if (!PetscOptNameCmp(name,"-help")) options->help = options->help_intro = PETSC_FALSE; 13192d747510SLisandro Dalcin 13202d747510SLisandro Dalcin name++; /* skip starting dash */ 13212d747510SLisandro Dalcin 13222d747510SLisandro Dalcin /* slow search */ 13232d747510SLisandro Dalcin N = n = options->N; 1324e5c89e4eSSatish Balay names = options->names; 1325e5c89e4eSSatish Balay for (i=0; i<N; i++) { 13262d747510SLisandro Dalcin int result = PetscOptNameCmp(names[i],name); 13272d747510SLisandro Dalcin if (!result) { 13282d747510SLisandro Dalcin n = i; break; 13292d747510SLisandro Dalcin } else if (result > 0) { 13302d747510SLisandro Dalcin n = N; break; 1331e5c89e4eSSatish Balay } 13322d747510SLisandro Dalcin } 13332d747510SLisandro Dalcin if (n == N) PetscFunctionReturn(0); /* it was not present */ 1334e5c89e4eSSatish Balay 13352d747510SLisandro Dalcin /* remove name and value */ 13362d747510SLisandro Dalcin if (options->names[n]) free(options->names[n]); 13372d747510SLisandro Dalcin if (options->values[n]) free(options->values[n]); 1338e5c89e4eSSatish Balay /* shift remaining values down 1 */ 1339e5c89e4eSSatish Balay for (i=n; i<N-1; i++) { 13405e8c5e88SLisandro Dalcin options->names[i] = options->names[i+1]; 1341e5c89e4eSSatish Balay options->values[i] = options->values[i+1]; 1342e5c89e4eSSatish Balay options->used[i] = options->used[i+1]; 1343e5c89e4eSSatish Balay } 1344e5c89e4eSSatish Balay options->N--; 13452d747510SLisandro Dalcin 13462d747510SLisandro Dalcin /* destroy hash table */ 13472d747510SLisandro Dalcin kh_destroy(HO,options->ht); 13482d747510SLisandro Dalcin options->ht = NULL; 13492d747510SLisandro Dalcin 13502d747510SLisandro Dalcin ierr = PetscOptionsMonitor(options,name,NULL);CHKERRQ(ierr); 1351e5c89e4eSSatish Balay PetscFunctionReturn(0); 1352e5c89e4eSSatish Balay } 1353e5c89e4eSSatish Balay 1354e5c89e4eSSatish Balay /*@C 13552d747510SLisandro Dalcin PetscOptionsFindPair - Gets an option name-value pair from the options database. 1356e5c89e4eSSatish Balay 13572d747510SLisandro Dalcin Not Collective 1358e5c89e4eSSatish Balay 1359e5c89e4eSSatish Balay Input Parameters: 13602d747510SLisandro Dalcin + options - options database, use NULL for the default global database 13612d747510SLisandro Dalcin . pre - the string to prepend to the name or NULL, this SHOULD NOT have the "-" prepended 13622d747510SLisandro Dalcin - name - name of option, this SHOULD have the "-" prepended 1363e5c89e4eSSatish Balay 13642d747510SLisandro Dalcin Output Parameters: 13652d747510SLisandro Dalcin + value - the option value (optional, not used for all options) 13662d747510SLisandro Dalcin - set - whether the option is set (optional) 1367e5c89e4eSSatish Balay 13689666a313SBarry Smith Notes: 13699666a313SBarry Smith Each process may find different values or no value depending on how options were inserted into the database 13701c9f3c13SBarry Smith 13712d747510SLisandro Dalcin Level: developer 13722d747510SLisandro Dalcin 13732d747510SLisandro Dalcin .seealso: PetscOptionsSetValue(), PetscOptionsClearValue() 1374e5c89e4eSSatish Balay @*/ 13752d747510SLisandro Dalcin PetscErrorCode PetscOptionsFindPair(PetscOptions options,const char pre[],const char name[],const char *value[],PetscBool *set) 1376e5c89e4eSSatish Balay { 13772d747510SLisandro Dalcin char buf[MAXOPTNAME]; 1378daabea38SBarry Smith PetscBool usehashtable = PETSC_TRUE; 13792d747510SLisandro Dalcin PetscBool matchnumbers = PETSC_TRUE; 1380e5c89e4eSSatish Balay PetscErrorCode ierr; 1381e5c89e4eSSatish Balay 1382e5c89e4eSSatish Balay PetscFunctionBegin; 1383c5929fdfSBarry Smith options = options ? options : defaultoptions; 13842d747510SLisandro Dalcin if (pre && PetscUnlikely(pre[0] == '-')) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Prefix cannot begin with '-': Instead %s",pre); 13852d747510SLisandro Dalcin if (PetscUnlikely(name[0] != '-')) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Name must begin with '-': Instead %s",name); 1386e5c89e4eSSatish Balay 13872d747510SLisandro Dalcin name++; /* skip starting dash */ 1388e5c89e4eSSatish Balay 13897cd08cecSJed Brown /* append prefix to name, if prefix="foo_" and option='--bar", prefixed option is --foo_bar */ 13902d747510SLisandro Dalcin if (pre && pre[0]) { 13912d747510SLisandro Dalcin char *ptr = buf; 13922d747510SLisandro Dalcin if (name[0] == '-') { *ptr++ = '-'; name++; } 13932d747510SLisandro Dalcin ierr = PetscStrncpy(ptr,pre,buf+sizeof(buf)-ptr);CHKERRQ(ierr); 13942d747510SLisandro Dalcin ierr = PetscStrlcat(buf,name,sizeof(buf));CHKERRQ(ierr); 13952d747510SLisandro Dalcin name = buf; 13967cd08cecSJed Brown } 13972d747510SLisandro Dalcin 139876bd3646SJed Brown if (PetscDefined(USE_DEBUG)) { 13992f828895SJed Brown PetscBool valid; 14002d747510SLisandro Dalcin char key[MAXOPTNAME+1] = "-"; 14012d747510SLisandro Dalcin ierr = PetscStrncpy(key+1,name,sizeof(key)-1);CHKERRQ(ierr); 14022f828895SJed Brown ierr = PetscOptionsValidKey(key,&valid);CHKERRQ(ierr); 14032f828895SJed Brown if (!valid) SETERRQ3(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Invalid option '%s' obtained from pre='%s' and name='%s'",key,pre?pre:"",name); 14042f828895SJed Brown } 1405e5c89e4eSSatish Balay 14062d747510SLisandro Dalcin if (!options->ht && usehashtable) { 14072d747510SLisandro Dalcin int i,ret; 14082d747510SLisandro Dalcin khiter_t it; 14092d747510SLisandro Dalcin khash_t(HO) *ht; 14102d747510SLisandro Dalcin ht = kh_init(HO); 14112d747510SLisandro Dalcin if (PetscUnlikely(!ht)) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_MEM,"Hash table allocation failed"); 14122d747510SLisandro Dalcin ret = kh_resize(HO,ht,options->N*2); /* twice the required size to reduce risk of collisions */ 14132d747510SLisandro Dalcin if (PetscUnlikely(ret)) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_MEM,"Hash table allocation failed"); 14142d747510SLisandro Dalcin for (i=0; i<options->N; i++) { 14152d747510SLisandro Dalcin it = kh_put(HO,ht,options->names[i],&ret); 14162d747510SLisandro Dalcin if (PetscUnlikely(ret != 1)) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_MEM,"Hash table allocation failed"); 14172d747510SLisandro Dalcin kh_val(ht,it) = i; 14182d747510SLisandro Dalcin } 14192d747510SLisandro Dalcin options->ht = ht; 14202d747510SLisandro Dalcin } 14212d747510SLisandro Dalcin 14222d747510SLisandro Dalcin if (usehashtable) 14232d747510SLisandro Dalcin { /* fast search */ 14242d747510SLisandro Dalcin khash_t(HO) *ht = options->ht; 14252d747510SLisandro Dalcin khiter_t it = kh_get(HO,ht,name); 14262d747510SLisandro Dalcin if (it != kh_end(ht)) { 14272d747510SLisandro Dalcin int i = kh_val(ht,it); 1428e5c89e4eSSatish Balay options->used[i] = PETSC_TRUE; 14292d747510SLisandro Dalcin if (value) *value = options->values[i]; 14302d747510SLisandro Dalcin if (set) *set = PETSC_TRUE; 14312d747510SLisandro Dalcin PetscFunctionReturn(0); 14322d747510SLisandro Dalcin } 14332d747510SLisandro Dalcin } else 14342d747510SLisandro Dalcin { /* slow search */ 14352d747510SLisandro Dalcin int i, N = options->N; 14362d747510SLisandro Dalcin for (i=0; i<N; i++) { 1437daabea38SBarry Smith int result = PetscOptNameCmp(options->names[i],name); 14382d747510SLisandro Dalcin if (!result) { 14392d747510SLisandro Dalcin options->used[i] = PETSC_TRUE; 14402d747510SLisandro Dalcin if (value) *value = options->values[i]; 14412d747510SLisandro Dalcin if (set) *set = PETSC_TRUE; 14422d747510SLisandro Dalcin PetscFunctionReturn(0); 14432d747510SLisandro Dalcin } else if (result > 0) { 1444e5c89e4eSSatish Balay break; 1445e5c89e4eSSatish Balay } 1446e5c89e4eSSatish Balay } 14472d747510SLisandro Dalcin } 14482d747510SLisandro Dalcin 14492d747510SLisandro Dalcin /* 14502d747510SLisandro Dalcin The following block slows down all lookups in the most frequent path (most lookups are unsuccessful). 14512d747510SLisandro Dalcin Maybe this special lookup mode should be enabled on request with a push/pop API. 14522d747510SLisandro Dalcin The feature of matching _%d_ used sparingly in the codebase. 14532d747510SLisandro Dalcin */ 14542d747510SLisandro Dalcin if (matchnumbers) { 14552d747510SLisandro Dalcin int i,j,cnt = 0,locs[16],loce[16]; 1456e5c89e4eSSatish Balay /* determine the location and number of all _%d_ in the key */ 14572d747510SLisandro Dalcin for (i=0; name[i]; i++) { 14582d747510SLisandro Dalcin if (name[i] == '_') { 14592d747510SLisandro Dalcin for (j=i+1; name[j]; j++) { 14602d747510SLisandro Dalcin if (name[j] >= '0' && name[j] <= '9') continue; 14612d747510SLisandro Dalcin if (name[j] == '_' && j > i+1) { /* found a number */ 1462e5c89e4eSSatish Balay locs[cnt] = i+1; 1463e5c89e4eSSatish Balay loce[cnt++] = j+1; 1464e5c89e4eSSatish Balay } 14652d747510SLisandro Dalcin i = j-1; 1466e5c89e4eSSatish Balay break; 1467e5c89e4eSSatish Balay } 1468e5c89e4eSSatish Balay } 1469e5c89e4eSSatish Balay } 1470e5c89e4eSSatish Balay for (i=0; i<cnt; i++) { 14712d747510SLisandro Dalcin PetscBool found; 14722d747510SLisandro Dalcin char opt[MAXOPTNAME+1] = "-", tmp[MAXOPTNAME]; 14732d747510SLisandro Dalcin ierr = PetscStrncpy(tmp,name,PetscMin((size_t)(locs[i]+1),sizeof(tmp)));CHKERRQ(ierr); 14742d747510SLisandro Dalcin ierr = PetscStrlcat(opt,tmp,sizeof(opt));CHKERRQ(ierr); 14752d747510SLisandro Dalcin ierr = PetscStrlcat(opt,name+loce[i],sizeof(opt));CHKERRQ(ierr); 14762d747510SLisandro Dalcin ierr = PetscOptionsFindPair(options,NULL,opt,value,&found);CHKERRQ(ierr); 14772d747510SLisandro Dalcin if (found) {if (set) *set = PETSC_TRUE; PetscFunctionReturn(0);} 1478e5c89e4eSSatish Balay } 1479e5c89e4eSSatish Balay } 14802d747510SLisandro Dalcin 14812d747510SLisandro Dalcin if (set) *set = PETSC_FALSE; 1482e5c89e4eSSatish Balay PetscFunctionReturn(0); 1483e5c89e4eSSatish Balay } 1484e5c89e4eSSatish Balay 1485d6ced9c0SMatthew G. Knepley /* Check whether any option begins with pre+name */ 14862d747510SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscOptionsFindPairPrefix_Private(PetscOptions options,const char pre[], const char name[],const char *value[],PetscBool *set) 1487514bf10dSMatthew G Knepley { 14882d747510SLisandro Dalcin char buf[MAXOPTNAME]; 1489d6ced9c0SMatthew G. Knepley int numCnt = 0, locs[16],loce[16]; 1490514bf10dSMatthew G Knepley PetscErrorCode ierr; 1491514bf10dSMatthew G Knepley 1492514bf10dSMatthew G Knepley PetscFunctionBegin; 1493c5929fdfSBarry Smith options = options ? options : defaultoptions; 14942d747510SLisandro Dalcin if (pre && pre[0] == '-') SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Prefix cannot begin with '-': Instead %s",pre); 14952d747510SLisandro Dalcin if (name[0] != '-') SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Name must begin with '-': Instead %s",name); 1496514bf10dSMatthew G Knepley 14972d747510SLisandro Dalcin name++; /* skip starting dash */ 1498514bf10dSMatthew G Knepley 1499514bf10dSMatthew G Knepley /* append prefix to name, if prefix="foo_" and option='--bar", prefixed option is --foo_bar */ 15002d747510SLisandro Dalcin if (pre && pre[0]) { 15012d747510SLisandro Dalcin char *ptr = buf; 15022d747510SLisandro Dalcin if (name[0] == '-') { *ptr++ = '-'; name++; } 15032d747510SLisandro Dalcin ierr = PetscStrncpy(ptr,pre,sizeof(buf)+(size_t)(ptr-buf));CHKERRQ(ierr); 15042d747510SLisandro Dalcin ierr = PetscStrlcat(buf,name,sizeof(buf));CHKERRQ(ierr); 15052d747510SLisandro Dalcin name = buf; 1506514bf10dSMatthew G Knepley } 15072d747510SLisandro Dalcin 150876bd3646SJed Brown if (PetscDefined(USE_DEBUG)) { 1509514bf10dSMatthew G Knepley PetscBool valid; 15102d747510SLisandro Dalcin char key[MAXOPTNAME+1] = "-"; 15112d747510SLisandro Dalcin ierr = PetscStrncpy(key+1,name,sizeof(key)-1);CHKERRQ(ierr); 1512514bf10dSMatthew G Knepley ierr = PetscOptionsValidKey(key,&valid);CHKERRQ(ierr); 1513514bf10dSMatthew G Knepley if (!valid) SETERRQ3(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Invalid option '%s' obtained from pre='%s' and name='%s'",key,pre?pre:"",name); 1514514bf10dSMatthew G Knepley } 1515514bf10dSMatthew G Knepley 1516d6ced9c0SMatthew G. Knepley /* determine the location and number of all _%d_ in the key */ 1517d6ced9c0SMatthew G. Knepley { 1518d6ced9c0SMatthew G. Knepley int i,j; 1519d6ced9c0SMatthew G. Knepley for (i=0; name[i]; i++) { 1520d6ced9c0SMatthew G. Knepley if (name[i] == '_') { 1521d6ced9c0SMatthew G. Knepley for (j=i+1; name[j]; j++) { 1522d6ced9c0SMatthew G. Knepley if (name[j] >= '0' && name[j] <= '9') continue; 1523d6ced9c0SMatthew G. Knepley if (name[j] == '_' && j > i+1) { /* found a number */ 1524d6ced9c0SMatthew G. Knepley locs[numCnt] = i+1; 1525d6ced9c0SMatthew G. Knepley loce[numCnt++] = j+1; 1526d6ced9c0SMatthew G. Knepley } 1527d6ced9c0SMatthew G. Knepley i = j-1; 1528d6ced9c0SMatthew G. Knepley break; 1529d6ced9c0SMatthew G. Knepley } 1530d6ced9c0SMatthew G. Knepley } 1531d6ced9c0SMatthew G. Knepley } 1532d6ced9c0SMatthew G. Knepley } 1533d6ced9c0SMatthew G. Knepley 15342d747510SLisandro Dalcin { /* slow search */ 1535d6ced9c0SMatthew G. Knepley int c, i; 15362d747510SLisandro Dalcin size_t len; 15372d747510SLisandro Dalcin PetscBool match; 1538d6ced9c0SMatthew G. Knepley 1539d6ced9c0SMatthew G. Knepley for (c = -1; c < numCnt; ++c) { 1540d6ced9c0SMatthew G. Knepley char opt[MAXOPTNAME+1] = "", tmp[MAXOPTNAME]; 1541d6ced9c0SMatthew G. Knepley 1542d6ced9c0SMatthew G. Knepley if (c < 0) { 1543d6ced9c0SMatthew G. Knepley ierr = PetscStrcpy(opt,name);CHKERRQ(ierr); 1544d6ced9c0SMatthew G. Knepley } else { 1545d6ced9c0SMatthew G. Knepley ierr = PetscStrncpy(tmp,name,PetscMin((size_t)(locs[c]+1),sizeof(tmp)));CHKERRQ(ierr); 1546d6ced9c0SMatthew G. Knepley ierr = PetscStrlcat(opt,tmp,sizeof(opt));CHKERRQ(ierr); 1547d6ced9c0SMatthew G. Knepley ierr = PetscStrlcat(opt,name+loce[c],sizeof(opt));CHKERRQ(ierr); 1548d6ced9c0SMatthew G. Knepley } 1549d6ced9c0SMatthew G. Knepley ierr = PetscStrlen(opt,&len);CHKERRQ(ierr); 15502d747510SLisandro Dalcin for (i=0; i<options->N; i++) { 1551d6ced9c0SMatthew G. Knepley ierr = PetscStrncmp(options->names[i],opt,len,&match);CHKERRQ(ierr); 1552514bf10dSMatthew G Knepley if (match) { 1553514bf10dSMatthew G Knepley options->used[i] = PETSC_TRUE; 15542d747510SLisandro Dalcin if (value) *value = options->values[i]; 15552d747510SLisandro Dalcin if (set) *set = PETSC_TRUE; 15562d747510SLisandro Dalcin PetscFunctionReturn(0); 1557514bf10dSMatthew G Knepley } 1558514bf10dSMatthew G Knepley } 15592d747510SLisandro Dalcin } 1560d6ced9c0SMatthew G. Knepley } 15612d747510SLisandro Dalcin 15622d747510SLisandro Dalcin if (set) *set = PETSC_FALSE; 1563514bf10dSMatthew G Knepley PetscFunctionReturn(0); 1564514bf10dSMatthew G Knepley } 1565514bf10dSMatthew G Knepley 1566e5c89e4eSSatish Balay /*@C 1567e5c89e4eSSatish Balay PetscOptionsReject - Generates an error if a certain option is given. 1568e5c89e4eSSatish Balay 15691c9f3c13SBarry Smith Not Collective 1570e5c89e4eSSatish Balay 1571e5c89e4eSSatish Balay Input Parameters: 15725c9cc608SHong Zhang + options - options database, use NULL for default global database 15732d747510SLisandro Dalcin . pre - the option prefix (may be NULL) 15742d747510SLisandro Dalcin . name - the option name one is seeking 15750298fd71SBarry Smith - mess - error message (may be NULL) 1576e5c89e4eSSatish Balay 1577e5c89e4eSSatish Balay Level: advanced 1578e5c89e4eSSatish Balay 1579e5c89e4eSSatish Balay .seealso: PetscOptionsGetInt(), PetscOptionsGetReal(),OptionsHasName(), 1580acfcf0e5SJed Brown PetscOptionsGetString(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool(), 1581e5c89e4eSSatish Balay PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 1582e5c89e4eSSatish Balay PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 1583acfcf0e5SJed Brown PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 1584a264d7a6SBarry Smith PetscOptionsFList(), PetscOptionsEList() 1585e5c89e4eSSatish Balay @*/ 15862d747510SLisandro Dalcin PetscErrorCode PetscOptionsReject(PetscOptions options,const char pre[],const char name[],const char mess[]) 1587e5c89e4eSSatish Balay { 1588e5c89e4eSSatish Balay PetscErrorCode ierr; 1589ace3abfcSBarry Smith PetscBool flag = PETSC_FALSE; 1590e5c89e4eSSatish Balay 1591e5c89e4eSSatish Balay PetscFunctionBegin; 15922d747510SLisandro Dalcin ierr = PetscOptionsHasName(options,pre,name,&flag);CHKERRQ(ierr); 1593e5c89e4eSSatish Balay if (flag) { 15942d747510SLisandro Dalcin if (mess && mess[0]) SETERRQ3(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Program has disabled option: -%s%s with %s",pre?pre:"",name+1,mess); 15952d747510SLisandro Dalcin else SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Program has disabled option: -%s%s",pre?pre:"",name+1); 1596e5c89e4eSSatish Balay } 1597e5c89e4eSSatish Balay PetscFunctionReturn(0); 1598e5c89e4eSSatish Balay } 1599e5c89e4eSSatish Balay 1600e5c89e4eSSatish Balay /*@C 16012d747510SLisandro Dalcin PetscOptionsHasHelp - Determines whether the "-help" option is in the database. 16022d747510SLisandro Dalcin 16032d747510SLisandro Dalcin Not Collective 16042d747510SLisandro Dalcin 16052d747510SLisandro Dalcin Input Parameters: 16062d747510SLisandro Dalcin . options - options database, use NULL for default global database 16072d747510SLisandro Dalcin 16082d747510SLisandro Dalcin Output Parameters: 16092d747510SLisandro Dalcin . set - PETSC_TRUE if found else PETSC_FALSE. 16102d747510SLisandro Dalcin 16112d747510SLisandro Dalcin Level: advanced 16122d747510SLisandro Dalcin 16132d747510SLisandro Dalcin .seealso: PetscOptionsHasName() 16142d747510SLisandro Dalcin @*/ 16152d747510SLisandro Dalcin PetscErrorCode PetscOptionsHasHelp(PetscOptions options,PetscBool *set) 16162d747510SLisandro Dalcin { 16172d747510SLisandro Dalcin PetscFunctionBegin; 16182d747510SLisandro Dalcin PetscValidPointer(set,2); 16192d747510SLisandro Dalcin options = options ? options : defaultoptions; 16202d747510SLisandro Dalcin *set = options->help; 16212d747510SLisandro Dalcin PetscFunctionReturn(0); 16222d747510SLisandro Dalcin } 16232d747510SLisandro Dalcin 1624d314f959SVaclav Hapla PetscErrorCode PetscOptionsHasHelpIntro_Internal(PetscOptions options,PetscBool *set) 1625d314f959SVaclav Hapla { 1626d314f959SVaclav Hapla PetscFunctionBegin; 1627d314f959SVaclav Hapla PetscValidPointer(set,2); 1628d314f959SVaclav Hapla options = options ? options : defaultoptions; 1629d314f959SVaclav Hapla *set = options->help_intro; 1630d314f959SVaclav Hapla PetscFunctionReturn(0); 1631d314f959SVaclav Hapla } 1632d314f959SVaclav Hapla 16332d747510SLisandro Dalcin /*@C 163490d69ab7SBarry Smith PetscOptionsHasName - Determines whether a certain option is given in the database. This returns true whether the option is a number, string or boolean, even 163590d69ab7SBarry Smith its value is set to false. 1636e5c89e4eSSatish Balay 1637e5c89e4eSSatish Balay Not Collective 1638e5c89e4eSSatish Balay 1639e5c89e4eSSatish Balay Input Parameters: 16405c9cc608SHong Zhang + options - options database, use NULL for default global database 16413de71b31SHong Zhang . pre - string to prepend to the name or NULL 16423de71b31SHong Zhang - name - the option one is seeking 1643e5c89e4eSSatish Balay 1644e5c89e4eSSatish Balay Output Parameters: 164596ef3cdfSSatish Balay . set - PETSC_TRUE if found else PETSC_FALSE. 1646e5c89e4eSSatish Balay 1647e5c89e4eSSatish Balay Level: beginner 1648e5c89e4eSSatish Balay 164995452b02SPatrick Sanan Notes: 1650acfcf0e5SJed Brown In many cases you probably want to use PetscOptionsGetBool() instead of calling this, to allowing toggling values. 165190d69ab7SBarry Smith 1652e5c89e4eSSatish Balay .seealso: PetscOptionsGetInt(), PetscOptionsGetReal(), 1653f3e3d7dfSBarry Smith PetscOptionsGetString(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool(), 1654e5c89e4eSSatish Balay PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 1655e5c89e4eSSatish Balay PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 1656acfcf0e5SJed Brown PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 1657a264d7a6SBarry Smith PetscOptionsFList(), PetscOptionsEList() 1658e5c89e4eSSatish Balay @*/ 1659c5929fdfSBarry Smith PetscErrorCode PetscOptionsHasName(PetscOptions options,const char pre[],const char name[],PetscBool *set) 1660e5c89e4eSSatish Balay { 16612d747510SLisandro Dalcin const char *value; 1662e5c89e4eSSatish Balay PetscErrorCode ierr; 1663ace3abfcSBarry Smith PetscBool flag; 1664e5c89e4eSSatish Balay 1665e5c89e4eSSatish Balay PetscFunctionBegin; 16662d747510SLisandro Dalcin ierr = PetscOptionsFindPair(options,pre,name,&value,&flag);CHKERRQ(ierr); 166796ef3cdfSSatish Balay if (set) *set = flag; 1668e5c89e4eSSatish Balay PetscFunctionReturn(0); 1669e5c89e4eSSatish Balay } 1670e5c89e4eSSatish Balay 1671e5c89e4eSSatish Balay /*@C 16722d747510SLisandro Dalcin PetscOptionsGetAll - Lists all the options the program was run with in a single string. 16732d747510SLisandro Dalcin 16742d747510SLisandro Dalcin Not Collective 16752d747510SLisandro Dalcin 1676fd292e60Sprj- Input Parameter: 16772d747510SLisandro Dalcin . options - the options database, use NULL for the default global database 16782d747510SLisandro Dalcin 16792d747510SLisandro Dalcin Output Parameter: 16802d747510SLisandro Dalcin . copts - pointer where string pointer is stored 16812d747510SLisandro Dalcin 16822d747510SLisandro Dalcin Notes: 16831c9f3c13SBarry Smith The array and each entry in the array should be freed with PetscFree() 16841c9f3c13SBarry Smith Each process may have different values depending on how the options were inserted into the database 16852d747510SLisandro Dalcin 16862d747510SLisandro Dalcin Level: advanced 16872d747510SLisandro Dalcin 16881c9f3c13SBarry Smith .seealso: PetscOptionsAllUsed(), PetscOptionsView(), PetscOptionsPush(), PetscOptionsPop() 16892d747510SLisandro Dalcin @*/ 16902d747510SLisandro Dalcin PetscErrorCode PetscOptionsGetAll(PetscOptions options,char *copts[]) 16912d747510SLisandro Dalcin { 16922d747510SLisandro Dalcin PetscErrorCode ierr; 16932d747510SLisandro Dalcin PetscInt i; 16942d747510SLisandro Dalcin size_t len = 1,lent = 0; 16952d747510SLisandro Dalcin char *coptions = NULL; 16962d747510SLisandro Dalcin 16972d747510SLisandro Dalcin PetscFunctionBegin; 16982d747510SLisandro Dalcin PetscValidPointer(copts,2); 16992d747510SLisandro Dalcin options = options ? options : defaultoptions; 17002d747510SLisandro Dalcin /* count the length of the required string */ 17012d747510SLisandro Dalcin for (i=0; i<options->N; i++) { 17022d747510SLisandro Dalcin ierr = PetscStrlen(options->names[i],&lent);CHKERRQ(ierr); 17032d747510SLisandro Dalcin len += 2 + lent; 17042d747510SLisandro Dalcin if (options->values[i]) { 17052d747510SLisandro Dalcin ierr = PetscStrlen(options->values[i],&lent);CHKERRQ(ierr); 17062d747510SLisandro Dalcin len += 1 + lent; 17072d747510SLisandro Dalcin } 17082d747510SLisandro Dalcin } 17092d747510SLisandro Dalcin ierr = PetscMalloc1(len,&coptions);CHKERRQ(ierr); 17102d747510SLisandro Dalcin coptions[0] = 0; 17112d747510SLisandro Dalcin for (i=0; i<options->N; i++) { 17122d747510SLisandro Dalcin ierr = PetscStrcat(coptions,"-");CHKERRQ(ierr); 17132d747510SLisandro Dalcin ierr = PetscStrcat(coptions,options->names[i]);CHKERRQ(ierr); 17142d747510SLisandro Dalcin ierr = PetscStrcat(coptions," ");CHKERRQ(ierr); 17152d747510SLisandro Dalcin if (options->values[i]) { 17162d747510SLisandro Dalcin ierr = PetscStrcat(coptions,options->values[i]);CHKERRQ(ierr); 17172d747510SLisandro Dalcin ierr = PetscStrcat(coptions," ");CHKERRQ(ierr); 17182d747510SLisandro Dalcin } 17192d747510SLisandro Dalcin } 17202d747510SLisandro Dalcin *copts = coptions; 17212d747510SLisandro Dalcin PetscFunctionReturn(0); 17222d747510SLisandro Dalcin } 17232d747510SLisandro Dalcin 17242d747510SLisandro Dalcin /*@C 17252d747510SLisandro Dalcin PetscOptionsUsed - Indicates if PETSc has used a particular option set in the database 17262d747510SLisandro Dalcin 17272d747510SLisandro Dalcin Not Collective 17282d747510SLisandro Dalcin 17292d747510SLisandro Dalcin Input Parameter: 17302d747510SLisandro Dalcin + options - options database, use NULL for default global database 17312d747510SLisandro Dalcin - name - string name of option 17322d747510SLisandro Dalcin 17332d747510SLisandro Dalcin Output Parameter: 17342d747510SLisandro Dalcin . used - PETSC_TRUE if the option was used, otherwise false, including if option was not found in options database 17352d747510SLisandro Dalcin 17362d747510SLisandro Dalcin Level: advanced 17372d747510SLisandro Dalcin 17389666a313SBarry Smith Notes: 17399666a313SBarry Smith The value returned may be different on each process and depends on which options have been processed 17401c9f3c13SBarry Smith on the given process 17411c9f3c13SBarry Smith 17422d747510SLisandro Dalcin .seealso: PetscOptionsView(), PetscOptionsLeft(), PetscOptionsAllUsed() 17432d747510SLisandro Dalcin @*/ 17442d747510SLisandro Dalcin PetscErrorCode PetscOptionsUsed(PetscOptions options,const char *name,PetscBool *used) 17452d747510SLisandro Dalcin { 17462d747510SLisandro Dalcin PetscInt i; 17472d747510SLisandro Dalcin PetscErrorCode ierr; 17482d747510SLisandro Dalcin 17492d747510SLisandro Dalcin PetscFunctionBegin; 17502d747510SLisandro Dalcin PetscValidCharPointer(name,2); 17512d747510SLisandro Dalcin PetscValidPointer(used,3); 17522d747510SLisandro Dalcin options = options ? options : defaultoptions; 17532d747510SLisandro Dalcin *used = PETSC_FALSE; 17542d747510SLisandro Dalcin for (i=0; i<options->N; i++) { 1755ee42b8b3SLisandro Dalcin ierr = PetscStrcasecmp(options->names[i],name,used);CHKERRQ(ierr); 17562d747510SLisandro Dalcin if (*used) { 17572d747510SLisandro Dalcin *used = options->used[i]; 17582d747510SLisandro Dalcin break; 17592d747510SLisandro Dalcin } 17602d747510SLisandro Dalcin } 17612d747510SLisandro Dalcin PetscFunctionReturn(0); 17622d747510SLisandro Dalcin } 17632d747510SLisandro Dalcin 1764487a658cSBarry Smith /*@ 17652d747510SLisandro Dalcin PetscOptionsAllUsed - Returns a count of the number of options in the 17662d747510SLisandro Dalcin database that have never been selected. 17672d747510SLisandro Dalcin 17682d747510SLisandro Dalcin Not Collective 17692d747510SLisandro Dalcin 17702d747510SLisandro Dalcin Input Parameter: 17712d747510SLisandro Dalcin . options - options database, use NULL for default global database 17722d747510SLisandro Dalcin 17732d747510SLisandro Dalcin Output Parameter: 17742d747510SLisandro Dalcin . N - count of options not used 17752d747510SLisandro Dalcin 17762d747510SLisandro Dalcin Level: advanced 17772d747510SLisandro Dalcin 17789666a313SBarry Smith Notes: 17799666a313SBarry Smith The value returned may be different on each process and depends on which options have been processed 17801c9f3c13SBarry Smith on the given process 17811c9f3c13SBarry Smith 17822d747510SLisandro Dalcin .seealso: PetscOptionsView() 17832d747510SLisandro Dalcin @*/ 17842d747510SLisandro Dalcin PetscErrorCode PetscOptionsAllUsed(PetscOptions options,PetscInt *N) 17852d747510SLisandro Dalcin { 17862d747510SLisandro Dalcin PetscInt i,n = 0; 17872d747510SLisandro Dalcin 17882d747510SLisandro Dalcin PetscFunctionBegin; 17892d747510SLisandro Dalcin PetscValidIntPointer(N,2); 17902d747510SLisandro Dalcin options = options ? options : defaultoptions; 17912d747510SLisandro Dalcin for (i=0; i<options->N; i++) { 17922d747510SLisandro Dalcin if (!options->used[i]) n++; 17932d747510SLisandro Dalcin } 17942d747510SLisandro Dalcin *N = n; 17952d747510SLisandro Dalcin PetscFunctionReturn(0); 17962d747510SLisandro Dalcin } 17972d747510SLisandro Dalcin 1798487a658cSBarry Smith /*@ 17992d747510SLisandro Dalcin PetscOptionsLeft - Prints to screen any options that were set and never used. 18002d747510SLisandro Dalcin 18012d747510SLisandro Dalcin Not Collective 18022d747510SLisandro Dalcin 18032d747510SLisandro Dalcin Input Parameter: 18042d747510SLisandro Dalcin . options - options database; use NULL for default global database 18052d747510SLisandro Dalcin 18062d747510SLisandro Dalcin Options Database Key: 18073c6db4c4SPierre Jolivet . -options_left - activates PetscOptionsAllUsed() within PetscFinalize() 18082d747510SLisandro Dalcin 18093de2bfdfSBarry Smith Notes: 18103de2bfdfSBarry Smith This is rarely used directly, it is called by PetscFinalize() in debug more or if -options_left 18111c9f3c13SBarry Smith is passed otherwise to help users determine possible mistakes in their usage of options. This 18121c9f3c13SBarry Smith only prints values on process zero of PETSC_COMM_WORLD. Other processes depending the objects 18131c9f3c13SBarry Smith used may have different options that are left unused. 18143de2bfdfSBarry Smith 18152d747510SLisandro Dalcin Level: advanced 18162d747510SLisandro Dalcin 18172d747510SLisandro Dalcin .seealso: PetscOptionsAllUsed() 18182d747510SLisandro Dalcin @*/ 18192d747510SLisandro Dalcin PetscErrorCode PetscOptionsLeft(PetscOptions options) 18202d747510SLisandro Dalcin { 18212d747510SLisandro Dalcin PetscErrorCode ierr; 18222d747510SLisandro Dalcin PetscInt i; 18233de2bfdfSBarry Smith PetscInt cnt = 0; 18243de2bfdfSBarry Smith PetscOptions toptions; 18252d747510SLisandro Dalcin 18262d747510SLisandro Dalcin PetscFunctionBegin; 18273de2bfdfSBarry Smith toptions = options ? options : defaultoptions; 18283de2bfdfSBarry Smith for (i=0; i<toptions->N; i++) { 18293de2bfdfSBarry Smith if (!toptions->used[i]) { 18303de2bfdfSBarry Smith if (toptions->values[i]) { 18313de2bfdfSBarry Smith ierr = PetscPrintf(PETSC_COMM_WORLD,"Option left: name:-%s value: %s\n",toptions->names[i],toptions->values[i]);CHKERRQ(ierr); 18322d747510SLisandro Dalcin } else { 18333de2bfdfSBarry Smith ierr = PetscPrintf(PETSC_COMM_WORLD,"Option left: name:-%s (no value)\n",toptions->names[i]);CHKERRQ(ierr); 18342d747510SLisandro Dalcin } 18352d747510SLisandro Dalcin } 18362d747510SLisandro Dalcin } 18373de2bfdfSBarry Smith if (!options) { 18383de2bfdfSBarry Smith toptions = defaultoptions; 18393de2bfdfSBarry Smith while (toptions->previous) { 18403de2bfdfSBarry Smith cnt++; 18413de2bfdfSBarry Smith toptions = toptions->previous; 18423de2bfdfSBarry Smith } 18433de2bfdfSBarry Smith if (cnt) { 18443de2bfdfSBarry Smith ierr = PetscPrintf(PETSC_COMM_WORLD,"Option left: You may have forgotten some calls to PetscOptionsPop(),\n PetscOptionsPop() has been called %D less times than PetscOptionsPush()\n",cnt);CHKERRQ(ierr); 18453de2bfdfSBarry Smith } 18463de2bfdfSBarry Smith } 18472d747510SLisandro Dalcin PetscFunctionReturn(0); 18482d747510SLisandro Dalcin } 18492d747510SLisandro Dalcin 18502d747510SLisandro Dalcin /*@C 18512d747510SLisandro Dalcin PetscOptionsLeftGet - Returns all options that were set and never used. 18522d747510SLisandro Dalcin 18532d747510SLisandro Dalcin Not Collective 18542d747510SLisandro Dalcin 18552d747510SLisandro Dalcin Input Parameter: 18562d747510SLisandro Dalcin . options - options database, use NULL for default global database 18572d747510SLisandro Dalcin 18582d747510SLisandro Dalcin Output Parameter: 1859a2b725a8SWilliam Gropp + N - count of options not used 18602d747510SLisandro Dalcin . names - names of options not used 1861a2b725a8SWilliam Gropp - values - values of options not used 18622d747510SLisandro Dalcin 18632d747510SLisandro Dalcin Level: advanced 18642d747510SLisandro Dalcin 18652d747510SLisandro Dalcin Notes: 18662d747510SLisandro Dalcin Users should call PetscOptionsLeftRestore() to free the memory allocated in this routine 18671c9f3c13SBarry Smith Notes: The value returned may be different on each process and depends on which options have been processed 18681c9f3c13SBarry Smith on the given process 18692d747510SLisandro Dalcin 18702d747510SLisandro Dalcin .seealso: PetscOptionsAllUsed(), PetscOptionsLeft() 18712d747510SLisandro Dalcin @*/ 18722d747510SLisandro Dalcin PetscErrorCode PetscOptionsLeftGet(PetscOptions options,PetscInt *N,char **names[],char **values[]) 18732d747510SLisandro Dalcin { 18742d747510SLisandro Dalcin PetscErrorCode ierr; 18752d747510SLisandro Dalcin PetscInt i,n; 18762d747510SLisandro Dalcin 18772d747510SLisandro Dalcin PetscFunctionBegin; 18782d747510SLisandro Dalcin if (N) PetscValidIntPointer(N,2); 18792d747510SLisandro Dalcin if (names) PetscValidPointer(names,3); 18802d747510SLisandro Dalcin if (values) PetscValidPointer(values,4); 18812d747510SLisandro Dalcin options = options ? options : defaultoptions; 18822d747510SLisandro Dalcin 18832d747510SLisandro Dalcin /* The number of unused PETSc options */ 18842d747510SLisandro Dalcin n = 0; 18852d747510SLisandro Dalcin for (i=0; i<options->N; i++) { 18862d747510SLisandro Dalcin if (!options->used[i]) n++; 18872d747510SLisandro Dalcin } 18882d747510SLisandro Dalcin if (N) { *N = n; } 18892d747510SLisandro Dalcin if (names) { ierr = PetscMalloc1(n,names);CHKERRQ(ierr); } 18902d747510SLisandro Dalcin if (values) { ierr = PetscMalloc1(n,values);CHKERRQ(ierr); } 18912d747510SLisandro Dalcin 18922d747510SLisandro Dalcin n = 0; 18932d747510SLisandro Dalcin if (names || values) { 18942d747510SLisandro Dalcin for (i=0; i<options->N; i++) { 18952d747510SLisandro Dalcin if (!options->used[i]) { 18962d747510SLisandro Dalcin if (names) (*names)[n] = options->names[i]; 18972d747510SLisandro Dalcin if (values) (*values)[n] = options->values[i]; 18982d747510SLisandro Dalcin n++; 18992d747510SLisandro Dalcin } 19002d747510SLisandro Dalcin } 19012d747510SLisandro Dalcin } 19022d747510SLisandro Dalcin PetscFunctionReturn(0); 19032d747510SLisandro Dalcin } 19042d747510SLisandro Dalcin 19052d747510SLisandro Dalcin /*@C 19062d747510SLisandro Dalcin PetscOptionsLeftRestore - Free memory for the unused PETSc options obtained using PetscOptionsLeftGet. 19072d747510SLisandro Dalcin 19082d747510SLisandro Dalcin Not Collective 19092d747510SLisandro Dalcin 19102d747510SLisandro Dalcin Input Parameter: 1911a2b725a8SWilliam Gropp + options - options database, use NULL for default global database 19122d747510SLisandro Dalcin . names - names of options not used 1913a2b725a8SWilliam Gropp - values - values of options not used 19142d747510SLisandro Dalcin 19152d747510SLisandro Dalcin Level: advanced 19162d747510SLisandro Dalcin 19172d747510SLisandro Dalcin .seealso: PetscOptionsAllUsed(), PetscOptionsLeft(), PetscOptionsLeftGet() 19182d747510SLisandro Dalcin @*/ 19192d747510SLisandro Dalcin PetscErrorCode PetscOptionsLeftRestore(PetscOptions options,PetscInt *N,char **names[],char **values[]) 19202d747510SLisandro Dalcin { 19212d747510SLisandro Dalcin PetscErrorCode ierr; 19222d747510SLisandro Dalcin 19232d747510SLisandro Dalcin PetscFunctionBegin; 19242d747510SLisandro Dalcin if (N) PetscValidIntPointer(N,2); 19252d747510SLisandro Dalcin if (names) PetscValidPointer(names,3); 19262d747510SLisandro Dalcin if (values) PetscValidPointer(values,4); 19272d747510SLisandro Dalcin if (N) { *N = 0; } 19282d747510SLisandro Dalcin if (names) { ierr = PetscFree(*names);CHKERRQ(ierr); } 19292d747510SLisandro Dalcin if (values) { ierr = PetscFree(*values);CHKERRQ(ierr); } 19302d747510SLisandro Dalcin PetscFunctionReturn(0); 19312d747510SLisandro Dalcin } 19322d747510SLisandro Dalcin 19332d747510SLisandro Dalcin /*@C 19349060e2f9SVaclav Hapla PetscOptionsMonitorDefault - Print all options set value events using the supplied PetscViewer. 19352d747510SLisandro Dalcin 19361c9f3c13SBarry Smith Logically Collective on ctx 19372d747510SLisandro Dalcin 19382d747510SLisandro Dalcin Input Parameters: 19392d747510SLisandro Dalcin + name - option name string 19402d747510SLisandro Dalcin . value - option value string 19419060e2f9SVaclav Hapla - ctx - an ASCII viewer or NULL 19422d747510SLisandro Dalcin 19432d747510SLisandro Dalcin Level: intermediate 19442d747510SLisandro Dalcin 19459666a313SBarry Smith Notes: 19469060e2f9SVaclav Hapla If ctx=NULL, PetscPrintf() is used. 19479666a313SBarry Smith The first MPI rank in the PetscViewer viewer actually prints the values, other 19481c9f3c13SBarry Smith processes may have different values set 19491c9f3c13SBarry Smith 19502d747510SLisandro Dalcin .seealso: PetscOptionsMonitorSet() 19512d747510SLisandro Dalcin @*/ 19522d747510SLisandro Dalcin PetscErrorCode PetscOptionsMonitorDefault(const char name[],const char value[],void *ctx) 19532d747510SLisandro Dalcin { 19542d747510SLisandro Dalcin PetscErrorCode ierr; 19552d747510SLisandro Dalcin 19562d747510SLisandro Dalcin PetscFunctionBegin; 19579060e2f9SVaclav Hapla if (ctx) { 19589060e2f9SVaclav Hapla PetscViewer viewer = (PetscViewer)ctx; 19592d747510SLisandro Dalcin if (!value) { 19602d747510SLisandro Dalcin ierr = PetscViewerASCIIPrintf(viewer,"Removing option: %s\n",name,value);CHKERRQ(ierr); 19612d747510SLisandro Dalcin } else if (!value[0]) { 19622d747510SLisandro Dalcin ierr = PetscViewerASCIIPrintf(viewer,"Setting option: %s (no value)\n",name);CHKERRQ(ierr); 19632d747510SLisandro Dalcin } else { 19642d747510SLisandro Dalcin ierr = PetscViewerASCIIPrintf(viewer,"Setting option: %s = %s\n",name,value);CHKERRQ(ierr); 19652d747510SLisandro Dalcin } 19669060e2f9SVaclav Hapla } else { 19679060e2f9SVaclav Hapla MPI_Comm comm = PETSC_COMM_WORLD; 19689060e2f9SVaclav Hapla if (!value) { 19699060e2f9SVaclav Hapla ierr = PetscPrintf(comm,"Removing option: %s\n",name,value);CHKERRQ(ierr); 19709060e2f9SVaclav Hapla } else if (!value[0]) { 19719060e2f9SVaclav Hapla ierr = PetscPrintf(comm,"Setting option: %s (no value)\n",name);CHKERRQ(ierr); 19729060e2f9SVaclav Hapla } else { 19739060e2f9SVaclav Hapla ierr = PetscPrintf(comm,"Setting option: %s = %s\n",name,value);CHKERRQ(ierr); 19749060e2f9SVaclav Hapla } 19759060e2f9SVaclav Hapla } 19762d747510SLisandro Dalcin PetscFunctionReturn(0); 19772d747510SLisandro Dalcin } 19782d747510SLisandro Dalcin 19792d747510SLisandro Dalcin /*@C 19802d747510SLisandro Dalcin PetscOptionsMonitorSet - Sets an ADDITIONAL function to be called at every method that 19812d747510SLisandro Dalcin modified the PETSc options database. 19822d747510SLisandro Dalcin 19832d747510SLisandro Dalcin Not Collective 19842d747510SLisandro Dalcin 19852d747510SLisandro Dalcin Input Parameters: 19862d747510SLisandro Dalcin + monitor - pointer to function (if this is NULL, it turns off monitoring 19872d747510SLisandro Dalcin . mctx - [optional] context for private data for the 19882d747510SLisandro Dalcin monitor routine (use NULL if no context is desired) 19892d747510SLisandro Dalcin - monitordestroy - [optional] routine that frees monitor context 19902d747510SLisandro Dalcin (may be NULL) 19912d747510SLisandro Dalcin 19922d747510SLisandro Dalcin Calling Sequence of monitor: 19932d747510SLisandro Dalcin $ monitor (const char name[], const char value[], void *mctx) 19942d747510SLisandro Dalcin 19952d747510SLisandro Dalcin + name - option name string 19962d747510SLisandro Dalcin . value - option value string 19972d747510SLisandro Dalcin - mctx - optional monitoring context, as set by PetscOptionsMonitorSet() 19982d747510SLisandro Dalcin 19992d747510SLisandro Dalcin Options Database Keys: 2000c5b5d8d5SVaclav Hapla See PetscInitialize() for options related to option database monitoring. 20012d747510SLisandro Dalcin 20022d747510SLisandro Dalcin Notes: 20032d747510SLisandro Dalcin The default is to do nothing. To print the name and value of options 20042d747510SLisandro Dalcin being inserted into the database, use PetscOptionsMonitorDefault() as the monitoring routine, 20052d747510SLisandro Dalcin with a null monitoring context. 20062d747510SLisandro Dalcin 20072d747510SLisandro Dalcin Several different monitoring routines may be set by calling 20082d747510SLisandro Dalcin PetscOptionsMonitorSet() multiple times; all will be called in the 20092d747510SLisandro Dalcin order in which they were set. 20102d747510SLisandro Dalcin 20119060e2f9SVaclav Hapla Level: intermediate 20122d747510SLisandro Dalcin 2013c5b5d8d5SVaclav Hapla .seealso: PetscOptionsMonitorDefault(), PetscInitialize() 20142d747510SLisandro Dalcin @*/ 20152d747510SLisandro Dalcin PetscErrorCode PetscOptionsMonitorSet(PetscErrorCode (*monitor)(const char name[], const char value[], void*),void *mctx,PetscErrorCode (*monitordestroy)(void**)) 20162d747510SLisandro Dalcin { 20172d747510SLisandro Dalcin PetscOptions options = defaultoptions; 20182d747510SLisandro Dalcin 20192d747510SLisandro Dalcin PetscFunctionBegin; 2020c5b5d8d5SVaclav Hapla if (options->monitorCancel) PetscFunctionReturn(0); 20212d747510SLisandro Dalcin if (options->numbermonitors >= MAXOPTIONSMONITORS) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Too many PetscOptions monitors set"); 20222d747510SLisandro Dalcin options->monitor[options->numbermonitors] = monitor; 20232d747510SLisandro Dalcin options->monitordestroy[options->numbermonitors] = monitordestroy; 20242d747510SLisandro Dalcin options->monitorcontext[options->numbermonitors++] = (void*)mctx; 20252d747510SLisandro Dalcin PetscFunctionReturn(0); 20262d747510SLisandro Dalcin } 20272d747510SLisandro Dalcin 20282d747510SLisandro Dalcin /* 20292d747510SLisandro Dalcin PetscOptionsStringToBool - Converts string to PetscBool, handles cases like "yes", "no", "true", "false", "0", "1", "off", "on". 203063fe8743SVaclav Hapla Empty string is considered as true. 20312d747510SLisandro Dalcin */ 20322d747510SLisandro Dalcin PetscErrorCode PetscOptionsStringToBool(const char value[],PetscBool *a) 20332d747510SLisandro Dalcin { 20342d747510SLisandro Dalcin PetscBool istrue,isfalse; 20352d747510SLisandro Dalcin size_t len; 20362d747510SLisandro Dalcin PetscErrorCode ierr; 20372d747510SLisandro Dalcin 20382d747510SLisandro Dalcin PetscFunctionBegin; 203963fe8743SVaclav Hapla /* PetscStrlen() returns 0 for NULL or "" */ 20402d747510SLisandro Dalcin ierr = PetscStrlen(value,&len);CHKERRQ(ierr); 204163fe8743SVaclav Hapla if (!len) {*a = PETSC_TRUE; PetscFunctionReturn(0);} 20422d747510SLisandro Dalcin ierr = PetscStrcasecmp(value,"TRUE",&istrue);CHKERRQ(ierr); 20432d747510SLisandro Dalcin if (istrue) {*a = PETSC_TRUE; PetscFunctionReturn(0);} 20442d747510SLisandro Dalcin ierr = PetscStrcasecmp(value,"YES",&istrue);CHKERRQ(ierr); 20452d747510SLisandro Dalcin if (istrue) {*a = PETSC_TRUE; PetscFunctionReturn(0);} 20462d747510SLisandro Dalcin ierr = PetscStrcasecmp(value,"1",&istrue);CHKERRQ(ierr); 20472d747510SLisandro Dalcin if (istrue) {*a = PETSC_TRUE; PetscFunctionReturn(0);} 20482d747510SLisandro Dalcin ierr = PetscStrcasecmp(value,"on",&istrue);CHKERRQ(ierr); 20492d747510SLisandro Dalcin if (istrue) {*a = PETSC_TRUE; PetscFunctionReturn(0);} 20502d747510SLisandro Dalcin ierr = PetscStrcasecmp(value,"FALSE",&isfalse);CHKERRQ(ierr); 20512d747510SLisandro Dalcin if (isfalse) {*a = PETSC_FALSE; PetscFunctionReturn(0);} 20522d747510SLisandro Dalcin ierr = PetscStrcasecmp(value,"NO",&isfalse);CHKERRQ(ierr); 20532d747510SLisandro Dalcin if (isfalse) {*a = PETSC_FALSE; PetscFunctionReturn(0);} 20542d747510SLisandro Dalcin ierr = PetscStrcasecmp(value,"0",&isfalse);CHKERRQ(ierr); 20552d747510SLisandro Dalcin if (isfalse) {*a = PETSC_FALSE; PetscFunctionReturn(0);} 20562d747510SLisandro Dalcin ierr = PetscStrcasecmp(value,"off",&isfalse);CHKERRQ(ierr); 20572d747510SLisandro Dalcin if (isfalse) {*a = PETSC_FALSE; PetscFunctionReturn(0);} 20582d747510SLisandro Dalcin SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Unknown logical value: %s",value); 20592d747510SLisandro Dalcin } 20602d747510SLisandro Dalcin 20612d747510SLisandro Dalcin /* 20622d747510SLisandro Dalcin PetscOptionsStringToInt - Converts a string to an integer value. Handles special cases such as "default" and "decide" 20632d747510SLisandro Dalcin */ 20642d747510SLisandro Dalcin PetscErrorCode PetscOptionsStringToInt(const char name[],PetscInt *a) 20652d747510SLisandro Dalcin { 20662d747510SLisandro Dalcin PetscErrorCode ierr; 20672d747510SLisandro Dalcin size_t len; 20682d747510SLisandro Dalcin PetscBool decide,tdefault,mouse; 20692d747510SLisandro Dalcin 20702d747510SLisandro Dalcin PetscFunctionBegin; 20712d747510SLisandro Dalcin ierr = PetscStrlen(name,&len);CHKERRQ(ierr); 20722d747510SLisandro Dalcin if (!len) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"character string of length zero has no numerical value"); 20732d747510SLisandro Dalcin 20742d747510SLisandro Dalcin ierr = PetscStrcasecmp(name,"PETSC_DEFAULT",&tdefault);CHKERRQ(ierr); 20752d747510SLisandro Dalcin if (!tdefault) { 20762d747510SLisandro Dalcin ierr = PetscStrcasecmp(name,"DEFAULT",&tdefault);CHKERRQ(ierr); 20772d747510SLisandro Dalcin } 20782d747510SLisandro Dalcin ierr = PetscStrcasecmp(name,"PETSC_DECIDE",&decide);CHKERRQ(ierr); 20792d747510SLisandro Dalcin if (!decide) { 20802d747510SLisandro Dalcin ierr = PetscStrcasecmp(name,"DECIDE",&decide);CHKERRQ(ierr); 20812d747510SLisandro Dalcin } 20822d747510SLisandro Dalcin ierr = PetscStrcasecmp(name,"mouse",&mouse);CHKERRQ(ierr); 20832d747510SLisandro Dalcin 20842d747510SLisandro Dalcin if (tdefault) *a = PETSC_DEFAULT; 20852d747510SLisandro Dalcin else if (decide) *a = PETSC_DECIDE; 20862d747510SLisandro Dalcin else if (mouse) *a = -1; 20872d747510SLisandro Dalcin else { 20882d747510SLisandro Dalcin char *endptr; 20892d747510SLisandro Dalcin long strtolval; 20902d747510SLisandro Dalcin 20912d747510SLisandro Dalcin strtolval = strtol(name,&endptr,10); 20922d747510SLisandro Dalcin if ((size_t) (endptr - name) != len) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Input string %s has no integer value (do not include . in it)",name); 20932d747510SLisandro Dalcin 20942d747510SLisandro Dalcin #if defined(PETSC_USE_64BIT_INDICES) && defined(PETSC_HAVE_ATOLL) 20952d747510SLisandro Dalcin (void) strtolval; 20962d747510SLisandro Dalcin *a = atoll(name); 20972d747510SLisandro Dalcin #elif defined(PETSC_USE_64BIT_INDICES) && defined(PETSC_HAVE___INT64) 20982d747510SLisandro Dalcin (void) strtolval; 20992d747510SLisandro Dalcin *a = _atoi64(name); 21002d747510SLisandro Dalcin #else 21012d747510SLisandro Dalcin *a = (PetscInt)strtolval; 21022d747510SLisandro Dalcin #endif 21032d747510SLisandro Dalcin } 21042d747510SLisandro Dalcin PetscFunctionReturn(0); 21052d747510SLisandro Dalcin } 21062d747510SLisandro Dalcin 21072d747510SLisandro Dalcin #if defined(PETSC_USE_REAL___FLOAT128) 21082d747510SLisandro Dalcin #include <quadmath.h> 21092d747510SLisandro Dalcin #endif 21102d747510SLisandro Dalcin 21112d747510SLisandro Dalcin static PetscErrorCode PetscStrtod(const char name[],PetscReal *a,char **endptr) 21122d747510SLisandro Dalcin { 21132d747510SLisandro Dalcin PetscFunctionBegin; 21142d747510SLisandro Dalcin #if defined(PETSC_USE_REAL___FLOAT128) 21152d747510SLisandro Dalcin *a = strtoflt128(name,endptr); 21162d747510SLisandro Dalcin #else 21172d747510SLisandro Dalcin *a = (PetscReal)strtod(name,endptr); 21182d747510SLisandro Dalcin #endif 21192d747510SLisandro Dalcin PetscFunctionReturn(0); 21202d747510SLisandro Dalcin } 21212d747510SLisandro Dalcin 21222d747510SLisandro Dalcin static PetscErrorCode PetscStrtoz(const char name[],PetscScalar *a,char **endptr,PetscBool *isImaginary) 21232d747510SLisandro Dalcin { 21242d747510SLisandro Dalcin PetscBool hasi = PETSC_FALSE; 21252d747510SLisandro Dalcin char *ptr; 21262d747510SLisandro Dalcin PetscReal strtoval; 21272d747510SLisandro Dalcin PetscErrorCode ierr; 21282d747510SLisandro Dalcin 21292d747510SLisandro Dalcin PetscFunctionBegin; 21302d747510SLisandro Dalcin ierr = PetscStrtod(name,&strtoval,&ptr);CHKERRQ(ierr); 21312d747510SLisandro Dalcin if (ptr == name) { 21322d747510SLisandro Dalcin strtoval = 1.; 21332d747510SLisandro Dalcin hasi = PETSC_TRUE; 21342d747510SLisandro Dalcin if (name[0] == 'i') { 21352d747510SLisandro Dalcin ptr++; 21362d747510SLisandro Dalcin } else if (name[0] == '+' && name[1] == 'i') { 21372d747510SLisandro Dalcin ptr += 2; 21382d747510SLisandro Dalcin } else if (name[0] == '-' && name[1] == 'i') { 21392d747510SLisandro Dalcin strtoval = -1.; 21402d747510SLisandro Dalcin ptr += 2; 21412d747510SLisandro Dalcin } 21422d747510SLisandro Dalcin } else if (*ptr == 'i') { 21432d747510SLisandro Dalcin hasi = PETSC_TRUE; 21442d747510SLisandro Dalcin ptr++; 21452d747510SLisandro Dalcin } 21462d747510SLisandro Dalcin *endptr = ptr; 21472d747510SLisandro Dalcin *isImaginary = hasi; 21482d747510SLisandro Dalcin if (hasi) { 21492d747510SLisandro Dalcin #if !defined(PETSC_USE_COMPLEX) 21502d747510SLisandro Dalcin SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Input string %s contains imaginary but complex not supported ",name); 21512d747510SLisandro Dalcin #else 21522d747510SLisandro Dalcin *a = PetscCMPLX(0.,strtoval); 21532d747510SLisandro Dalcin #endif 21542d747510SLisandro Dalcin } else { 21552d747510SLisandro Dalcin *a = strtoval; 21562d747510SLisandro Dalcin } 21572d747510SLisandro Dalcin PetscFunctionReturn(0); 21582d747510SLisandro Dalcin } 21592d747510SLisandro Dalcin 21602d747510SLisandro Dalcin /* 21612d747510SLisandro Dalcin Converts a string to PetscReal value. Handles special cases like "default" and "decide" 21622d747510SLisandro Dalcin */ 21632d747510SLisandro Dalcin PetscErrorCode PetscOptionsStringToReal(const char name[],PetscReal *a) 21642d747510SLisandro Dalcin { 21652d747510SLisandro Dalcin size_t len; 21662d747510SLisandro Dalcin PetscBool match; 21672d747510SLisandro Dalcin char *endptr; 21682d747510SLisandro Dalcin PetscErrorCode ierr; 21692d747510SLisandro Dalcin 21702d747510SLisandro Dalcin PetscFunctionBegin; 21712d747510SLisandro Dalcin ierr = PetscStrlen(name,&len);CHKERRQ(ierr); 21722d747510SLisandro Dalcin if (!len) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"String of length zero has no numerical value"); 21732d747510SLisandro Dalcin 21742d747510SLisandro Dalcin ierr = PetscStrcasecmp(name,"PETSC_DEFAULT",&match);CHKERRQ(ierr); 21752d747510SLisandro Dalcin if (!match) { 21762d747510SLisandro Dalcin ierr = PetscStrcasecmp(name,"DEFAULT",&match);CHKERRQ(ierr); 21772d747510SLisandro Dalcin } 21782d747510SLisandro Dalcin if (match) {*a = PETSC_DEFAULT; PetscFunctionReturn(0);} 21792d747510SLisandro Dalcin 21802d747510SLisandro Dalcin ierr = PetscStrcasecmp(name,"PETSC_DECIDE",&match);CHKERRQ(ierr); 21812d747510SLisandro Dalcin if (!match) { 21822d747510SLisandro Dalcin ierr = PetscStrcasecmp(name,"DECIDE",&match);CHKERRQ(ierr); 21832d747510SLisandro Dalcin } 21842d747510SLisandro Dalcin if (match) {*a = PETSC_DECIDE; PetscFunctionReturn(0);} 21852d747510SLisandro Dalcin 21862d747510SLisandro Dalcin ierr = PetscStrtod(name,a,&endptr);CHKERRQ(ierr); 21872d747510SLisandro Dalcin if ((size_t) (endptr - name) != len) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Input string %s has no numeric value",name); 21882d747510SLisandro Dalcin PetscFunctionReturn(0); 21892d747510SLisandro Dalcin } 21902d747510SLisandro Dalcin 21912d747510SLisandro Dalcin PetscErrorCode PetscOptionsStringToScalar(const char name[],PetscScalar *a) 21922d747510SLisandro Dalcin { 21932d747510SLisandro Dalcin PetscBool imag1; 21942d747510SLisandro Dalcin size_t len; 21952d747510SLisandro Dalcin PetscScalar val = 0.; 21962d747510SLisandro Dalcin char *ptr = NULL; 21972d747510SLisandro Dalcin PetscErrorCode ierr; 21982d747510SLisandro Dalcin 21992d747510SLisandro Dalcin PetscFunctionBegin; 22002d747510SLisandro Dalcin ierr = PetscStrlen(name,&len);CHKERRQ(ierr); 22012d747510SLisandro Dalcin if (!len) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"character string of length zero has no numerical value"); 22022d747510SLisandro Dalcin ierr = PetscStrtoz(name,&val,&ptr,&imag1);CHKERRQ(ierr); 22032d747510SLisandro Dalcin #if defined(PETSC_USE_COMPLEX) 22042d747510SLisandro Dalcin if ((size_t) (ptr - name) < len) { 22052d747510SLisandro Dalcin PetscBool imag2; 22062d747510SLisandro Dalcin PetscScalar val2; 22072d747510SLisandro Dalcin 22082d747510SLisandro Dalcin ierr = PetscStrtoz(ptr,&val2,&ptr,&imag2);CHKERRQ(ierr); 22092d747510SLisandro Dalcin if (imag1 || !imag2) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Input string %s: must specify imaginary component second",name); 22102d747510SLisandro Dalcin val = PetscCMPLX(PetscRealPart(val),PetscImaginaryPart(val2)); 22112d747510SLisandro Dalcin } 22122d747510SLisandro Dalcin #endif 22132d747510SLisandro Dalcin if ((size_t) (ptr - name) != len) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Input string %s has no numeric value ",name); 22142d747510SLisandro Dalcin *a = val; 22152d747510SLisandro Dalcin PetscFunctionReturn(0); 22162d747510SLisandro Dalcin } 22172d747510SLisandro Dalcin 22182d747510SLisandro Dalcin /*@C 22192d747510SLisandro Dalcin PetscOptionsGetBool - Gets the Logical (true or false) value for a particular 22202d747510SLisandro Dalcin option in the database. 2221e5c89e4eSSatish Balay 2222e5c89e4eSSatish Balay Not Collective 2223e5c89e4eSSatish Balay 2224e5c89e4eSSatish Balay Input Parameters: 22255c9cc608SHong Zhang + options - options database, use NULL for default global database 2226c5929fdfSBarry Smith . pre - the string to prepend to the name or NULL 2227e5c89e4eSSatish Balay - name - the option one is seeking 2228e5c89e4eSSatish Balay 2229e5c89e4eSSatish Balay Output Parameter: 22302d747510SLisandro Dalcin + ivalue - the logical value to return 223196ef3cdfSSatish Balay - set - PETSC_TRUE if found, else PETSC_FALSE 2232e5c89e4eSSatish Balay 2233e5c89e4eSSatish Balay Level: beginner 2234e5c89e4eSSatish Balay 223595452b02SPatrick Sanan Notes: 22362d747510SLisandro Dalcin TRUE, true, YES, yes, nostring, and 1 all translate to PETSC_TRUE 22372d747510SLisandro Dalcin FALSE, false, NO, no, and 0 all translate to PETSC_FALSE 22382d747510SLisandro Dalcin 22392d747510SLisandro 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 22402d747510SLisandro Dalcin is equivalent to -requested_bool true 22412d747510SLisandro Dalcin 22422d747510SLisandro Dalcin If the user does not supply the option at all ivalue is NOT changed. Thus 22432efd9cb1SBarry Smith you should ALWAYS initialize the ivalue if you access it without first checking if the set flag is true. 22442efd9cb1SBarry Smith 2245e5c89e4eSSatish Balay .seealso: PetscOptionsGetReal(), PetscOptionsHasName(), PetscOptionsGetString(), 22462d747510SLisandro Dalcin PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsGetInt(), PetscOptionsBool(), 2247e5c89e4eSSatish Balay PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 2248e5c89e4eSSatish Balay PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 2249acfcf0e5SJed Brown PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 2250a264d7a6SBarry Smith PetscOptionsFList(), PetscOptionsEList() 2251e5c89e4eSSatish Balay @*/ 22522d747510SLisandro Dalcin PetscErrorCode PetscOptionsGetBool(PetscOptions options,const char pre[],const char name[],PetscBool *ivalue,PetscBool *set) 2253e5c89e4eSSatish Balay { 22542d747510SLisandro Dalcin const char *value; 2255ace3abfcSBarry Smith PetscBool flag; 22562d747510SLisandro Dalcin PetscErrorCode ierr; 2257e5c89e4eSSatish Balay 2258e5c89e4eSSatish Balay PetscFunctionBegin; 22592d747510SLisandro Dalcin PetscValidCharPointer(name,3); 22602d747510SLisandro Dalcin if (ivalue) PetscValidIntPointer(ivalue,4); 22612d747510SLisandro Dalcin ierr = PetscOptionsFindPair(options,pre,name,&value,&flag);CHKERRQ(ierr); 2262e5c89e4eSSatish Balay if (flag) { 226396ef3cdfSSatish Balay if (set) *set = PETSC_TRUE; 22642d747510SLisandro Dalcin ierr = PetscOptionsStringToBool(value, &flag);CHKERRQ(ierr); 22652d747510SLisandro Dalcin if (ivalue) *ivalue = flag; 2266e5c89e4eSSatish Balay } else { 226796ef3cdfSSatish Balay if (set) *set = PETSC_FALSE; 2268e5c89e4eSSatish Balay } 2269e5c89e4eSSatish Balay PetscFunctionReturn(0); 2270e5c89e4eSSatish Balay } 2271e5c89e4eSSatish Balay 2272e5c89e4eSSatish Balay /*@C 2273e5c89e4eSSatish Balay PetscOptionsGetEList - Puts a list of option values that a single one may be selected from 2274e5c89e4eSSatish Balay 2275e5c89e4eSSatish Balay Not Collective 2276e5c89e4eSSatish Balay 2277e5c89e4eSSatish Balay Input Parameters: 22785c9cc608SHong Zhang + options - options database, use NULL for default global database 2279c5929fdfSBarry Smith . pre - the string to prepend to the name or NULL 2280e5c89e4eSSatish Balay . opt - option name 2281a264d7a6SBarry Smith . list - the possible choices (one of these must be selected, anything else is invalid) 2282a2b725a8SWilliam Gropp - ntext - number of choices 2283e5c89e4eSSatish Balay 2284e5c89e4eSSatish Balay Output Parameter: 22852efd9cb1SBarry Smith + value - the index of the value to return (defaults to zero if the option name is given but no choice is listed) 2286e5c89e4eSSatish Balay - set - PETSC_TRUE if found, else PETSC_FALSE 2287e5c89e4eSSatish Balay 2288e5c89e4eSSatish Balay Level: intermediate 2289e5c89e4eSSatish Balay 229095452b02SPatrick Sanan Notes: 229195452b02SPatrick Sanan If the user does not supply the option value is NOT changed. Thus 22922efd9cb1SBarry Smith you should ALWAYS initialize the ivalue if you access it without first checking if the set flag is true. 22932efd9cb1SBarry Smith 2294a264d7a6SBarry Smith See PetscOptionsFList() for when the choices are given in a PetscFunctionList() 2295e5c89e4eSSatish Balay 2296e5c89e4eSSatish Balay .seealso: PetscOptionsGetInt(), PetscOptionsGetReal(), 2297acfcf0e5SJed Brown PetscOptionsHasName(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool(), 2298e5c89e4eSSatish Balay PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 2299e5c89e4eSSatish Balay PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 2300acfcf0e5SJed Brown PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 2301a264d7a6SBarry Smith PetscOptionsFList(), PetscOptionsEList() 2302e5c89e4eSSatish Balay @*/ 2303c5929fdfSBarry Smith PetscErrorCode PetscOptionsGetEList(PetscOptions options,const char pre[],const char opt[],const char * const *list,PetscInt ntext,PetscInt *value,PetscBool *set) 2304e5c89e4eSSatish Balay { 2305e5c89e4eSSatish Balay PetscErrorCode ierr; 230658b0ac4eSStefano Zampini size_t alen,len = 0, tlen = 0; 2307e5c89e4eSSatish Balay char *svalue; 2308ace3abfcSBarry Smith PetscBool aset,flg = PETSC_FALSE; 2309e5c89e4eSSatish Balay PetscInt i; 2310e5c89e4eSSatish Balay 2311e5c89e4eSSatish Balay PetscFunctionBegin; 23122d747510SLisandro Dalcin PetscValidCharPointer(opt,3); 2313e5c89e4eSSatish Balay for (i=0; i<ntext; i++) { 2314e5c89e4eSSatish Balay ierr = PetscStrlen(list[i],&alen);CHKERRQ(ierr); 2315e5c89e4eSSatish Balay if (alen > len) len = alen; 231658b0ac4eSStefano Zampini tlen += len + 1; 2317e5c89e4eSSatish Balay } 2318e5c89e4eSSatish Balay len += 5; /* a little extra space for user mistypes */ 2319785e854fSJed Brown ierr = PetscMalloc1(len,&svalue);CHKERRQ(ierr); 2320c5929fdfSBarry Smith ierr = PetscOptionsGetString(options,pre,opt,svalue,len,&aset);CHKERRQ(ierr); 2321e5c89e4eSSatish Balay if (aset) { 2322fbedd5e0SJed Brown ierr = PetscEListFind(ntext,list,svalue,value,&flg);CHKERRQ(ierr); 232358b0ac4eSStefano Zampini if (!flg) { 232458b0ac4eSStefano Zampini char *avail,*pavl; 232558b0ac4eSStefano Zampini 232658b0ac4eSStefano Zampini ierr = PetscMalloc1(tlen,&avail);CHKERRQ(ierr); 232758b0ac4eSStefano Zampini pavl = avail; 232858b0ac4eSStefano Zampini for (i=0; i<ntext; i++) { 232958b0ac4eSStefano Zampini ierr = PetscStrlen(list[i],&alen);CHKERRQ(ierr); 233058b0ac4eSStefano Zampini ierr = PetscStrcpy(pavl,list[i]);CHKERRQ(ierr); 233158b0ac4eSStefano Zampini pavl += alen; 233258b0ac4eSStefano Zampini ierr = PetscStrcpy(pavl," ");CHKERRQ(ierr); 233358b0ac4eSStefano Zampini pavl += 1; 233458b0ac4eSStefano Zampini } 233558b0ac4eSStefano Zampini ierr = PetscStrtolower(avail);CHKERRQ(ierr); 233658b0ac4eSStefano Zampini SETERRQ4(PETSC_COMM_SELF,PETSC_ERR_USER,"Unknown option %s for -%s%s. Available options: %s",svalue,pre ? pre : "",opt+1,avail); 233758b0ac4eSStefano Zampini } 2338fbedd5e0SJed Brown if (set) *set = PETSC_TRUE; 2339a297a907SKarl Rupp } else if (set) *set = PETSC_FALSE; 2340e5c89e4eSSatish Balay ierr = PetscFree(svalue);CHKERRQ(ierr); 2341e5c89e4eSSatish Balay PetscFunctionReturn(0); 2342e5c89e4eSSatish Balay } 2343e5c89e4eSSatish Balay 2344e5c89e4eSSatish Balay /*@C 2345e5c89e4eSSatish Balay PetscOptionsGetEnum - Gets the enum value for a particular option in the database. 2346e5c89e4eSSatish Balay 2347e5c89e4eSSatish Balay Not Collective 2348e5c89e4eSSatish Balay 2349e5c89e4eSSatish Balay Input Parameters: 23505c9cc608SHong Zhang + options - options database, use NULL for default global database 2351c5929fdfSBarry Smith . pre - option prefix or NULL 2352e5c89e4eSSatish Balay . opt - option name 2353e5c89e4eSSatish Balay . list - array containing the list of choices, followed by the enum name, followed by the enum prefix, followed by a null 2354e5c89e4eSSatish Balay - defaultv - the default (current) value 2355e5c89e4eSSatish Balay 2356e5c89e4eSSatish Balay Output Parameter: 2357e5c89e4eSSatish Balay + value - the value to return 235896ef3cdfSSatish Balay - set - PETSC_TRUE if found, else PETSC_FALSE 2359e5c89e4eSSatish Balay 2360e5c89e4eSSatish Balay Level: beginner 2361e5c89e4eSSatish Balay 236295452b02SPatrick Sanan Notes: 236395452b02SPatrick Sanan If the user does not supply the option value is NOT changed. Thus 23642efd9cb1SBarry Smith you should ALWAYS initialize the ivalue if you access it without first checking if the set flag is true. 2365e5c89e4eSSatish Balay 23662efd9cb1SBarry Smith List is usually something like PCASMTypes or some other predefined list of enum names 2367e5c89e4eSSatish Balay 2368e5c89e4eSSatish Balay .seealso: PetscOptionsGetReal(), PetscOptionsHasName(), PetscOptionsGetString(), PetscOptionsGetInt(), 2369acfcf0e5SJed Brown PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool() 2370acfcf0e5SJed Brown PetscOptionsInt(), PetscOptionsString(), PetscOptionsReal(), PetscOptionsBool(), 2371e5c89e4eSSatish Balay PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 2372e5c89e4eSSatish Balay PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 2373acfcf0e5SJed Brown PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 2374a264d7a6SBarry Smith PetscOptionsFList(), PetscOptionsEList(), PetscOptionsGetEList(), PetscOptionsEnum() 2375e5c89e4eSSatish Balay @*/ 2376c5929fdfSBarry Smith PetscErrorCode PetscOptionsGetEnum(PetscOptions options,const char pre[],const char opt[],const char * const *list,PetscEnum *value,PetscBool *set) 2377e5c89e4eSSatish Balay { 2378e5c89e4eSSatish Balay PetscErrorCode ierr; 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++]) { 2385e32f2f54SBarry Smith if (ntext > 50) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"List argument appears to be wrong or have more than 50 entries"); 2386e5c89e4eSSatish Balay } 2387e32f2f54SBarry Smith if (ntext < 3) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"List argument must have at least two entries: typename and type prefix"); 2388e5c89e4eSSatish Balay ntext -= 3; 2389c5929fdfSBarry Smith ierr = PetscOptionsGetEList(options,pre,opt,list,ntext,&tval,&fset);CHKERRQ(ierr); 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 2406e5c89e4eSSatish Balay Output Parameter: 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 2416e5c89e4eSSatish Balay .seealso: PetscOptionsGetReal(), PetscOptionsHasName(), PetscOptionsGetString(), 24172d747510SLisandro Dalcin PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool() 24182d747510SLisandro Dalcin PetscOptionsInt(), PetscOptionsString(), PetscOptionsReal(), PetscOptionsBool(), 2419e5c89e4eSSatish Balay PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 2420e5c89e4eSSatish Balay PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 2421acfcf0e5SJed Brown PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 2422a264d7a6SBarry Smith 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; 2427e5c89e4eSSatish Balay PetscErrorCode ierr; 24282d747510SLisandro Dalcin PetscBool flag; 2429e5c89e4eSSatish Balay 2430e5c89e4eSSatish Balay PetscFunctionBegin; 24312d747510SLisandro Dalcin PetscValidCharPointer(name,3); 24322d747510SLisandro Dalcin PetscValidIntPointer(ivalue,4); 24332d747510SLisandro Dalcin ierr = PetscOptionsFindPair(options,pre,name,&value,&flag);CHKERRQ(ierr); 2434e5c89e4eSSatish Balay if (flag) { 243534a9cc2cSBarry Smith if (!value) { 24362d747510SLisandro Dalcin if (set) *set = PETSC_FALSE; 243734a9cc2cSBarry Smith } else { 24382d747510SLisandro Dalcin if (set) *set = PETSC_TRUE; 24392d747510SLisandro Dalcin ierr = PetscOptionsStringToInt(value,ivalue);CHKERRQ(ierr); 2440e5c89e4eSSatish Balay } 2441e5c89e4eSSatish Balay } else { 244296ef3cdfSSatish Balay if (set) *set = PETSC_FALSE; 2443e5c89e4eSSatish Balay } 2444e5c89e4eSSatish Balay PetscFunctionReturn(0); 2445e5c89e4eSSatish Balay } 2446e5c89e4eSSatish Balay 2447e2446a98SMatthew Knepley /*@C 2448e5c89e4eSSatish Balay PetscOptionsGetReal - Gets the double precision value for a particular 2449e5c89e4eSSatish Balay option in the database. 2450e5c89e4eSSatish Balay 2451e5c89e4eSSatish Balay Not Collective 2452e5c89e4eSSatish Balay 2453e5c89e4eSSatish Balay Input Parameters: 24545c9cc608SHong Zhang + options - options database, use NULL for default global database 2455c5929fdfSBarry Smith . pre - string to prepend to each name or NULL 2456e5c89e4eSSatish Balay - name - the option one is seeking 2457e5c89e4eSSatish Balay 2458e5c89e4eSSatish Balay Output Parameter: 2459e5c89e4eSSatish Balay + dvalue - the double value to return 246096ef3cdfSSatish Balay - set - PETSC_TRUE if found, PETSC_FALSE if not found 2461e5c89e4eSSatish Balay 246295452b02SPatrick Sanan Notes: 246395452b02SPatrick Sanan If the user does not supply the option dvalue is NOT changed. Thus 24642efd9cb1SBarry Smith you should ALWAYS initialize the ivalue if you access it without first checking if the set flag is true. 2465e4974155SBarry Smith 2466e5c89e4eSSatish Balay Level: beginner 2467e5c89e4eSSatish Balay 2468e5c89e4eSSatish Balay .seealso: PetscOptionsGetInt(), PetscOptionsHasName(), 2469acfcf0e5SJed Brown PetscOptionsGetString(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(),PetscOptionsBool(), 2470e5c89e4eSSatish Balay PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 2471e5c89e4eSSatish Balay PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 2472acfcf0e5SJed Brown PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 2473a264d7a6SBarry Smith PetscOptionsFList(), PetscOptionsEList() 2474e5c89e4eSSatish Balay @*/ 2475c5929fdfSBarry Smith PetscErrorCode PetscOptionsGetReal(PetscOptions options,const char pre[],const char name[],PetscReal *dvalue,PetscBool *set) 2476e5c89e4eSSatish Balay { 24772d747510SLisandro Dalcin const char *value; 2478ace3abfcSBarry Smith PetscBool flag; 24792d747510SLisandro Dalcin PetscErrorCode ierr; 2480e5c89e4eSSatish Balay 2481e5c89e4eSSatish Balay PetscFunctionBegin; 24822d747510SLisandro Dalcin PetscValidCharPointer(name,3); 24832d747510SLisandro Dalcin PetscValidRealPointer(dvalue,4); 24842d747510SLisandro Dalcin ierr = PetscOptionsFindPair(options,pre,name,&value,&flag);CHKERRQ(ierr); 2485e5c89e4eSSatish Balay if (flag) { 2486a297a907SKarl Rupp if (!value) { 2487a297a907SKarl Rupp if (set) *set = PETSC_FALSE; 2488a297a907SKarl Rupp } else { 2489a297a907SKarl Rupp if (set) *set = PETSC_TRUE; 2490a297a907SKarl Rupp ierr = PetscOptionsStringToReal(value,dvalue);CHKERRQ(ierr); 2491a297a907SKarl Rupp } 2492e5c89e4eSSatish Balay } else { 249396ef3cdfSSatish Balay if (set) *set = PETSC_FALSE; 2494e5c89e4eSSatish Balay } 2495e5c89e4eSSatish Balay PetscFunctionReturn(0); 2496e5c89e4eSSatish Balay } 2497e5c89e4eSSatish Balay 2498e5c89e4eSSatish Balay /*@C 2499e5c89e4eSSatish Balay PetscOptionsGetScalar - Gets the scalar value for a particular 2500e5c89e4eSSatish Balay option in the database. 2501e5c89e4eSSatish Balay 2502e5c89e4eSSatish Balay Not Collective 2503e5c89e4eSSatish Balay 2504e5c89e4eSSatish Balay Input Parameters: 25055c9cc608SHong Zhang + options - options database, use NULL for default global database 2506c5929fdfSBarry Smith . pre - string to prepend to each name or NULL 2507e5c89e4eSSatish Balay - name - the option one is seeking 2508e5c89e4eSSatish Balay 2509e5c89e4eSSatish Balay Output Parameter: 2510e5c89e4eSSatish Balay + dvalue - the double value to return 251196ef3cdfSSatish Balay - set - PETSC_TRUE if found, else PETSC_FALSE 2512e5c89e4eSSatish Balay 2513e5c89e4eSSatish Balay Level: beginner 2514e5c89e4eSSatish Balay 2515e5c89e4eSSatish Balay Usage: 2516eb4ae41dSBarry Smith A complex number 2+3i must be specified with NO spaces 2517e5c89e4eSSatish Balay 251895452b02SPatrick Sanan Notes: 251995452b02SPatrick Sanan If the user does not supply the option dvalue is NOT changed. Thus 25202efd9cb1SBarry Smith you should ALWAYS initialize the ivalue if you access it without first checking if the set flag is true. 2521e4974155SBarry Smith 2522e5c89e4eSSatish Balay .seealso: PetscOptionsGetInt(), PetscOptionsHasName(), 2523acfcf0e5SJed Brown PetscOptionsGetString(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool(), 2524e5c89e4eSSatish Balay PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 2525e5c89e4eSSatish Balay PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 2526acfcf0e5SJed Brown PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 2527a264d7a6SBarry Smith PetscOptionsFList(), PetscOptionsEList() 2528e5c89e4eSSatish Balay @*/ 2529c5929fdfSBarry Smith PetscErrorCode PetscOptionsGetScalar(PetscOptions options,const char pre[],const char name[],PetscScalar *dvalue,PetscBool *set) 2530e5c89e4eSSatish Balay { 25312d747510SLisandro Dalcin const char *value; 2532ace3abfcSBarry Smith PetscBool flag; 2533e5c89e4eSSatish Balay PetscErrorCode ierr; 2534e5c89e4eSSatish Balay 2535e5c89e4eSSatish Balay PetscFunctionBegin; 25362d747510SLisandro Dalcin PetscValidCharPointer(name,3); 25372d747510SLisandro Dalcin PetscValidScalarPointer(dvalue,4); 25382d747510SLisandro Dalcin ierr = PetscOptionsFindPair(options,pre,name,&value,&flag);CHKERRQ(ierr); 2539e5c89e4eSSatish Balay if (flag) { 2540e5c89e4eSSatish Balay if (!value) { 254196ef3cdfSSatish Balay if (set) *set = PETSC_FALSE; 2542e5c89e4eSSatish Balay } else { 2543e5c89e4eSSatish Balay #if !defined(PETSC_USE_COMPLEX) 2544cfbddea1SSatish Balay ierr = PetscOptionsStringToReal(value,dvalue);CHKERRQ(ierr); 2545e5c89e4eSSatish Balay #else 2546eb4ae41dSBarry Smith ierr = PetscOptionsStringToScalar(value,dvalue);CHKERRQ(ierr); 2547e5c89e4eSSatish Balay #endif 254896ef3cdfSSatish Balay if (set) *set = PETSC_TRUE; 2549e5c89e4eSSatish Balay } 2550e5c89e4eSSatish Balay } else { /* flag */ 255196ef3cdfSSatish Balay if (set) *set = PETSC_FALSE; 2552e5c89e4eSSatish Balay } 2553e5c89e4eSSatish Balay PetscFunctionReturn(0); 2554e5c89e4eSSatish Balay } 2555e5c89e4eSSatish Balay 2556e5c89e4eSSatish Balay /*@C 2557e5c89e4eSSatish Balay PetscOptionsGetString - Gets the string value for a particular option in 2558e5c89e4eSSatish Balay the database. 2559e5c89e4eSSatish Balay 2560e5c89e4eSSatish Balay Not Collective 2561e5c89e4eSSatish Balay 2562e5c89e4eSSatish Balay Input Parameters: 25635c9cc608SHong Zhang + options - options database, use NULL for default global database 2564c5929fdfSBarry Smith . pre - string to prepend to name or NULL 2565e5c89e4eSSatish Balay . name - the option one is seeking 2566bcbf2dc5SJed Brown - len - maximum length of the string including null termination 2567e5c89e4eSSatish Balay 2568e5c89e4eSSatish Balay Output Parameters: 2569e5c89e4eSSatish Balay + string - location to copy string 257096ef3cdfSSatish Balay - set - PETSC_TRUE if found, else PETSC_FALSE 2571e5c89e4eSSatish Balay 2572e5c89e4eSSatish Balay Level: beginner 2573e5c89e4eSSatish Balay 2574e5c89e4eSSatish Balay Fortran Note: 2575e5c89e4eSSatish Balay The Fortran interface is slightly different from the C/C++ 2576e5c89e4eSSatish Balay interface (len is not used). Sample usage in Fortran follows 2577e5c89e4eSSatish Balay .vb 2578e5c89e4eSSatish Balay character *20 string 257993e6ba5cSBarry Smith PetscErrorCode ierr 258093e6ba5cSBarry Smith PetscBool set 25811b266c99SBarry Smith call PetscOptionsGetString(PETSC_NULL_OPTIONS,PETSC_NULL_CHARACTER,'-s',string,set,ierr) 2582e5c89e4eSSatish Balay .ve 2583e5c89e4eSSatish Balay 258495452b02SPatrick Sanan Notes: 258595452b02SPatrick 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 2586e4974155SBarry Smith 25872efd9cb1SBarry Smith If the user does not use the option then the string is not changed. Thus 25882efd9cb1SBarry Smith you should ALWAYS initialize the string if you access it without first checking if the set flag is true. 25892efd9cb1SBarry Smith 2590f3dea69dSBarry Smith Note: 2591f3dea69dSBarry 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). 2592f3dea69dSBarry Smith 2593e5c89e4eSSatish Balay .seealso: PetscOptionsGetInt(), PetscOptionsGetReal(), 2594acfcf0e5SJed Brown PetscOptionsHasName(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool(), 2595e5c89e4eSSatish Balay PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 2596e5c89e4eSSatish Balay PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 2597acfcf0e5SJed Brown PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 2598a264d7a6SBarry Smith PetscOptionsFList(), PetscOptionsEList() 2599e5c89e4eSSatish Balay @*/ 2600c5929fdfSBarry Smith PetscErrorCode PetscOptionsGetString(PetscOptions options,const char pre[],const char name[],char string[],size_t len,PetscBool *set) 2601e5c89e4eSSatish Balay { 26022d747510SLisandro Dalcin const char *value; 2603ace3abfcSBarry Smith PetscBool flag; 26042d747510SLisandro Dalcin PetscErrorCode ierr; 2605e5c89e4eSSatish Balay 2606e5c89e4eSSatish Balay PetscFunctionBegin; 26072d747510SLisandro Dalcin PetscValidCharPointer(name,3); 26082d747510SLisandro Dalcin PetscValidCharPointer(string,4); 26092d747510SLisandro Dalcin ierr = PetscOptionsFindPair(options,pre,name,&value,&flag);CHKERRQ(ierr); 2610e5c89e4eSSatish Balay if (!flag) { 261196ef3cdfSSatish Balay if (set) *set = PETSC_FALSE; 2612e5c89e4eSSatish Balay } else { 261396ef3cdfSSatish Balay if (set) *set = PETSC_TRUE; 2614e5c89e4eSSatish Balay if (value) { 2615e5c89e4eSSatish Balay ierr = PetscStrncpy(string,value,len);CHKERRQ(ierr); 2616e5c89e4eSSatish Balay } else { 2617580bdb30SBarry Smith ierr = PetscArrayzero(string,len);CHKERRQ(ierr); 2618e5c89e4eSSatish Balay } 2619e5c89e4eSSatish Balay } 2620e5c89e4eSSatish Balay PetscFunctionReturn(0); 2621e5c89e4eSSatish Balay } 2622e5c89e4eSSatish Balay 2623c5929fdfSBarry Smith char *PetscOptionsGetStringMatlab(PetscOptions options,const char pre[],const char name[]) 262414ce751eSBarry Smith { 26252d747510SLisandro Dalcin const char *value; 262614ce751eSBarry Smith PetscBool flag; 26272d747510SLisandro Dalcin PetscErrorCode ierr; 262814ce751eSBarry Smith 262914ce751eSBarry Smith PetscFunctionBegin; 263002c9f0b5SLisandro Dalcin ierr = PetscOptionsFindPair(options,pre,name,&value,&flag);if (ierr) PetscFunctionReturn(NULL); 26312d747510SLisandro Dalcin if (flag) PetscFunctionReturn((char*)value); 263202c9f0b5SLisandro Dalcin else PetscFunctionReturn(NULL); 263314ce751eSBarry Smith } 263414ce751eSBarry Smith 26352d747510SLisandro Dalcin /*@C 26362d747510SLisandro Dalcin PetscOptionsGetBoolArray - Gets an array of Logical (true or false) values for a particular 26372d747510SLisandro Dalcin option in the database. The values must be separated with commas with 26382d747510SLisandro Dalcin no intervening spaces. 26392d747510SLisandro Dalcin 26402d747510SLisandro Dalcin Not Collective 26412d747510SLisandro Dalcin 26422d747510SLisandro Dalcin Input Parameters: 26432d747510SLisandro Dalcin + options - options database, use NULL for default global database 26442d747510SLisandro Dalcin . pre - string to prepend to each name or NULL 26452d747510SLisandro Dalcin . name - the option one is seeking 26462d747510SLisandro Dalcin - nmax - maximum number of values to retrieve 26472d747510SLisandro Dalcin 26482d747510SLisandro Dalcin Output Parameter: 26492d747510SLisandro Dalcin + dvalue - the integer values to return 26502d747510SLisandro Dalcin . nmax - actual number of values retreived 26512d747510SLisandro Dalcin - set - PETSC_TRUE if found, else PETSC_FALSE 26522d747510SLisandro Dalcin 26532d747510SLisandro Dalcin Level: beginner 26542d747510SLisandro Dalcin 26552d747510SLisandro Dalcin Notes: 26562d747510SLisandro Dalcin TRUE, true, YES, yes, nostring, and 1 all translate to PETSC_TRUE 26572d747510SLisandro Dalcin FALSE, false, NO, no, and 0 all translate to PETSC_FALSE 26582d747510SLisandro Dalcin 26592d747510SLisandro Dalcin .seealso: PetscOptionsGetInt(), PetscOptionsHasName(), 26602d747510SLisandro Dalcin PetscOptionsGetString(), PetscOptionsGetRealArray(), PetscOptionsBool(), 26612d747510SLisandro Dalcin PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 26622d747510SLisandro Dalcin PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 26632d747510SLisandro Dalcin PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 26642d747510SLisandro Dalcin PetscOptionsFList(), PetscOptionsEList() 26652d747510SLisandro Dalcin @*/ 26662d747510SLisandro Dalcin PetscErrorCode PetscOptionsGetBoolArray(PetscOptions options,const char pre[],const char name[],PetscBool dvalue[],PetscInt *nmax,PetscBool *set) 26672d747510SLisandro Dalcin { 26682d747510SLisandro Dalcin const char *svalue; 26692d747510SLisandro Dalcin char *value; 26702d747510SLisandro Dalcin PetscErrorCode ierr; 26712d747510SLisandro Dalcin PetscInt n = 0; 26722d747510SLisandro Dalcin PetscBool flag; 26732d747510SLisandro Dalcin PetscToken token; 26742d747510SLisandro Dalcin 26752d747510SLisandro Dalcin PetscFunctionBegin; 26762d747510SLisandro Dalcin PetscValidCharPointer(name,3); 26772d747510SLisandro Dalcin PetscValidIntPointer(dvalue,4); 26782d747510SLisandro Dalcin PetscValidIntPointer(nmax,5); 26792d747510SLisandro Dalcin 26802d747510SLisandro Dalcin ierr = PetscOptionsFindPair(options,pre,name,&svalue,&flag);CHKERRQ(ierr); 26812d747510SLisandro Dalcin if (!flag || !svalue) { if (set) *set = PETSC_FALSE; *nmax = 0; PetscFunctionReturn(0);} 26822d747510SLisandro Dalcin if (set) *set = PETSC_TRUE; 26832d747510SLisandro Dalcin ierr = PetscTokenCreate(svalue,',',&token);CHKERRQ(ierr); 26842d747510SLisandro Dalcin ierr = PetscTokenFind(token,&value);CHKERRQ(ierr); 26852d747510SLisandro Dalcin while (value && n < *nmax) { 26862d747510SLisandro Dalcin ierr = PetscOptionsStringToBool(value,dvalue);CHKERRQ(ierr); 26872d747510SLisandro Dalcin ierr = PetscTokenFind(token,&value);CHKERRQ(ierr); 26882d747510SLisandro Dalcin dvalue++; 26892d747510SLisandro Dalcin n++; 26902d747510SLisandro Dalcin } 26912d747510SLisandro Dalcin ierr = PetscTokenDestroy(&token);CHKERRQ(ierr); 26922d747510SLisandro Dalcin *nmax = n; 26932d747510SLisandro Dalcin PetscFunctionReturn(0); 26942d747510SLisandro Dalcin } 26952d747510SLisandro Dalcin 26962d747510SLisandro Dalcin /*@C 26972d747510SLisandro Dalcin PetscOptionsGetEnumArray - Gets an array of enum values for a particular option in the database. 26982d747510SLisandro Dalcin 26992d747510SLisandro Dalcin Not Collective 27002d747510SLisandro Dalcin 27012d747510SLisandro Dalcin Input Parameters: 27022d747510SLisandro Dalcin + options - options database, use NULL for default global database 27032d747510SLisandro Dalcin . pre - option prefix or NULL 27042d747510SLisandro Dalcin . name - option name 27052d747510SLisandro Dalcin . list - array containing the list of choices, followed by the enum name, followed by the enum prefix, followed by a null 27062d747510SLisandro Dalcin - nmax - maximum number of values to retrieve 27072d747510SLisandro Dalcin 27082d747510SLisandro Dalcin Output Parameters: 27092d747510SLisandro Dalcin + ivalue - the enum values to return 27102d747510SLisandro Dalcin . nmax - actual number of values retreived 27112d747510SLisandro Dalcin - set - PETSC_TRUE if found, else PETSC_FALSE 27122d747510SLisandro Dalcin 27132d747510SLisandro Dalcin Level: beginner 27142d747510SLisandro Dalcin 27152d747510SLisandro Dalcin Notes: 27162d747510SLisandro Dalcin The array must be passed as a comma separated list. 27172d747510SLisandro Dalcin 27182d747510SLisandro Dalcin There must be no intervening spaces between the values. 27192d747510SLisandro Dalcin 27202d747510SLisandro Dalcin list is usually something like PCASMTypes or some other predefined list of enum names. 27212d747510SLisandro Dalcin 27222d747510SLisandro Dalcin .seealso: PetscOptionsGetReal(), PetscOptionsHasName(), PetscOptionsGetString(), PetscOptionsGetInt(), 27232d747510SLisandro Dalcin PetscOptionsGetEnum(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool() 27242d747510SLisandro Dalcin PetscOptionsInt(), PetscOptionsString(), PetscOptionsReal(), PetscOptionsBool(), PetscOptionsName(), 27252d747510SLisandro Dalcin PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), PetscOptionsStringArray(),PetscOptionsRealArray(), 27262d747510SLisandro Dalcin PetscOptionsScalar(), PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 27272d747510SLisandro Dalcin PetscOptionsFList(), PetscOptionsEList(), PetscOptionsGetEList(), PetscOptionsEnum() 27282d747510SLisandro Dalcin @*/ 27292d747510SLisandro Dalcin PetscErrorCode PetscOptionsGetEnumArray(PetscOptions options,const char pre[],const char name[],const char *const *list,PetscEnum ivalue[],PetscInt *nmax,PetscBool *set) 27302d747510SLisandro Dalcin { 27312d747510SLisandro Dalcin const char *svalue; 27322d747510SLisandro Dalcin char *value; 27332d747510SLisandro Dalcin PetscInt n = 0; 27342d747510SLisandro Dalcin PetscEnum evalue; 27352d747510SLisandro Dalcin PetscBool flag; 27362d747510SLisandro Dalcin PetscToken token; 27372d747510SLisandro Dalcin PetscErrorCode ierr; 27382d747510SLisandro Dalcin 27392d747510SLisandro Dalcin PetscFunctionBegin; 27402d747510SLisandro Dalcin PetscValidCharPointer(name,3); 27412d747510SLisandro Dalcin PetscValidPointer(list,4); 27422d747510SLisandro Dalcin PetscValidPointer(ivalue,5); 27432d747510SLisandro Dalcin PetscValidIntPointer(nmax,6); 27442d747510SLisandro Dalcin 27452d747510SLisandro Dalcin ierr = PetscOptionsFindPair(options,pre,name,&svalue,&flag);CHKERRQ(ierr); 27462d747510SLisandro Dalcin if (!flag || !svalue) { if (set) *set = PETSC_FALSE; *nmax = 0; PetscFunctionReturn(0);} 27472d747510SLisandro Dalcin if (set) *set = PETSC_TRUE; 27482d747510SLisandro Dalcin ierr = PetscTokenCreate(svalue,',',&token);CHKERRQ(ierr); 27492d747510SLisandro Dalcin ierr = PetscTokenFind(token,&value);CHKERRQ(ierr); 27502d747510SLisandro Dalcin while (value && n < *nmax) { 27512d747510SLisandro Dalcin ierr = PetscEnumFind(list,value,&evalue,&flag);CHKERRQ(ierr); 27522d747510SLisandro Dalcin if (!flag) SETERRQ3(PETSC_COMM_SELF,PETSC_ERR_USER,"Unknown enum value '%s' for -%s%s",svalue,pre ? pre : "",name+1); 27532d747510SLisandro Dalcin ivalue[n++] = evalue; 27542d747510SLisandro Dalcin ierr = PetscTokenFind(token,&value);CHKERRQ(ierr); 27552d747510SLisandro Dalcin } 27562d747510SLisandro Dalcin ierr = PetscTokenDestroy(&token);CHKERRQ(ierr); 27572d747510SLisandro Dalcin *nmax = n; 27582d747510SLisandro Dalcin PetscFunctionReturn(0); 27592d747510SLisandro Dalcin } 27602d747510SLisandro Dalcin 27612d747510SLisandro Dalcin /*@C 27622d747510SLisandro Dalcin PetscOptionsGetIntArray - Gets an array of integer values for a particular 27632d747510SLisandro Dalcin option in the database. 27642d747510SLisandro Dalcin 27652d747510SLisandro Dalcin Not Collective 27662d747510SLisandro Dalcin 27672d747510SLisandro Dalcin Input Parameters: 27682d747510SLisandro Dalcin + options - options database, use NULL for default global database 27692d747510SLisandro Dalcin . pre - string to prepend to each name or NULL 27702d747510SLisandro Dalcin . name - the option one is seeking 27712d747510SLisandro Dalcin - nmax - maximum number of values to retrieve 27722d747510SLisandro Dalcin 27732d747510SLisandro Dalcin Output Parameter: 27742d747510SLisandro Dalcin + ivalue - the integer values to return 27752d747510SLisandro Dalcin . nmax - actual number of values retreived 27762d747510SLisandro Dalcin - set - PETSC_TRUE if found, else PETSC_FALSE 27772d747510SLisandro Dalcin 27782d747510SLisandro Dalcin Level: beginner 27792d747510SLisandro Dalcin 27802d747510SLisandro Dalcin Notes: 27812d747510SLisandro Dalcin The array can be passed as 27822d747510SLisandro Dalcin a comma separated list: 0,1,2,3,4,5,6,7 27832d747510SLisandro Dalcin a range (start-end+1): 0-8 27842d747510SLisandro Dalcin a range with given increment (start-end+1:inc): 0-7:2 27852d747510SLisandro Dalcin a combination of values and ranges separated by commas: 0,1-8,8-15:2 27862d747510SLisandro Dalcin 27872d747510SLisandro Dalcin There must be no intervening spaces between the values. 27882d747510SLisandro Dalcin 27892d747510SLisandro Dalcin .seealso: PetscOptionsGetInt(), PetscOptionsHasName(), 27902d747510SLisandro Dalcin PetscOptionsGetString(), PetscOptionsGetRealArray(), PetscOptionsBool(), 27912d747510SLisandro Dalcin PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 27922d747510SLisandro Dalcin PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 27932d747510SLisandro Dalcin PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 27942d747510SLisandro Dalcin PetscOptionsFList(), PetscOptionsEList() 27952d747510SLisandro Dalcin @*/ 27962d747510SLisandro Dalcin PetscErrorCode PetscOptionsGetIntArray(PetscOptions options,const char pre[],const char name[],PetscInt ivalue[],PetscInt *nmax,PetscBool *set) 27972d747510SLisandro Dalcin { 27982d747510SLisandro Dalcin const char *svalue; 27992d747510SLisandro Dalcin char *value; 28002d747510SLisandro Dalcin PetscErrorCode ierr; 28012d747510SLisandro Dalcin PetscInt n = 0,i,j,start,end,inc,nvalues; 28022d747510SLisandro Dalcin size_t len; 28032d747510SLisandro Dalcin PetscBool flag,foundrange; 28042d747510SLisandro Dalcin PetscToken token; 28052d747510SLisandro Dalcin 28062d747510SLisandro Dalcin PetscFunctionBegin; 28072d747510SLisandro Dalcin PetscValidCharPointer(name,3); 28082d747510SLisandro Dalcin PetscValidIntPointer(ivalue,4); 28092d747510SLisandro Dalcin PetscValidIntPointer(nmax,5); 28102d747510SLisandro Dalcin 28112d747510SLisandro Dalcin ierr = PetscOptionsFindPair(options,pre,name,&svalue,&flag);CHKERRQ(ierr); 28122d747510SLisandro Dalcin if (!flag || !svalue) { if (set) *set = PETSC_FALSE; *nmax = 0; PetscFunctionReturn(0);} 28132d747510SLisandro Dalcin if (set) *set = PETSC_TRUE; 28142d747510SLisandro Dalcin ierr = PetscTokenCreate(svalue,',',&token);CHKERRQ(ierr); 28152d747510SLisandro Dalcin ierr = PetscTokenFind(token,&value);CHKERRQ(ierr); 28162d747510SLisandro Dalcin while (value && n < *nmax) { 28172d747510SLisandro Dalcin /* look for form d-D where d and D are integers */ 28182d747510SLisandro Dalcin foundrange = PETSC_FALSE; 28192d747510SLisandro Dalcin ierr = PetscStrlen(value,&len);CHKERRQ(ierr); 28202d747510SLisandro Dalcin if (value[0] == '-') i=2; 28212d747510SLisandro Dalcin else i=1; 28222d747510SLisandro Dalcin for (;i<(int)len; i++) { 28232d747510SLisandro Dalcin if (value[i] == '-') { 28242d747510SLisandro Dalcin if (i == (int)len-1) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_USER,"Error in %D-th array entry %s\n",n,value); 28252d747510SLisandro Dalcin value[i] = 0; 28262d747510SLisandro Dalcin 28272d747510SLisandro Dalcin ierr = PetscOptionsStringToInt(value,&start);CHKERRQ(ierr); 28282d747510SLisandro Dalcin inc = 1; 28292d747510SLisandro Dalcin j = i+1; 28302d747510SLisandro Dalcin for (;j<(int)len; j++) { 28312d747510SLisandro Dalcin if (value[j] == ':') { 28322d747510SLisandro Dalcin value[j] = 0; 28332d747510SLisandro Dalcin 28342d747510SLisandro Dalcin ierr = PetscOptionsStringToInt(value+j+1,&inc);CHKERRQ(ierr); 28352d747510SLisandro Dalcin if (inc <= 0) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_USER,"Error in %D-th array entry,%s cannot have negative increment",n,value+j+1); 28362d747510SLisandro Dalcin break; 28372d747510SLisandro Dalcin } 28382d747510SLisandro Dalcin } 28392d747510SLisandro Dalcin ierr = PetscOptionsStringToInt(value+i+1,&end);CHKERRQ(ierr); 28402d747510SLisandro Dalcin if (end <= start) SETERRQ3(PETSC_COMM_SELF,PETSC_ERR_USER,"Error in %D-th array entry, %s-%s cannot have decreasing list",n,value,value+i+1); 28412d747510SLisandro Dalcin nvalues = (end-start)/inc + (end-start)%inc; 28422d747510SLisandro Dalcin if (n + nvalues > *nmax) SETERRQ4(PETSC_COMM_SELF,PETSC_ERR_USER,"Error in %D-th array entry, not enough space left in array (%D) to contain entire range from %D to %D",n,*nmax-n,start,end); 28432d747510SLisandro Dalcin for (;start<end; start+=inc) { 28442d747510SLisandro Dalcin *ivalue = start; ivalue++;n++; 28452d747510SLisandro Dalcin } 28462d747510SLisandro Dalcin foundrange = PETSC_TRUE; 28472d747510SLisandro Dalcin break; 28482d747510SLisandro Dalcin } 28492d747510SLisandro Dalcin } 28502d747510SLisandro Dalcin if (!foundrange) { 28512d747510SLisandro Dalcin ierr = PetscOptionsStringToInt(value,ivalue);CHKERRQ(ierr); 28522d747510SLisandro Dalcin ivalue++; 28532d747510SLisandro Dalcin n++; 28542d747510SLisandro Dalcin } 28552d747510SLisandro Dalcin ierr = PetscTokenFind(token,&value);CHKERRQ(ierr); 28562d747510SLisandro Dalcin } 28572d747510SLisandro Dalcin ierr = PetscTokenDestroy(&token);CHKERRQ(ierr); 28582d747510SLisandro Dalcin *nmax = n; 28592d747510SLisandro Dalcin PetscFunctionReturn(0); 28602d747510SLisandro Dalcin } 28612d747510SLisandro Dalcin 28622d747510SLisandro Dalcin /*@C 28632d747510SLisandro Dalcin PetscOptionsGetRealArray - Gets an array of double precision values for a 28642d747510SLisandro Dalcin particular option in the database. The values must be separated with 28652d747510SLisandro Dalcin commas with no intervening spaces. 28662d747510SLisandro Dalcin 28672d747510SLisandro Dalcin Not Collective 28682d747510SLisandro Dalcin 28692d747510SLisandro Dalcin Input Parameters: 28702d747510SLisandro Dalcin + options - options database, use NULL for default global database 28712d747510SLisandro Dalcin . pre - string to prepend to each name or NULL 28722d747510SLisandro Dalcin . name - the option one is seeking 28732d747510SLisandro Dalcin - nmax - maximum number of values to retrieve 28742d747510SLisandro Dalcin 28752d747510SLisandro Dalcin Output Parameters: 28762d747510SLisandro Dalcin + dvalue - the double values to return 28772d747510SLisandro Dalcin . nmax - actual number of values retreived 28782d747510SLisandro Dalcin - set - PETSC_TRUE if found, else PETSC_FALSE 28792d747510SLisandro Dalcin 28802d747510SLisandro Dalcin Level: beginner 28812d747510SLisandro Dalcin 28822d747510SLisandro Dalcin .seealso: PetscOptionsGetInt(), PetscOptionsHasName(), 28832d747510SLisandro Dalcin PetscOptionsGetString(), PetscOptionsGetIntArray(), PetscOptionsBool(), 28842d747510SLisandro Dalcin PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 28852d747510SLisandro Dalcin PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 28862d747510SLisandro Dalcin PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 28872d747510SLisandro Dalcin PetscOptionsFList(), PetscOptionsEList() 28882d747510SLisandro Dalcin @*/ 28892d747510SLisandro Dalcin PetscErrorCode PetscOptionsGetRealArray(PetscOptions options,const char pre[],const char name[],PetscReal dvalue[],PetscInt *nmax,PetscBool *set) 28902d747510SLisandro Dalcin { 28912d747510SLisandro Dalcin const char *svalue; 28922d747510SLisandro Dalcin char *value; 28932d747510SLisandro Dalcin PetscErrorCode ierr; 28942d747510SLisandro Dalcin PetscInt n = 0; 28952d747510SLisandro Dalcin PetscBool flag; 28962d747510SLisandro Dalcin PetscToken token; 28972d747510SLisandro Dalcin 28982d747510SLisandro Dalcin PetscFunctionBegin; 28992d747510SLisandro Dalcin PetscValidCharPointer(name,3); 29002d747510SLisandro Dalcin PetscValidRealPointer(dvalue,4); 29012d747510SLisandro Dalcin PetscValidIntPointer(nmax,5); 29022d747510SLisandro Dalcin 29032d747510SLisandro Dalcin ierr = PetscOptionsFindPair(options,pre,name,&svalue,&flag);CHKERRQ(ierr); 29042d747510SLisandro Dalcin if (!flag || !svalue) { if (set) *set = PETSC_FALSE; *nmax = 0; PetscFunctionReturn(0);} 29052d747510SLisandro Dalcin if (set) *set = PETSC_TRUE; 29062d747510SLisandro Dalcin ierr = PetscTokenCreate(svalue,',',&token);CHKERRQ(ierr); 29072d747510SLisandro Dalcin ierr = PetscTokenFind(token,&value);CHKERRQ(ierr); 29082d747510SLisandro Dalcin while (value && n < *nmax) { 29092d747510SLisandro Dalcin ierr = PetscOptionsStringToReal(value,dvalue++);CHKERRQ(ierr); 29102d747510SLisandro Dalcin ierr = PetscTokenFind(token,&value);CHKERRQ(ierr); 29112d747510SLisandro Dalcin n++; 29122d747510SLisandro Dalcin } 29132d747510SLisandro Dalcin ierr = PetscTokenDestroy(&token);CHKERRQ(ierr); 29142d747510SLisandro Dalcin *nmax = n; 29152d747510SLisandro Dalcin PetscFunctionReturn(0); 29162d747510SLisandro Dalcin } 29172d747510SLisandro Dalcin 29182d747510SLisandro Dalcin /*@C 29192d747510SLisandro Dalcin PetscOptionsGetScalarArray - Gets an array of scalars for a 29202d747510SLisandro Dalcin particular option in the database. The values must be separated with 29212d747510SLisandro Dalcin commas with no intervening spaces. 29222d747510SLisandro Dalcin 29232d747510SLisandro Dalcin Not Collective 29242d747510SLisandro Dalcin 29252d747510SLisandro Dalcin Input Parameters: 29262d747510SLisandro Dalcin + options - options database, use NULL for default global database 29272d747510SLisandro Dalcin . pre - string to prepend to each name or NULL 29282d747510SLisandro Dalcin . name - the option one is seeking 29292d747510SLisandro Dalcin - nmax - maximum number of values to retrieve 29302d747510SLisandro Dalcin 29312d747510SLisandro Dalcin Output Parameters: 29322d747510SLisandro Dalcin + dvalue - the scalar values to return 29332d747510SLisandro Dalcin . nmax - actual number of values retreived 29342d747510SLisandro Dalcin - set - PETSC_TRUE if found, else PETSC_FALSE 29352d747510SLisandro Dalcin 29362d747510SLisandro Dalcin Level: beginner 29372d747510SLisandro Dalcin 29382d747510SLisandro Dalcin .seealso: PetscOptionsGetInt(), PetscOptionsHasName(), 29392d747510SLisandro Dalcin PetscOptionsGetString(), PetscOptionsGetIntArray(), PetscOptionsBool(), 29402d747510SLisandro Dalcin PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 29412d747510SLisandro Dalcin PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 29422d747510SLisandro Dalcin PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 29432d747510SLisandro Dalcin PetscOptionsFList(), PetscOptionsEList() 29442d747510SLisandro Dalcin @*/ 29452d747510SLisandro Dalcin PetscErrorCode PetscOptionsGetScalarArray(PetscOptions options,const char pre[],const char name[],PetscScalar dvalue[],PetscInt *nmax,PetscBool *set) 29462d747510SLisandro Dalcin { 29472d747510SLisandro Dalcin const char *svalue; 29482d747510SLisandro Dalcin char *value; 29492d747510SLisandro Dalcin PetscErrorCode ierr; 29502d747510SLisandro Dalcin PetscInt n = 0; 29512d747510SLisandro Dalcin PetscBool flag; 29522d747510SLisandro Dalcin PetscToken token; 29532d747510SLisandro Dalcin 29542d747510SLisandro Dalcin PetscFunctionBegin; 29552d747510SLisandro Dalcin PetscValidCharPointer(name,3); 29562d747510SLisandro Dalcin PetscValidRealPointer(dvalue,4); 29572d747510SLisandro Dalcin PetscValidIntPointer(nmax,5); 29582d747510SLisandro Dalcin 29592d747510SLisandro Dalcin ierr = PetscOptionsFindPair(options,pre,name,&svalue,&flag);CHKERRQ(ierr); 29602d747510SLisandro Dalcin if (!flag || !svalue) { if (set) *set = PETSC_FALSE; *nmax = 0; PetscFunctionReturn(0);} 29612d747510SLisandro Dalcin if (set) *set = PETSC_TRUE; 29622d747510SLisandro Dalcin ierr = PetscTokenCreate(svalue,',',&token);CHKERRQ(ierr); 29632d747510SLisandro Dalcin ierr = PetscTokenFind(token,&value);CHKERRQ(ierr); 29642d747510SLisandro Dalcin while (value && n < *nmax) { 29652d747510SLisandro Dalcin ierr = PetscOptionsStringToScalar(value,dvalue++);CHKERRQ(ierr); 29662d747510SLisandro Dalcin ierr = PetscTokenFind(token,&value);CHKERRQ(ierr); 29672d747510SLisandro Dalcin n++; 29682d747510SLisandro Dalcin } 29692d747510SLisandro Dalcin ierr = PetscTokenDestroy(&token);CHKERRQ(ierr); 29702d747510SLisandro Dalcin *nmax = n; 29712d747510SLisandro Dalcin PetscFunctionReturn(0); 29722d747510SLisandro Dalcin } 297314ce751eSBarry Smith 2974e5c89e4eSSatish Balay /*@C 2975e5c89e4eSSatish Balay PetscOptionsGetStringArray - Gets an array of string values for a particular 2976e5c89e4eSSatish Balay option in the database. The values must be separated with commas with 2977e5c89e4eSSatish Balay no intervening spaces. 2978e5c89e4eSSatish Balay 2979e5c89e4eSSatish Balay Not Collective 2980e5c89e4eSSatish Balay 2981e5c89e4eSSatish Balay Input Parameters: 29825c9cc608SHong Zhang + options - options database, use NULL for default global database 2983c5929fdfSBarry Smith . pre - string to prepend to name or NULL 2984e5c89e4eSSatish Balay . name - the option one is seeking 2985e5c89e4eSSatish Balay - nmax - maximum number of strings 2986e5c89e4eSSatish Balay 2987e7b76fa7SPatrick Sanan Output Parameters: 2988e5c89e4eSSatish Balay + strings - location to copy strings 2989e7b76fa7SPatrick Sanan . nmax - the number of strings found 299096ef3cdfSSatish Balay - set - PETSC_TRUE if found, else PETSC_FALSE 2991e5c89e4eSSatish Balay 2992e5c89e4eSSatish Balay Level: beginner 2993e5c89e4eSSatish Balay 2994e5c89e4eSSatish Balay Notes: 2995e7b76fa7SPatrick Sanan The nmax parameter is used for both input and output. 2996e7b76fa7SPatrick Sanan 2997e5c89e4eSSatish Balay The user should pass in an array of pointers to char, to hold all the 2998e5c89e4eSSatish Balay strings returned by this function. 2999e5c89e4eSSatish Balay 3000e5c89e4eSSatish Balay The user is responsible for deallocating the strings that are 3001e5c89e4eSSatish Balay returned. The Fortran interface for this routine is not supported. 3002e5c89e4eSSatish Balay 3003e5c89e4eSSatish Balay .seealso: PetscOptionsGetInt(), PetscOptionsGetReal(), 3004acfcf0e5SJed Brown PetscOptionsHasName(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool(), 3005e5c89e4eSSatish Balay PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 3006e5c89e4eSSatish Balay PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 3007acfcf0e5SJed Brown PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 3008a264d7a6SBarry Smith PetscOptionsFList(), PetscOptionsEList() 3009e5c89e4eSSatish Balay @*/ 3010c5929fdfSBarry Smith PetscErrorCode PetscOptionsGetStringArray(PetscOptions options,const char pre[],const char name[],char *strings[],PetscInt *nmax,PetscBool *set) 3011e5c89e4eSSatish Balay { 30122d747510SLisandro Dalcin const char *svalue; 3013e5c89e4eSSatish Balay char *value; 3014e5c89e4eSSatish Balay PetscErrorCode ierr; 30152d747510SLisandro Dalcin PetscInt n = 0; 3016ace3abfcSBarry Smith PetscBool flag; 30179c9d3cfdSBarry Smith PetscToken token; 3018e5c89e4eSSatish Balay 3019e5c89e4eSSatish Balay PetscFunctionBegin; 30202d747510SLisandro Dalcin PetscValidCharPointer(name,3); 30212d747510SLisandro Dalcin PetscValidPointer(strings,4); 30222d747510SLisandro Dalcin PetscValidIntPointer(nmax,5); 3023e5c89e4eSSatish Balay 30242d747510SLisandro Dalcin ierr = PetscOptionsFindPair(options,pre,name,&svalue,&flag);CHKERRQ(ierr); 30252d747510SLisandro Dalcin if (!flag || !svalue) { if (set) *set = PETSC_FALSE; *nmax = 0; PetscFunctionReturn(0);} 30262d747510SLisandro Dalcin if (set) *set = PETSC_TRUE; 30272d747510SLisandro Dalcin ierr = PetscTokenCreate(svalue,',',&token);CHKERRQ(ierr); 3028e5c89e4eSSatish Balay ierr = PetscTokenFind(token,&value);CHKERRQ(ierr); 30292d747510SLisandro Dalcin while (value && n < *nmax) { 3030e5c89e4eSSatish Balay ierr = PetscStrallocpy(value,&strings[n]);CHKERRQ(ierr); 3031e5c89e4eSSatish Balay ierr = PetscTokenFind(token,&value);CHKERRQ(ierr); 3032e5c89e4eSSatish Balay n++; 3033e5c89e4eSSatish Balay } 30348c74ee41SBarry Smith ierr = PetscTokenDestroy(&token);CHKERRQ(ierr); 3035e5c89e4eSSatish Balay *nmax = n; 3036e5c89e4eSSatish Balay PetscFunctionReturn(0); 3037e5c89e4eSSatish Balay } 303806824ed3SPatrick Sanan 303906824ed3SPatrick Sanan /*@C 304006824ed3SPatrick Sanan PetscOptionsDeprecated - mark an option as deprecated, optionally replacing it with a new one 304106824ed3SPatrick Sanan 304206824ed3SPatrick Sanan Prints a deprecation warning, unless an option is supplied to suppress. 304306824ed3SPatrick Sanan 30441c9f3c13SBarry Smith Logically Collective 304506824ed3SPatrick Sanan 304606824ed3SPatrick Sanan Input Parameters: 30479503aa97SPatrick Sanan + pre - string to prepend to name or NULL 304806824ed3SPatrick Sanan . oldname - the old, deprecated option 304906824ed3SPatrick Sanan . newname - the new option, or NULL if option is purely removed 30509f3a6782SPatrick Sanan . version - a string describing the version of first deprecation, e.g. "3.9" 30519f3a6782SPatrick Sanan - info - additional information string, or NULL. 305206824ed3SPatrick Sanan 305306824ed3SPatrick Sanan Options Database Keys: 305406824ed3SPatrick Sanan . -options_suppress_deprecated_warnings - do not print deprecation warnings 305506824ed3SPatrick Sanan 305606824ed3SPatrick Sanan Notes: 30571c9f3c13SBarry Smith Must be called between PetscOptionsBegin() (or PetscObjectOptionsBegin()) and PetscOptionsEnd(). 30581c9f3c13SBarry Smith Only the proces of rank zero that owns the PetscOptionsItems are argument (managed by PetscOptionsBegin() or 30591c9f3c13SBarry Smith PetscObjectOptionsBegin() prints the information 3060b40114eaSPatrick Sanan If newname is provided, the old option is replaced. Otherwise, it remains 3061b40114eaSPatrick Sanan in the options database. 30629f3a6782SPatrick Sanan If an option is not replaced, the info argument should be used to advise the user 30639f3a6782SPatrick Sanan on how to proceed. 30649f3a6782SPatrick Sanan There is a limit on the length of the warning printed, so very long strings 30659f3a6782SPatrick Sanan provided as info may be truncated. 306606824ed3SPatrick Sanan 306706824ed3SPatrick Sanan Level: developer 306806824ed3SPatrick Sanan 306906824ed3SPatrick Sanan .seealso: PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsScalar(), PetscOptionsBool(), PetscOptionsString(), PetscOptionsSetValue() 307006824ed3SPatrick Sanan 307106824ed3SPatrick Sanan @*/ 30729f3a6782SPatrick Sanan PetscErrorCode PetscOptionsDeprecated_Private(PetscOptionItems *PetscOptionsObject,const char oldname[],const char newname[],const char version[],const char info[]) 307306824ed3SPatrick Sanan { 307406824ed3SPatrick Sanan PetscErrorCode ierr; 307506824ed3SPatrick Sanan PetscBool found,quiet; 307606824ed3SPatrick Sanan const char *value; 307706824ed3SPatrick Sanan const char * const quietopt="-options_suppress_deprecated_warnings"; 30789f3a6782SPatrick Sanan char msg[4096]; 3079b0bdc838SStefano Zampini char *prefix = NULL; 3080b0bdc838SStefano Zampini PetscOptions options = NULL; 3081b0bdc838SStefano Zampini MPI_Comm comm = PETSC_COMM_SELF; 308206824ed3SPatrick Sanan 308306824ed3SPatrick Sanan PetscFunctionBegin; 308406824ed3SPatrick Sanan PetscValidCharPointer(oldname,2); 308506824ed3SPatrick Sanan PetscValidCharPointer(version,4); 3086b0bdc838SStefano Zampini if (PetscOptionsObject) { 3087b0bdc838SStefano Zampini prefix = PetscOptionsObject->prefix; 3088b0bdc838SStefano Zampini options = PetscOptionsObject->options; 3089b0bdc838SStefano Zampini comm = PetscOptionsObject->comm; 3090b0bdc838SStefano Zampini } 3091b0bdc838SStefano Zampini ierr = PetscOptionsFindPair(options,prefix,oldname,&value,&found);CHKERRQ(ierr); 309206824ed3SPatrick Sanan if (found) { 309306824ed3SPatrick Sanan if (newname) { 3094b0bdc838SStefano Zampini if (prefix) { 3095b0bdc838SStefano Zampini ierr = PetscOptionsPrefixPush(options,prefix);CHKERRQ(ierr); 3096d255429eSPatrick Sanan } 3097b0bdc838SStefano Zampini ierr = PetscOptionsSetValue(options,newname,value);CHKERRQ(ierr); 3098b0bdc838SStefano Zampini if (prefix) { 3099b0bdc838SStefano Zampini ierr = PetscOptionsPrefixPop(options);CHKERRQ(ierr); 3100d255429eSPatrick Sanan } 3101b0bdc838SStefano Zampini ierr = PetscOptionsClearValue(options,oldname);CHKERRQ(ierr); 3102b40114eaSPatrick Sanan } 310306824ed3SPatrick Sanan quiet = PETSC_FALSE; 3104b0bdc838SStefano Zampini ierr = PetscOptionsGetBool(options,NULL,quietopt,&quiet,NULL);CHKERRQ(ierr); 310506824ed3SPatrick Sanan if (!quiet) { 31069f3a6782SPatrick Sanan ierr = PetscStrcpy(msg,"** PETSc DEPRECATION WARNING ** : the option ");CHKERRQ(ierr); 31071fa95f81SSatish Balay ierr = PetscStrcat(msg,oldname);CHKERRQ(ierr); 3108928bb9adSStefano Zampini ierr = PetscStrcat(msg," is deprecated as of version ");CHKERRQ(ierr); 31099f3a6782SPatrick Sanan ierr = PetscStrcat(msg,version);CHKERRQ(ierr); 31109f3a6782SPatrick Sanan ierr = PetscStrcat(msg," and will be removed in a future release.");CHKERRQ(ierr); 311106824ed3SPatrick Sanan if (newname) { 31129f3a6782SPatrick Sanan ierr = PetscStrcat(msg," Please use the option ");CHKERRQ(ierr); 31139f3a6782SPatrick Sanan ierr = PetscStrcat(msg,newname);CHKERRQ(ierr); 31149f3a6782SPatrick Sanan ierr = PetscStrcat(msg," instead.");CHKERRQ(ierr); 311506824ed3SPatrick Sanan } 31169f3a6782SPatrick Sanan if (info) { 31179f3a6782SPatrick Sanan ierr = PetscStrcat(msg," ");CHKERRQ(ierr); 31189f3a6782SPatrick Sanan ierr = PetscStrcat(msg,info);CHKERRQ(ierr); 31199f3a6782SPatrick Sanan } 31209f3a6782SPatrick Sanan ierr = PetscStrcat(msg," (Silence this warning with ");CHKERRQ(ierr); 31219f3a6782SPatrick Sanan ierr = PetscStrcat(msg,quietopt);CHKERRQ(ierr); 31229f3a6782SPatrick Sanan ierr = PetscStrcat(msg,")\n");CHKERRQ(ierr); 3123b0bdc838SStefano Zampini ierr = PetscPrintf(comm,msg);CHKERRQ(ierr); 312406824ed3SPatrick Sanan } 312506824ed3SPatrick Sanan } 312606824ed3SPatrick Sanan PetscFunctionReturn(0); 312706824ed3SPatrick Sanan } 3128