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 */ 64*c5c1f447SLisandro 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() */ 106d314f959SVaclav Hapla static const char *precedentOptions[] = {"-options_monitor","-options_monitor_cancel","-help","-skip_petscrc","-options_file_yaml","-options_string_yaml"}; 107d314f959SVaclav Hapla enum PetscPrecedentOption {PO_OPTIONS_MONITOR,PO_OPTIONS_MONITOR_CANCEL,PO_HELP,PO_SKIP_PETSCRC,PO_OPTIONS_FILE_YAML,PO_OPTIONS_STRING_YAML,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 { 32796fc60bcSBarry Smith char *first,*second; 328e5c89e4eSSatish Balay PetscErrorCode ierr; 3299c9d3cfdSBarry Smith PetscToken token; 330bf9c6086SStefano Zampini PetscBool key,ispush,ispop,isopts; 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) { 3369db968c8SJed Brown ierr = PetscStrcasecmp(first,"-prefix_push",&ispush);CHKERRQ(ierr); 3379db968c8SJed Brown ierr = PetscStrcasecmp(first,"-prefix_pop",&ispop);CHKERRQ(ierr); 338bf9c6086SStefano Zampini ierr = PetscStrcasecmp(first,"-options_file",&isopts);CHKERRQ(ierr); 33996fc60bcSBarry Smith ierr = PetscOptionsValidKey(first,&key);CHKERRQ(ierr); 3409db968c8SJed Brown if (ispush) { 3419db968c8SJed Brown ierr = PetscTokenFind(token,&second);CHKERRQ(ierr); 342c5929fdfSBarry Smith ierr = PetscOptionsPrefixPush(options,second);CHKERRQ(ierr); 3439db968c8SJed Brown ierr = PetscTokenFind(token,&first);CHKERRQ(ierr); 3449db968c8SJed Brown } else if (ispop) { 345c5929fdfSBarry Smith ierr = PetscOptionsPrefixPop(options);CHKERRQ(ierr); 3469db968c8SJed Brown ierr = PetscTokenFind(token,&first);CHKERRQ(ierr); 347bf9c6086SStefano Zampini } else if (isopts) { 348bf9c6086SStefano Zampini ierr = PetscTokenFind(token,&second);CHKERRQ(ierr); 349bf9c6086SStefano Zampini ierr = PetscOptionsInsertFile(PETSC_COMM_SELF,options,second,PETSC_TRUE);CHKERRQ(ierr); 350bf9c6086SStefano Zampini ierr = PetscTokenFind(token,&first);CHKERRQ(ierr); 3519db968c8SJed Brown } else if (key) { 352e5c89e4eSSatish Balay ierr = PetscTokenFind(token,&second);CHKERRQ(ierr); 35396fc60bcSBarry Smith ierr = PetscOptionsValidKey(second,&key);CHKERRQ(ierr); 35496fc60bcSBarry Smith if (!key) { 355c5929fdfSBarry Smith ierr = PetscOptionsSetValue(options,first,second);CHKERRQ(ierr); 35696fc60bcSBarry Smith ierr = PetscTokenFind(token,&first);CHKERRQ(ierr); 35796fc60bcSBarry Smith } else { 358c5929fdfSBarry Smith ierr = PetscOptionsSetValue(options,first,NULL);CHKERRQ(ierr); 35996fc60bcSBarry Smith first = second; 36096fc60bcSBarry Smith } 36196fc60bcSBarry Smith } else { 36296fc60bcSBarry Smith ierr = PetscTokenFind(token,&first);CHKERRQ(ierr); 363e5c89e4eSSatish Balay } 364e5c89e4eSSatish Balay } 3658c74ee41SBarry Smith ierr = PetscTokenDestroy(&token);CHKERRQ(ierr); 366e5c89e4eSSatish Balay PetscFunctionReturn(0); 367e5c89e4eSSatish Balay } 368e5c89e4eSSatish Balay 3693fc1eb6aSBarry Smith /* 3703fc1eb6aSBarry Smith Returns a line (ended by a \n, \r or null character of any length. Result should be freed with free() 3713fc1eb6aSBarry Smith */ 3725fa91da5SBarry Smith static char *Petscgetline(FILE * f) 3735fa91da5SBarry Smith { 3745fa91da5SBarry Smith size_t size = 0; 3755fa91da5SBarry Smith size_t len = 0; 3765fa91da5SBarry Smith size_t last = 0; 3770298fd71SBarry Smith char *buf = NULL; 3785fa91da5SBarry Smith 37902c9f0b5SLisandro Dalcin if (feof(f)) return NULL; 3805fa91da5SBarry Smith do { 3815fa91da5SBarry Smith size += 1024; /* BUFSIZ is defined as "the optimal read size for this platform" */ 3826e0c8459SSatish Balay buf = (char*)realloc((void*)buf,size); /* realloc(NULL,n) is the same as malloc(n) */ 3835fa91da5SBarry Smith /* Actually do the read. Note that fgets puts a terminal '\0' on the 3845fa91da5SBarry Smith end of the string, so we make sure we overwrite this */ 385e86f3e45SDave May if (!fgets(buf+len,1024,f)) buf[len]=0; 3865fa91da5SBarry Smith PetscStrlen(buf,&len); 3875fa91da5SBarry Smith last = len - 1; 3885fa91da5SBarry Smith } while (!feof(f) && buf[last] != '\n' && buf[last] != '\r'); 38908ac41f7SSatish Balay if (len) return buf; 3905fa91da5SBarry Smith free(buf); 39102c9f0b5SLisandro Dalcin return NULL; 3925fa91da5SBarry Smith } 3935fa91da5SBarry Smith 394e5c89e4eSSatish Balay /*@C 395e5c89e4eSSatish Balay PetscOptionsInsertFile - Inserts options into the database from a file. 396e5c89e4eSSatish Balay 397d083f849SBarry Smith Collective 398e5c89e4eSSatish Balay 399e5c89e4eSSatish Balay Input Parameter: 4009b754dc9SBarry Smith + comm - the processes that will share the options (usually PETSC_COMM_WORLD) 401c5929fdfSBarry Smith . options - options database, use NULL for default global database 402e5c89e4eSSatish Balay . file - name of file 4039b754dc9SBarry Smith - require - if PETSC_TRUE will generate an error if the file does not exist 404e5c89e4eSSatish Balay 405e5c89e4eSSatish Balay 40695452b02SPatrick Sanan Notes: 40795452b02SPatrick Sanan Use # for lines that are comments and which should be ignored. 408f0feba65SBarry Smith Usually, instead of using this command, one should list the file name in the call to PetscInitialize(), this insures that certain options 409609bdbeeSBarry Smith such as -log_view or -malloc_debug are processed properly. This routine only sets options into the options database that will be processed by later 410f0feba65SBarry Smith calls to XXXSetFromOptions() it should not be used for options listed under PetscInitialize(). 4119666a313SBarry Smith The collectivity of this routine is complex; only the MPI processes in comm will 4121c9f3c13SBarry Smith have the affect of these options. If some processes that create objects call this routine and others do 4131c9f3c13SBarry Smith not the code may fail in complicated ways because the same parallel solvers may incorrectly use different options 4141c9f3c13SBarry Smith on different ranks. 415f0feba65SBarry Smith 4163bcbd388SSean Farley Level: developer 417e5c89e4eSSatish Balay 41888c29154SBarry Smith .seealso: PetscOptionsSetValue(), PetscOptionsView(), PetscOptionsHasName(), PetscOptionsGetInt(), 419acfcf0e5SJed Brown PetscOptionsGetReal(), PetscOptionsGetString(), PetscOptionsGetIntArray(), PetscOptionsBool(), 420e5c89e4eSSatish Balay PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 421e5c89e4eSSatish Balay PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 422acfcf0e5SJed Brown PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 423a264d7a6SBarry Smith PetscOptionsFList(), PetscOptionsEList() 424e5c89e4eSSatish Balay 425e5c89e4eSSatish Balay @*/ 426c5929fdfSBarry Smith PetscErrorCode PetscOptionsInsertFile(MPI_Comm comm,PetscOptions options,const char file[],PetscBool require) 427e5c89e4eSSatish Balay { 4288c0b561eSLisandro Dalcin char *string,*vstring = NULL,*astring = NULL,*packed = NULL; 4297fb43599SVaclav Hapla char *tokens[4]; 430e5c89e4eSSatish Balay PetscErrorCode ierr; 43113e3f751SJed Brown size_t i,len,bytes; 432e5c89e4eSSatish Balay FILE *fd; 4337fb43599SVaclav Hapla PetscToken token=NULL; 434ed9cf6e9SBarry Smith int err; 435581bbe83SVaclav Hapla char *cmatch; 436581bbe83SVaclav Hapla const char cmt='#'; 4379210b8eaSVaclav Hapla PetscInt line=1; 4383a018368SJed Brown PetscMPIInt rank,cnt=0,acnt=0,counts[2]; 4399210b8eaSVaclav Hapla PetscBool isdir,alias=PETSC_FALSE,valid; 440e5c89e4eSSatish Balay 441e5c89e4eSSatish Balay PetscFunctionBegin; 4427fb43599SVaclav Hapla ierr = PetscMemzero(tokens,sizeof(tokens));CHKERRQ(ierr); 4438c0b561eSLisandro Dalcin ierr = MPI_Comm_rank(comm,&rank);CHKERRMPI(ierr); 44405c7dedfSBarry Smith if (!rank) { 4458c0b561eSLisandro Dalcin char fpath[PETSC_MAX_PATH_LEN]; 4468c0b561eSLisandro Dalcin char fname[PETSC_MAX_PATH_LEN]; 44705c7dedfSBarry Smith 4488c0b561eSLisandro Dalcin ierr = PetscStrreplace(PETSC_COMM_SELF,file,fpath,sizeof(fpath));CHKERRQ(ierr); 4498c0b561eSLisandro Dalcin ierr = PetscFixFilename(fpath,fname);CHKERRQ(ierr); 4508c0b561eSLisandro Dalcin 451e5c89e4eSSatish Balay fd = fopen(fname,"r"); 452ad38b122SPatrick Sanan ierr = PetscTestDirectory(fname,'r',&isdir);CHKERRQ(ierr); 453ad38b122SPatrick Sanan if (isdir && require) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_USER,"Specified options file %s is a directory",fname); 454ad38b122SPatrick Sanan if (fd && !isdir) { 4553a018368SJed Brown PetscSegBuffer vseg,aseg; 4563a018368SJed Brown ierr = PetscSegBufferCreate(1,4000,&vseg);CHKERRQ(ierr); 4573a018368SJed Brown ierr = PetscSegBufferCreate(1,2000,&aseg);CHKERRQ(ierr); 4583a018368SJed Brown 4599b754dc9SBarry Smith /* the following line will not work when opening initial files (like .petscrc) since info is not yet set */ 46002c9f0b5SLisandro Dalcin ierr = PetscInfo1(NULL,"Opened options file %s\n",file);CHKERRQ(ierr); 461e24ecc5dSJed Brown 4625fa91da5SBarry Smith while ((string = Petscgetline(fd))) { 4634704e885SBarry Smith /* eliminate comments from each line */ 464581bbe83SVaclav Hapla ierr = PetscStrchr(string,cmt,&cmatch);CHKERRQ(ierr); 46590f79514SSatish Balay if (cmatch) *cmatch = 0; 466e5c89e4eSSatish Balay ierr = PetscStrlen(string,&len);CHKERRQ(ierr); 4675981331cSSatish Balay /* replace tabs, ^M, \n with " " */ 468e5c89e4eSSatish Balay for (i=0; i<len; i++) { 4695981331cSSatish Balay if (string[i] == '\t' || string[i] == '\r' || string[i] == '\n') { 470e5c89e4eSSatish Balay string[i] = ' '; 471e5c89e4eSSatish Balay } 472e5c89e4eSSatish Balay } 47390f79514SSatish Balay ierr = PetscTokenCreate(string,' ',&token);CHKERRQ(ierr); 4747fb43599SVaclav Hapla ierr = PetscTokenFind(token,&tokens[0]);CHKERRQ(ierr); 4757fb43599SVaclav Hapla if (!tokens[0]) { 47602b0d46eSSatish Balay goto destroy; 4777fb43599SVaclav Hapla } else if (!tokens[0][0]) { /* if token 0 is empty (string begins with spaces), redo */ 4787fb43599SVaclav Hapla ierr = PetscTokenFind(token,&tokens[0]);CHKERRQ(ierr); 47990f79514SSatish Balay } 4807fb43599SVaclav Hapla for (i=1; i<4; i++) { 4817fb43599SVaclav Hapla ierr = PetscTokenFind(token,&tokens[i]);CHKERRQ(ierr); 4827fb43599SVaclav Hapla } 4837fb43599SVaclav Hapla if (!tokens[0]) { 4842662f744SSatish Balay goto destroy; 4857fb43599SVaclav Hapla } else if (tokens[0][0] == '-') { 4869210b8eaSVaclav Hapla ierr = PetscOptionsValidKey(tokens[0],&valid);CHKERRQ(ierr); 4879210b8eaSVaclav 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]); 4887fb43599SVaclav Hapla ierr = PetscStrlen(tokens[0],&len);CHKERRQ(ierr); 48913e3f751SJed Brown ierr = PetscSegBufferGet(vseg,len+1,&vstring);CHKERRQ(ierr); 4907fb43599SVaclav Hapla ierr = PetscArraycpy(vstring,tokens[0],len);CHKERRQ(ierr); 491e24ecc5dSJed Brown vstring[len] = ' '; 4927fb43599SVaclav Hapla if (tokens[1]) { 4939210b8eaSVaclav Hapla ierr = PetscOptionsValidKey(tokens[1],&valid);CHKERRQ(ierr); 4949210b8eaSVaclav 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]); 4957fb43599SVaclav Hapla ierr = PetscStrlen(tokens[1],&len);CHKERRQ(ierr); 49613e3f751SJed Brown ierr = PetscSegBufferGet(vseg,len+3,&vstring);CHKERRQ(ierr); 497e24ecc5dSJed Brown vstring[0] = '"'; 4987fb43599SVaclav Hapla ierr = PetscArraycpy(vstring+1,tokens[1],len);CHKERRQ(ierr); 499e24ecc5dSJed Brown vstring[len+1] = '"'; 500e24ecc5dSJed Brown vstring[len+2] = ' '; 50109192fe3SBarry Smith } 50290f79514SSatish Balay } else { 5039210b8eaSVaclav Hapla ierr = PetscStrcasecmp(tokens[0],"alias",&alias);CHKERRQ(ierr); 5049210b8eaSVaclav Hapla if (alias) { 5059210b8eaSVaclav Hapla ierr = PetscOptionsValidKey(tokens[1],&valid);CHKERRQ(ierr); 5069210b8eaSVaclav 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]); 5079210b8eaSVaclav 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]); 5089210b8eaSVaclav Hapla ierr = PetscOptionsValidKey(tokens[2],&valid);CHKERRQ(ierr); 5099210b8eaSVaclav 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]); 5107fb43599SVaclav Hapla ierr = PetscStrlen(tokens[1],&len);CHKERRQ(ierr); 51113e3f751SJed Brown ierr = PetscSegBufferGet(aseg,len+1,&astring);CHKERRQ(ierr); 5127fb43599SVaclav Hapla ierr = PetscArraycpy(astring,tokens[1],len);CHKERRQ(ierr); 513e24ecc5dSJed Brown astring[len] = ' '; 514e24ecc5dSJed Brown 5157fb43599SVaclav Hapla ierr = PetscStrlen(tokens[2],&len);CHKERRQ(ierr); 51613e3f751SJed Brown ierr = PetscSegBufferGet(aseg,len+1,&astring);CHKERRQ(ierr); 5177fb43599SVaclav Hapla ierr = PetscArraycpy(astring,tokens[2],len);CHKERRQ(ierr); 518e24ecc5dSJed Brown astring[len] = ' '; 5199210b8eaSVaclav Hapla } else SETERRQ3(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Unknown first token in options file %s line %D: %s",fname,line,tokens[0]); 5209210b8eaSVaclav Hapla } 5219210b8eaSVaclav Hapla { 5229210b8eaSVaclav Hapla const char *extraToken = alias ? tokens[3] : tokens[2]; 5239210b8eaSVaclav Hapla if (extraToken) SETERRQ3(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Error in options file %s line %D: extra token %s",fname,line,extraToken); 524e5c89e4eSSatish Balay } 52502b0d46eSSatish Balay destroy: 5264b40f50bSBarry Smith free(string); 5278c74ee41SBarry Smith ierr = PetscTokenDestroy(&token);CHKERRQ(ierr); 5289210b8eaSVaclav Hapla alias = PETSC_FALSE; 5299210b8eaSVaclav Hapla line++; 530e5c89e4eSSatish Balay } 531ed9cf6e9SBarry Smith err = fclose(fd); 5329210b8eaSVaclav Hapla if (err) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SYS,"fclose() failed on file %s",fname); 533e24ecc5dSJed Brown ierr = PetscSegBufferGetSize(aseg,&bytes);CHKERRQ(ierr); /* size without null termination */ 534e24ecc5dSJed Brown ierr = PetscMPIIntCast(bytes,&acnt);CHKERRQ(ierr); 535e24ecc5dSJed Brown ierr = PetscSegBufferGet(aseg,1,&astring);CHKERRQ(ierr); 536e24ecc5dSJed Brown astring[0] = 0; 537e24ecc5dSJed Brown ierr = PetscSegBufferGetSize(vseg,&bytes);CHKERRQ(ierr); /* size without null termination */ 538e24ecc5dSJed Brown ierr = PetscMPIIntCast(bytes,&cnt);CHKERRQ(ierr); 539e24ecc5dSJed Brown ierr = PetscSegBufferGet(vseg,1,&vstring);CHKERRQ(ierr); 540e24ecc5dSJed Brown vstring[0] = 0; 541854ce69bSBarry Smith ierr = PetscMalloc1(2+acnt+cnt,&packed);CHKERRQ(ierr); 5423a018368SJed Brown ierr = PetscSegBufferExtractTo(aseg,packed);CHKERRQ(ierr); 5433a018368SJed Brown ierr = PetscSegBufferExtractTo(vseg,packed+acnt+1);CHKERRQ(ierr); 5443a018368SJed Brown ierr = PetscSegBufferDestroy(&aseg);CHKERRQ(ierr); 5453a018368SJed Brown ierr = PetscSegBufferDestroy(&vseg);CHKERRQ(ierr); 5469210b8eaSVaclav Hapla } else if (require) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_USER,"Unable to open options file %s",fname); 5479b754dc9SBarry Smith } 54805c7dedfSBarry Smith 5493a018368SJed Brown counts[0] = acnt; 5503a018368SJed Brown counts[1] = cnt; 5514201f521SBarry Smith err = MPI_Bcast(counts,2,MPI_INT,0,comm); 5524201f521SBarry 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"); 5533a018368SJed Brown acnt = counts[0]; 5543a018368SJed Brown cnt = counts[1]; 5553a018368SJed Brown if (rank) { 556854ce69bSBarry Smith ierr = PetscMalloc1(2+acnt+cnt,&packed);CHKERRQ(ierr); 5573a018368SJed Brown } 5583a018368SJed Brown if (acnt || cnt) { 559ffc4695bSBarry Smith ierr = MPI_Bcast(packed,2+acnt+cnt,MPI_CHAR,0,comm);CHKERRMPI(ierr); 5603a018368SJed Brown astring = packed; 5613a018368SJed Brown vstring = packed + acnt + 1; 5623a018368SJed Brown } 5633a018368SJed Brown 5649b754dc9SBarry Smith if (acnt) { 5659b754dc9SBarry Smith ierr = PetscTokenCreate(astring,' ',&token);CHKERRQ(ierr); 5667fb43599SVaclav Hapla ierr = PetscTokenFind(token,&tokens[0]);CHKERRQ(ierr); 5677fb43599SVaclav Hapla while (tokens[0]) { 5687fb43599SVaclav Hapla ierr = PetscTokenFind(token,&tokens[1]);CHKERRQ(ierr); 5697fb43599SVaclav Hapla ierr = PetscOptionsSetAlias(options,tokens[0],tokens[1]);CHKERRQ(ierr); 5707fb43599SVaclav Hapla ierr = PetscTokenFind(token,&tokens[0]);CHKERRQ(ierr); 5719b754dc9SBarry Smith } 5728c74ee41SBarry Smith ierr = PetscTokenDestroy(&token);CHKERRQ(ierr); 5739b754dc9SBarry Smith } 5749b754dc9SBarry Smith 5759b754dc9SBarry Smith if (cnt) { 576c5929fdfSBarry Smith ierr = PetscOptionsInsertString(options,vstring);CHKERRQ(ierr); 577e5c89e4eSSatish Balay } 5783a018368SJed Brown ierr = PetscFree(packed);CHKERRQ(ierr); 579e5c89e4eSSatish Balay PetscFunctionReturn(0); 580e5c89e4eSSatish Balay } 581e5c89e4eSSatish Balay 5822d747510SLisandro Dalcin static PetscErrorCode PetscOptionsInsertArgs(PetscOptions options,int argc,char *args[]) 58385079163SJed Brown { 58485079163SJed Brown PetscErrorCode ierr; 58585079163SJed Brown int left = argc - 1; 58685079163SJed Brown char **eargs = args + 1; 58785079163SJed Brown 58885079163SJed Brown PetscFunctionBegin; 58985079163SJed Brown while (left) { 5906b94a84bSLisandro Dalcin PetscBool isoptions_file,isprefixpush,isprefixpop,key; 59185079163SJed Brown ierr = PetscStrcasecmp(eargs[0],"-options_file",&isoptions_file);CHKERRQ(ierr); 5929db968c8SJed Brown ierr = PetscStrcasecmp(eargs[0],"-prefix_push",&isprefixpush);CHKERRQ(ierr); 5939db968c8SJed Brown ierr = PetscStrcasecmp(eargs[0],"-prefix_pop",&isprefixpop);CHKERRQ(ierr); 594093de6efSBarry Smith ierr = PetscOptionsValidKey(eargs[0],&key);CHKERRQ(ierr); 595093de6efSBarry Smith if (!key) { 59685079163SJed Brown eargs++; left--; 59785079163SJed Brown } else if (isoptions_file) { 59885079163SJed Brown if (left <= 1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_USER,"Missing filename for -options_file filename option"); 59985079163SJed Brown if (eargs[1][0] == '-') SETERRQ(PETSC_COMM_SELF,PETSC_ERR_USER,"Missing filename for -options_file filename option"); 600c5929fdfSBarry Smith ierr = PetscOptionsInsertFile(PETSC_COMM_WORLD,options,eargs[1],PETSC_TRUE);CHKERRQ(ierr); 60185079163SJed Brown eargs += 2; left -= 2; 6029db968c8SJed Brown } else if (isprefixpush) { 6039db968c8SJed Brown if (left <= 1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_USER,"Missing prefix for -prefix_push option"); 6049db968c8SJed Brown if (eargs[1][0] == '-') SETERRQ(PETSC_COMM_SELF,PETSC_ERR_USER,"Missing prefix for -prefix_push option (prefixes cannot start with '-')"); 605c5929fdfSBarry Smith ierr = PetscOptionsPrefixPush(options,eargs[1]);CHKERRQ(ierr); 6069db968c8SJed Brown eargs += 2; left -= 2; 6079db968c8SJed Brown } else if (isprefixpop) { 608c5929fdfSBarry Smith ierr = PetscOptionsPrefixPop(options);CHKERRQ(ierr); 6099db968c8SJed Brown eargs++; left--; 6107935c3d8SJed Brown } else { 6117935c3d8SJed Brown PetscBool nextiskey = PETSC_FALSE; 6127935c3d8SJed Brown if (left >= 2) {ierr = PetscOptionsValidKey(eargs[1],&nextiskey);CHKERRQ(ierr);} 61398b6bf53SJed Brown if (left < 2 || nextiskey) { 614c5929fdfSBarry Smith ierr = PetscOptionsSetValue(options,eargs[0],NULL);CHKERRQ(ierr); 61585079163SJed Brown eargs++; left--; 61685079163SJed Brown } else { 617c5929fdfSBarry Smith ierr = PetscOptionsSetValue(options,eargs[0],eargs[1]);CHKERRQ(ierr); 61885079163SJed Brown eargs += 2; left -= 2; 61985079163SJed Brown } 62085079163SJed Brown } 6217935c3d8SJed Brown } 62285079163SJed Brown PetscFunctionReturn(0); 62385079163SJed Brown } 62485079163SJed Brown 625c5b5d8d5SVaclav Hapla PETSC_STATIC_INLINE PetscErrorCode PetscOptionsStringToBoolIfSet_Private(enum PetscPrecedentOption opt,const char *val[],PetscBool set[],PetscBool *flg) 626c5b5d8d5SVaclav Hapla { 627c5b5d8d5SVaclav Hapla PetscErrorCode ierr; 628c5b5d8d5SVaclav Hapla 629c5b5d8d5SVaclav Hapla PetscFunctionBegin; 630c5b5d8d5SVaclav Hapla if (set[opt]) { 631c5b5d8d5SVaclav Hapla ierr = PetscOptionsStringToBool(val[opt],flg);CHKERRQ(ierr); 632c5b5d8d5SVaclav Hapla } else *flg = PETSC_FALSE; 633c5b5d8d5SVaclav Hapla PetscFunctionReturn(0); 634c5b5d8d5SVaclav Hapla } 635c5b5d8d5SVaclav Hapla 636c5b5d8d5SVaclav Hapla /* Process options with absolute precedence */ 637c5b5d8d5SVaclav Hapla static PetscErrorCode PetscOptionsProcessPrecedentFlags(PetscOptions options,int argc,char *args[],PetscBool *skip_petscrc,PetscBool *skip_petscrc_set) 638c5b5d8d5SVaclav Hapla { 639c5b5d8d5SVaclav Hapla const char* const *opt = precedentOptions; 640c5b5d8d5SVaclav Hapla const size_t n = PO_NUM; 641c5b5d8d5SVaclav Hapla size_t o; 642c5b5d8d5SVaclav Hapla int a; 643c5b5d8d5SVaclav Hapla const char **val; 644c5b5d8d5SVaclav Hapla PetscBool *set; 645c5b5d8d5SVaclav Hapla PetscErrorCode ierr; 646c5b5d8d5SVaclav Hapla 647c5b5d8d5SVaclav Hapla PetscFunctionBegin; 648c5b5d8d5SVaclav Hapla ierr = PetscCalloc2(n,&val,n,&set);CHKERRQ(ierr); 649c5b5d8d5SVaclav Hapla 650c5b5d8d5SVaclav Hapla /* Look for options possibly set using PetscOptionsSetValue beforehand */ 651c5b5d8d5SVaclav Hapla for (o=0; o<n; o++) { 652c5b5d8d5SVaclav Hapla ierr = PetscOptionsFindPair(options,NULL,opt[o],&val[o],&set[o]);CHKERRQ(ierr); 653c5b5d8d5SVaclav Hapla } 654c5b5d8d5SVaclav Hapla 655c5b5d8d5SVaclav Hapla /* Loop through all args to collect last occuring value of each option */ 656c5b5d8d5SVaclav Hapla for (a=1; a<argc; a++) { 657c5b5d8d5SVaclav Hapla PetscBool valid, eq; 658c5b5d8d5SVaclav Hapla 659c5b5d8d5SVaclav Hapla ierr = PetscOptionsValidKey(args[a],&valid);CHKERRQ(ierr); 660c5b5d8d5SVaclav Hapla if (!valid) continue; 661c5b5d8d5SVaclav Hapla for (o=0; o<n; o++) { 662c5b5d8d5SVaclav Hapla ierr = PetscStrcasecmp(args[a],opt[o],&eq);CHKERRQ(ierr); 663c5b5d8d5SVaclav Hapla if (eq) { 664c5b5d8d5SVaclav Hapla set[o] = PETSC_TRUE; 665c5b5d8d5SVaclav Hapla if (a == argc-1 || !args[a+1] || !args[a+1][0] || args[a+1][0] == '-') val[o] = NULL; 666c5b5d8d5SVaclav Hapla else val[o] = args[a+1]; 667c5b5d8d5SVaclav Hapla break; 668c5b5d8d5SVaclav Hapla } 669c5b5d8d5SVaclav Hapla } 670c5b5d8d5SVaclav Hapla } 671c5b5d8d5SVaclav Hapla 672c5b5d8d5SVaclav Hapla /* Process flags */ 673d314f959SVaclav Hapla ierr = PetscStrcasecmp(val[PO_HELP], "intro", &options->help_intro);CHKERRQ(ierr); 674d314f959SVaclav Hapla if (options->help_intro) options->help = PETSC_TRUE; 675d314f959SVaclav Hapla else {ierr = PetscOptionsStringToBoolIfSet_Private(PO_HELP, val,set,&options->help);CHKERRQ(ierr);} 676c5b5d8d5SVaclav Hapla ierr = PetscOptionsStringToBoolIfSet_Private(PO_OPTIONS_MONITOR_CANCEL,val,set,&options->monitorCancel);CHKERRQ(ierr); 677c5b5d8d5SVaclav Hapla ierr = PetscOptionsStringToBoolIfSet_Private(PO_OPTIONS_MONITOR, val,set,&options->monitorFromOptions);CHKERRQ(ierr); 678c5b5d8d5SVaclav Hapla ierr = PetscOptionsStringToBoolIfSet_Private(PO_SKIP_PETSCRC, val,set,skip_petscrc);CHKERRQ(ierr); 679c5b5d8d5SVaclav Hapla *skip_petscrc_set = set[PO_SKIP_PETSCRC]; 680c5b5d8d5SVaclav Hapla 681c5b5d8d5SVaclav Hapla /* Store precedent options in database and mark them as used */ 682c5b5d8d5SVaclav Hapla for (o=0; o<n; o++) { 683c5b5d8d5SVaclav Hapla if (set[o]) { 684c5b5d8d5SVaclav Hapla int pos; 685c5b5d8d5SVaclav Hapla 686c5b5d8d5SVaclav Hapla ierr = PetscOptionsSetValue_Private(options,opt[o],val[o],&pos);CHKERRQ(ierr); 687c5b5d8d5SVaclav Hapla options->used[pos] = PETSC_TRUE; 688c5b5d8d5SVaclav Hapla } 689c5b5d8d5SVaclav Hapla } 690c5b5d8d5SVaclav Hapla 691c5b5d8d5SVaclav Hapla ierr = PetscFree2(val,set);CHKERRQ(ierr); 692c5b5d8d5SVaclav Hapla options->precedentProcessed = PETSC_TRUE; 693c5b5d8d5SVaclav Hapla PetscFunctionReturn(0); 694c5b5d8d5SVaclav Hapla } 695c5b5d8d5SVaclav Hapla 696c5b5d8d5SVaclav Hapla PETSC_STATIC_INLINE PetscErrorCode PetscOptionsSkipPrecedent(PetscOptions options,const char name[],PetscBool *flg) 697c5b5d8d5SVaclav Hapla { 698c5b5d8d5SVaclav Hapla int i; 699c5b5d8d5SVaclav Hapla PetscErrorCode ierr; 700c5b5d8d5SVaclav Hapla 701c5b5d8d5SVaclav Hapla *flg = PETSC_FALSE; 702c5b5d8d5SVaclav Hapla if (options->precedentProcessed) { 703c5b5d8d5SVaclav Hapla for (i=0; i<PO_NUM; i++) { 704c5b5d8d5SVaclav Hapla if (!PetscOptNameCmp(precedentOptions[i],name)) { 705c5b5d8d5SVaclav Hapla /* check if precedent option has been set already */ 706c5b5d8d5SVaclav Hapla ierr = PetscOptionsFindPair(options,NULL,name,NULL,flg);CHKERRQ(ierr); 707c5b5d8d5SVaclav Hapla if (*flg) break; 708c5b5d8d5SVaclav Hapla } 709c5b5d8d5SVaclav Hapla } 710c5b5d8d5SVaclav Hapla } 711c5b5d8d5SVaclav Hapla PetscFunctionReturn(0); 712c5b5d8d5SVaclav Hapla } 71385079163SJed Brown 714e5c89e4eSSatish Balay /*@C 715e5c89e4eSSatish Balay PetscOptionsInsert - Inserts into the options database from the command line, 716e5c89e4eSSatish Balay the environmental variable and a file. 717e5c89e4eSSatish Balay 7181c9f3c13SBarry Smith Collective on PETSC_COMM_WORLD 7191c9f3c13SBarry Smith 720e5c89e4eSSatish Balay Input Parameters: 721c5929fdfSBarry Smith + options - options database or NULL for the default global database 722c5929fdfSBarry Smith . argc - count of number of command line arguments 723e5c89e4eSSatish Balay . args - the command line arguments 724c5b5d8d5SVaclav Hapla - file - [optional] PETSc database file, also checks ~/.petscrc, .petscrc and petscrc. 725c5b5d8d5SVaclav Hapla Use NULL to not check for code specific file. 726c5b5d8d5SVaclav Hapla Use -skip_petscrc in the code specific file (or command line) to skip ~/.petscrc, .petscrc and petscrc files. 727e5c89e4eSSatish Balay 728e5c89e4eSSatish Balay Note: 729e5c89e4eSSatish Balay Since PetscOptionsInsert() is automatically called by PetscInitialize(), 730e5c89e4eSSatish Balay the user does not typically need to call this routine. PetscOptionsInsert() 731e5c89e4eSSatish Balay can be called several times, adding additional entries into the database. 732e5c89e4eSSatish Balay 733081c24baSBoyana Norris Options Database Keys: 734c5b5d8d5SVaclav Hapla . -options_file <filename> - read options from a file 735c5b5d8d5SVaclav Hapla 736c5b5d8d5SVaclav Hapla See PetscInitialize() for options related to option database monitoring. 737081c24baSBoyana Norris 738e5c89e4eSSatish Balay Level: advanced 739e5c89e4eSSatish Balay 7402d747510SLisandro Dalcin .seealso: PetscOptionsDestroy(), PetscOptionsView(), PetscOptionsInsertString(), PetscOptionsInsertFile(), 74196fc60bcSBarry Smith PetscInitialize() 742e5c89e4eSSatish Balay @*/ 743c5929fdfSBarry Smith PetscErrorCode PetscOptionsInsert(PetscOptions options,int *argc,char ***args,const char file[]) 744e5c89e4eSSatish Balay { 745e5c89e4eSSatish Balay PetscErrorCode ierr; 746e5c89e4eSSatish Balay PetscMPIInt rank; 7472d747510SLisandro Dalcin char filename[PETSC_MAX_PATH_LEN]; 748c5b5d8d5SVaclav Hapla PetscBool hasArgs = (argc && *argc) ? PETSC_TRUE : PETSC_FALSE; 749c5b5d8d5SVaclav Hapla PetscBool skipPetscrc = PETSC_FALSE, skipPetscrcSet = PETSC_FALSE; 750e5c89e4eSSatish Balay 7518dea33a6SBarry Smith 752e5c89e4eSSatish Balay PetscFunctionBegin; 753c5b5d8d5SVaclav Hapla if (hasArgs && !(args && *args)) SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ARG_NULL, "*argc > 1 but *args not given"); 754ffc4695bSBarry Smith ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRMPI(ierr); 755e5c89e4eSSatish Balay 756c5b5d8d5SVaclav Hapla if (!options) { 757c5b5d8d5SVaclav Hapla ierr = PetscOptionsCreateDefault();CHKERRQ(ierr); 758c5b5d8d5SVaclav Hapla options = defaultoptions; 759c5b5d8d5SVaclav Hapla } 760c5b5d8d5SVaclav Hapla if (hasArgs) { 761c5b5d8d5SVaclav Hapla /* process options with absolute precedence */ 762c5b5d8d5SVaclav Hapla ierr = PetscOptionsProcessPrecedentFlags(options,*argc,*args,&skipPetscrc,&skipPetscrcSet);CHKERRQ(ierr); 763c5b5d8d5SVaclav Hapla } 7644b09e917SBarry Smith if (file && file[0]) { 7652d747510SLisandro Dalcin ierr = PetscStrreplace(PETSC_COMM_WORLD,file,filename,PETSC_MAX_PATH_LEN);CHKERRQ(ierr); 7662d747510SLisandro Dalcin ierr = PetscOptionsInsertFile(PETSC_COMM_WORLD,options,filename,PETSC_TRUE);CHKERRQ(ierr); 767c5b5d8d5SVaclav Hapla /* if -skip_petscrc has not been set from command line, check whether it has been set in the file */ 768c5b5d8d5SVaclav Hapla if (!skipPetscrcSet) {ierr = PetscOptionsGetBool(options,NULL,"-skip_petscrc",&skipPetscrc,NULL);CHKERRQ(ierr);} 769321366bcSBarry Smith } 770c5b5d8d5SVaclav Hapla if (!skipPetscrc) { 7712d747510SLisandro Dalcin ierr = PetscGetHomeDirectory(filename,PETSC_MAX_PATH_LEN-16);CHKERRQ(ierr); 7721ea3218fSSatish Balay /* PetscOptionsInsertFile() does a fopen() on rank0 only - so only rank0 HomeDir value is relavent */ 7732d747510SLisandro Dalcin if (filename[0]) { ierr = PetscStrcat(filename,"/.petscrc");CHKERRQ(ierr); } 7742d747510SLisandro Dalcin ierr = PetscOptionsInsertFile(PETSC_COMM_WORLD,options,filename,PETSC_FALSE);CHKERRQ(ierr); 775c5929fdfSBarry Smith ierr = PetscOptionsInsertFile(PETSC_COMM_WORLD,options,".petscrc",PETSC_FALSE);CHKERRQ(ierr); 776c5929fdfSBarry Smith ierr = PetscOptionsInsertFile(PETSC_COMM_WORLD,options,"petscrc",PETSC_FALSE);CHKERRQ(ierr); 777e5c89e4eSSatish Balay } 778e5c89e4eSSatish Balay 7792d747510SLisandro Dalcin /* insert environment options */ 780e5c89e4eSSatish Balay { 7812d747510SLisandro Dalcin char *eoptions = NULL; 782e5c89e4eSSatish Balay size_t len = 0; 783e5c89e4eSSatish Balay if (!rank) { 784e5c89e4eSSatish Balay eoptions = (char*)getenv("PETSC_OPTIONS"); 785e5c89e4eSSatish Balay ierr = PetscStrlen(eoptions,&len);CHKERRQ(ierr); 78676434e50SSatish Balay ierr = MPI_Bcast(&len,1,MPIU_SIZE_T,0,PETSC_COMM_WORLD);CHKERRQ(ierr); 787e5c89e4eSSatish Balay } else { 788ffc4695bSBarry Smith ierr = MPI_Bcast(&len,1,MPIU_SIZE_T,0,PETSC_COMM_WORLD);CHKERRMPI(ierr); 789e5c89e4eSSatish Balay if (len) { 790854ce69bSBarry Smith ierr = PetscMalloc1(len+1,&eoptions);CHKERRQ(ierr); 791e5c89e4eSSatish Balay } 792e5c89e4eSSatish Balay } 793e5c89e4eSSatish Balay if (len) { 794ffc4695bSBarry Smith ierr = MPI_Bcast(eoptions,len,MPI_CHAR,0,PETSC_COMM_WORLD);CHKERRMPI(ierr); 79596fc60bcSBarry Smith if (rank) eoptions[len] = 0; 796c5929fdfSBarry Smith ierr = PetscOptionsInsertString(options,eoptions);CHKERRQ(ierr); 797e5c89e4eSSatish Balay if (rank) {ierr = PetscFree(eoptions);CHKERRQ(ierr);} 798e5c89e4eSSatish Balay } 799e5c89e4eSSatish Balay } 800e5c89e4eSSatish Balay 80156a31166SBarry Smith { 8029fc438c3SToby Isaac char *eoptions = NULL; 8039fc438c3SToby Isaac size_t len = 0; 8049fc438c3SToby Isaac if (!rank) { 8059fc438c3SToby Isaac eoptions = (char*)getenv("PETSC_OPTIONS_YAML"); 8069fc438c3SToby Isaac ierr = PetscStrlen(eoptions,&len);CHKERRQ(ierr); 8079fc438c3SToby Isaac ierr = MPI_Bcast(&len,1,MPIU_SIZE_T,0,PETSC_COMM_WORLD);CHKERRQ(ierr); 8089fc438c3SToby Isaac } else { 809ffc4695bSBarry Smith ierr = MPI_Bcast(&len,1,MPIU_SIZE_T,0,PETSC_COMM_WORLD);CHKERRMPI(ierr); 8109fc438c3SToby Isaac if (len) { 8119fc438c3SToby Isaac ierr = PetscMalloc1(len+1,&eoptions);CHKERRQ(ierr); 8129fc438c3SToby Isaac } 8139fc438c3SToby Isaac } 8149fc438c3SToby Isaac if (len) { 815ffc4695bSBarry Smith ierr = MPI_Bcast(eoptions,len,MPI_CHAR,0,PETSC_COMM_WORLD);CHKERRMPI(ierr); 8169fc438c3SToby Isaac if (rank) eoptions[len] = 0; 8179fc438c3SToby Isaac ierr = PetscOptionsInsertStringYAML(options,eoptions);CHKERRQ(ierr); 8189fc438c3SToby Isaac if (rank) {ierr = PetscFree(eoptions);CHKERRQ(ierr);} 8199fc438c3SToby Isaac } 8209fc438c3SToby Isaac } 8219fc438c3SToby Isaac { 8223bcbd388SSean Farley char yaml_file[PETSC_MAX_PATH_LEN]; 823080f0011SToby Isaac char yaml_string[BUFSIZ]; 82456a31166SBarry Smith PetscBool yaml_flg; 825589a23caSBarry Smith ierr = PetscOptionsGetString(NULL,NULL,"-options_file_yaml",yaml_file,sizeof(yaml_file),&yaml_flg);CHKERRQ(ierr); 82656a31166SBarry Smith if (yaml_flg) { 8275c23ca1cSLisandro Dalcin ierr = PetscOptionsInsertFileYAML(PETSC_COMM_WORLD,options,yaml_file,PETSC_TRUE);CHKERRQ(ierr); 82856a31166SBarry Smith } 829589a23caSBarry Smith ierr = PetscOptionsGetString(NULL,NULL,"-options_string_yaml",yaml_string,sizeof(yaml_string),&yaml_flg);CHKERRQ(ierr); 830080f0011SToby Isaac if (yaml_flg) { 8315c23ca1cSLisandro Dalcin ierr = PetscOptionsInsertStringYAML(options,yaml_string);CHKERRQ(ierr); 832080f0011SToby Isaac } 83356a31166SBarry Smith } 8343bcbd388SSean Farley 835c5b5d8d5SVaclav Hapla /* insert command line options here because they take precedence over arguments in petscrc/environment */ 836c5b5d8d5SVaclav Hapla if (hasArgs) {ierr = PetscOptionsInsertArgs(options,*argc,*args);CHKERRQ(ierr);} 837e5c89e4eSSatish Balay PetscFunctionReturn(0); 838e5c89e4eSSatish Balay } 839e5c89e4eSSatish Balay 840e5c89e4eSSatish Balay /*@C 84188c29154SBarry Smith PetscOptionsView - Prints the options that have been loaded. This is 842e5c89e4eSSatish Balay useful for debugging purposes. 843e5c89e4eSSatish Balay 844c139c21fSBarry Smith Logically Collective on PetscViewer 845e5c89e4eSSatish Balay 846e5c89e4eSSatish Balay Input Parameter: 847a2b725a8SWilliam Gropp + options - options database, use NULL for default global database 848a2b725a8SWilliam Gropp - viewer - must be an PETSCVIEWERASCII viewer 849e5c89e4eSSatish Balay 850e5c89e4eSSatish Balay Options Database Key: 85126a7e8d4SBarry Smith . -options_view - Activates PetscOptionsView() within PetscFinalize() 852e5c89e4eSSatish Balay 8539666a313SBarry Smith Notes: 8549666a313SBarry Smith Only the rank zero process of MPI_Comm used to create view prints the option values. Other processes 8551c9f3c13SBarry Smith may have different values but they are not printed. 8561c9f3c13SBarry Smith 857e5c89e4eSSatish Balay Level: advanced 858e5c89e4eSSatish Balay 859e5c89e4eSSatish Balay .seealso: PetscOptionsAllUsed() 860e5c89e4eSSatish Balay @*/ 861c5929fdfSBarry Smith PetscErrorCode PetscOptionsView(PetscOptions options,PetscViewer viewer) 862e5c89e4eSSatish Balay { 863e5c89e4eSSatish Balay PetscErrorCode ierr; 864431c96f7SBarry Smith PetscInt i; 86588c29154SBarry Smith PetscBool isascii; 866e5c89e4eSSatish Balay 867e5c89e4eSSatish Balay PetscFunctionBegin; 8682d747510SLisandro Dalcin if (viewer) PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2); 869c5929fdfSBarry Smith options = options ? options : defaultoptions; 87088c29154SBarry Smith if (!viewer) viewer = PETSC_VIEWER_STDOUT_WORLD; 871251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&isascii);CHKERRQ(ierr); 872ce94432eSBarry Smith if (!isascii) SETERRQ(PetscObjectComm((PetscObject)viewer),PETSC_ERR_SUP,"Only supports ASCII viewer"); 87388c29154SBarry Smith 8742d747510SLisandro Dalcin if (!options->N) { 87588c29154SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"#No PETSc Option Table entries\n");CHKERRQ(ierr); 8762d747510SLisandro Dalcin PetscFunctionReturn(0); 87730694fe9SBarry Smith } 8782d747510SLisandro Dalcin 8792d747510SLisandro Dalcin ierr = PetscViewerASCIIPrintf(viewer,"#PETSc Option Table entries:\n");CHKERRQ(ierr); 880e5c89e4eSSatish Balay for (i=0; i<options->N; i++) { 881e5c89e4eSSatish Balay if (options->values[i]) { 88288c29154SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"-%s %s\n",options->names[i],options->values[i]);CHKERRQ(ierr); 883e5c89e4eSSatish Balay } else { 88488c29154SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"-%s\n",options->names[i]);CHKERRQ(ierr); 885e5c89e4eSSatish Balay } 886e5c89e4eSSatish Balay } 88788c29154SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"#End of PETSc Option Table entries\n");CHKERRQ(ierr); 888e5c89e4eSSatish Balay PetscFunctionReturn(0); 889e5c89e4eSSatish Balay } 890e5c89e4eSSatish Balay 891e11779c2SBarry Smith /* 892e11779c2SBarry Smith Called by error handlers to print options used in run 893e11779c2SBarry Smith */ 89495c0884eSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscOptionsViewError(void) 895e11779c2SBarry Smith { 896e11779c2SBarry Smith PetscInt i; 8974416b707SBarry Smith PetscOptions options = defaultoptions; 898e11779c2SBarry Smith 899e11779c2SBarry Smith PetscFunctionBegin; 900e11779c2SBarry Smith if (options->N) { 901e11779c2SBarry Smith (*PetscErrorPrintf)("PETSc Option Table entries:\n"); 902e11779c2SBarry Smith } else { 903e11779c2SBarry Smith (*PetscErrorPrintf)("No PETSc Option Table entries\n"); 904e11779c2SBarry Smith } 905e11779c2SBarry Smith for (i=0; i<options->N; i++) { 906e11779c2SBarry Smith if (options->values[i]) { 907e11779c2SBarry Smith (*PetscErrorPrintf)("-%s %s\n",options->names[i],options->values[i]); 908e11779c2SBarry Smith } else { 909e11779c2SBarry Smith (*PetscErrorPrintf)("-%s\n",options->names[i]); 910e11779c2SBarry Smith } 911e11779c2SBarry Smith } 912e11779c2SBarry Smith PetscFunctionReturn(0); 913e11779c2SBarry Smith } 914e11779c2SBarry Smith 915e5c89e4eSSatish Balay /*@C 91674e0666dSJed Brown PetscOptionsPrefixPush - Designate a prefix to be used by all options insertions to follow. 91774e0666dSJed Brown 9181c9f3c13SBarry Smith Logically Collective 91974e0666dSJed Brown 9209db968c8SJed Brown Input Parameter: 921c5929fdfSBarry Smith + options - options database, or NULL for the default global database 922c5929fdfSBarry Smith - prefix - The string to append to the existing prefix 9239db968c8SJed Brown 9249db968c8SJed Brown Options Database Keys: 9259db968c8SJed Brown + -prefix_push <some_prefix_> - push the given prefix 9269db968c8SJed Brown - -prefix_pop - pop the last prefix 9279db968c8SJed Brown 9289db968c8SJed Brown Notes: 9299db968c8SJed Brown It is common to use this in conjunction with -options_file as in 9309db968c8SJed Brown 9319db968c8SJed Brown $ -prefix_push system1_ -options_file system1rc -prefix_pop -prefix_push system2_ -options_file system2rc -prefix_pop 9329db968c8SJed Brown 9339db968c8SJed Brown where the files no longer require all options to be prefixed with -system2_. 93474e0666dSJed Brown 9359666a313SBarry Smith The collectivity of this routine is complex; only the MPI processes that call this routine will 9361c9f3c13SBarry Smith have the affect of these options. If some processes that create objects call this routine and others do 9371c9f3c13SBarry Smith not the code may fail in complicated ways because the same parallel solvers may incorrectly use different options 9381c9f3c13SBarry Smith on different ranks. 9391c9f3c13SBarry Smith 94074e0666dSJed Brown Level: advanced 94174e0666dSJed Brown 9421c9f3c13SBarry Smith .seealso: PetscOptionsPrefixPop(), PetscOptionsPush(), PetscOptionsPop(), PetscOptionsCreate(), PetscOptionsSetValue() 94374e0666dSJed Brown @*/ 944c5929fdfSBarry Smith PetscErrorCode PetscOptionsPrefixPush(PetscOptions options,const char prefix[]) 94574e0666dSJed Brown { 94674e0666dSJed Brown PetscErrorCode ierr; 94774e0666dSJed Brown size_t n; 94874e0666dSJed Brown PetscInt start; 9492d747510SLisandro Dalcin char key[MAXOPTNAME+1]; 9502d747510SLisandro Dalcin PetscBool valid; 95174e0666dSJed Brown 95274e0666dSJed Brown PetscFunctionBegin; 9539db968c8SJed Brown PetscValidCharPointer(prefix,1); 954c5929fdfSBarry Smith options = options ? options : defaultoptions; 95574e0666dSJed 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); 9562d747510SLisandro Dalcin key[0] = '-'; /* keys must start with '-' */ 9572d747510SLisandro Dalcin ierr = PetscStrncpy(key+1,prefix,sizeof(key)-1);CHKERRQ(ierr); 9582d747510SLisandro Dalcin ierr = PetscOptionsValidKey(key,&valid);CHKERRQ(ierr); 9598bf569ecSLisandro 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 */ 9608bf569ecSLisandro 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":""); 96174e0666dSJed Brown start = options->prefixind ? options->prefixstack[options->prefixind-1] : 0; 96274e0666dSJed Brown ierr = PetscStrlen(prefix,&n);CHKERRQ(ierr); 96374e0666dSJed Brown if (n+1 > sizeof(options->prefix)-start) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Maximum prefix length %d exceeded",sizeof(options->prefix)); 964580bdb30SBarry Smith ierr = PetscArraycpy(options->prefix+start,prefix,n+1);CHKERRQ(ierr); 96574e0666dSJed Brown options->prefixstack[options->prefixind++] = start+n; 96674e0666dSJed Brown PetscFunctionReturn(0); 96774e0666dSJed Brown } 96874e0666dSJed Brown 969c5929fdfSBarry Smith /*@C 97074e0666dSJed Brown PetscOptionsPrefixPop - Remove the latest options prefix, see PetscOptionsPrefixPush() for details 97174e0666dSJed Brown 9721c9f3c13SBarry Smith Logically Collective on the MPI_Comm that called PetscOptionsPrefixPush() 97374e0666dSJed Brown 974c5929fdfSBarry Smith Input Parameters: 975c5929fdfSBarry Smith . options - options database, or NULL for the default global database 976c5929fdfSBarry Smith 97774e0666dSJed Brown Level: advanced 97874e0666dSJed Brown 9791c9f3c13SBarry Smith .seealso: PetscOptionsPrefixPush(), PetscOptionsPush(), PetscOptionsPop(), PetscOptionsCreate(), PetscOptionsSetValue() 98074e0666dSJed Brown @*/ 981c5929fdfSBarry Smith PetscErrorCode PetscOptionsPrefixPop(PetscOptions options) 98274e0666dSJed Brown { 98374e0666dSJed Brown PetscInt offset; 98474e0666dSJed Brown 98574e0666dSJed Brown PetscFunctionBegin; 986c5929fdfSBarry Smith options = options ? options : defaultoptions; 98774e0666dSJed Brown if (options->prefixind < 1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"More prefixes popped than pushed"); 98874e0666dSJed Brown options->prefixind--; 98974e0666dSJed Brown offset = options->prefixind ? options->prefixstack[options->prefixind-1] : 0; 99074e0666dSJed Brown options->prefix[offset] = 0; 99174e0666dSJed Brown PetscFunctionReturn(0); 99274e0666dSJed Brown } 99374e0666dSJed Brown 994a542b6e8SBarry Smith /*@C 995a542b6e8SBarry Smith PetscOptionsClear - Removes all options form the database leaving it empty. 996a542b6e8SBarry Smith 9971c9f3c13SBarry Smith Logically Collective 9981c9f3c13SBarry Smith 999c5929fdfSBarry Smith Input Parameters: 1000c5929fdfSBarry Smith . options - options database, use NULL for the default global database 1001c5929fdfSBarry Smith 10029666a313SBarry Smith The collectivity of this routine is complex; only the MPI processes that call this routine will 10031c9f3c13SBarry Smith have the affect of these options. If some processes that create objects call this routine and others do 10041c9f3c13SBarry Smith not the code may fail in complicated ways because the same parallel solvers may incorrectly use different options 10051c9f3c13SBarry Smith on different ranks. 10061c9f3c13SBarry Smith 1007a542b6e8SBarry Smith Level: developer 1008a542b6e8SBarry Smith 1009a542b6e8SBarry Smith .seealso: PetscOptionsInsert() 1010a542b6e8SBarry Smith @*/ 1011c5929fdfSBarry Smith PetscErrorCode PetscOptionsClear(PetscOptions options) 1012a542b6e8SBarry Smith { 1013a542b6e8SBarry Smith PetscInt i; 1014a542b6e8SBarry Smith 1015c5929fdfSBarry Smith options = options ? options : defaultoptions; 10162d747510SLisandro Dalcin if (!options) return 0; 10172d747510SLisandro Dalcin 1018a542b6e8SBarry Smith for (i=0; i<options->N; i++) { 1019a542b6e8SBarry Smith if (options->names[i]) free(options->names[i]); 1020a542b6e8SBarry Smith if (options->values[i]) free(options->values[i]); 1021a542b6e8SBarry Smith } 10222d747510SLisandro Dalcin options->N = 0; 10232d747510SLisandro Dalcin 1024a542b6e8SBarry Smith for (i=0; i<options->Naliases; i++) { 1025a542b6e8SBarry Smith free(options->aliases1[i]); 1026a542b6e8SBarry Smith free(options->aliases2[i]); 1027a542b6e8SBarry Smith } 1028a542b6e8SBarry Smith options->Naliases = 0; 1029a542b6e8SBarry Smith 10302d747510SLisandro Dalcin /* destroy hash table */ 10312d747510SLisandro Dalcin kh_destroy(HO,options->ht); 10322d747510SLisandro Dalcin options->ht = NULL; 10330eb63584SBarry Smith 10342d747510SLisandro Dalcin options->prefixind = 0; 10352d747510SLisandro Dalcin options->prefix[0] = 0; 10362d747510SLisandro Dalcin options->help = PETSC_FALSE; 10374416b707SBarry Smith return 0; 10384416b707SBarry Smith } 10394416b707SBarry Smith 10402d747510SLisandro Dalcin /*@C 10412d747510SLisandro Dalcin PetscOptionsSetAlias - Makes a key and alias for another key 10422d747510SLisandro Dalcin 10431c9f3c13SBarry Smith Logically Collective 10442d747510SLisandro Dalcin 10452d747510SLisandro Dalcin Input Parameters: 10462d747510SLisandro Dalcin + options - options database, or NULL for default global database 10472d747510SLisandro Dalcin . newname - the alias 10482d747510SLisandro Dalcin - oldname - the name that alias will refer to 10492d747510SLisandro Dalcin 10502d747510SLisandro Dalcin Level: advanced 10512d747510SLisandro Dalcin 10529666a313SBarry Smith The collectivity of this routine is complex; only the MPI processes that call this routine will 10531c9f3c13SBarry Smith have the affect of these options. If some processes that create objects call this routine and others do 10541c9f3c13SBarry Smith not the code may fail in complicated ways because the same parallel solvers may incorrectly use different options 10551c9f3c13SBarry Smith on different ranks. 10561c9f3c13SBarry Smith 10572d747510SLisandro Dalcin .seealso: PetscOptionsGetInt(), PetscOptionsGetReal(),OptionsHasName(), 10582d747510SLisandro Dalcin PetscOptionsGetString(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(),PetscOptionsBool(), 10592d747510SLisandro Dalcin PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 10602d747510SLisandro Dalcin PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 10612d747510SLisandro Dalcin PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 10622d747510SLisandro Dalcin PetscOptionsFList(), PetscOptionsEList() 10632d747510SLisandro Dalcin @*/ 10642d747510SLisandro Dalcin PetscErrorCode PetscOptionsSetAlias(PetscOptions options,const char newname[],const char oldname[]) 10652d747510SLisandro Dalcin { 10662d747510SLisandro Dalcin PetscInt n; 10672d747510SLisandro Dalcin size_t len; 10689210b8eaSVaclav Hapla PetscBool valid; 10692d747510SLisandro Dalcin PetscErrorCode ierr; 10702d747510SLisandro Dalcin 10712d747510SLisandro Dalcin PetscFunctionBegin; 10722d747510SLisandro Dalcin PetscValidCharPointer(newname,2); 10732d747510SLisandro Dalcin PetscValidCharPointer(oldname,3); 10742d747510SLisandro Dalcin options = options ? options : defaultoptions; 10759210b8eaSVaclav Hapla ierr = PetscOptionsValidKey(newname,&valid);CHKERRQ(ierr); 10769210b8eaSVaclav Hapla if (!valid) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Invalid aliased option %s",newname); 10779210b8eaSVaclav Hapla ierr = PetscOptionsValidKey(oldname,&valid);CHKERRQ(ierr); 10789210b8eaSVaclav Hapla if (!valid) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Invalid aliasee option %s",oldname); 10792d747510SLisandro Dalcin 10802d747510SLisandro Dalcin n = options->Naliases; 10812d747510SLisandro 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); 10822d747510SLisandro Dalcin 10832d747510SLisandro Dalcin newname++; oldname++; 10842d747510SLisandro Dalcin ierr = PetscStrlen(newname,&len);CHKERRQ(ierr); 10852d747510SLisandro Dalcin options->aliases1[n] = (char*)malloc((len+1)*sizeof(char)); 10862d747510SLisandro Dalcin ierr = PetscStrcpy(options->aliases1[n],newname);CHKERRQ(ierr); 10872d747510SLisandro Dalcin ierr = PetscStrlen(oldname,&len);CHKERRQ(ierr); 10882d747510SLisandro Dalcin options->aliases2[n] = (char*)malloc((len+1)*sizeof(char)); 10892d747510SLisandro Dalcin ierr = PetscStrcpy(options->aliases2[n],oldname);CHKERRQ(ierr); 10902d747510SLisandro Dalcin options->Naliases++; 10912d747510SLisandro Dalcin PetscFunctionReturn(0); 10922d747510SLisandro Dalcin } 10934416b707SBarry Smith 1094e5c89e4eSSatish Balay /*@C 1095e5c89e4eSSatish Balay PetscOptionsSetValue - Sets an option name-value pair in the options 1096e5c89e4eSSatish Balay database, overriding whatever is already present. 1097e5c89e4eSSatish Balay 10981c9f3c13SBarry Smith Logically Collective 1099e5c89e4eSSatish Balay 1100e5c89e4eSSatish Balay Input Parameters: 1101c5929fdfSBarry Smith + options - options database, use NULL for the default global database 1102c5929fdfSBarry Smith . name - name of option, this SHOULD have the - prepended 11032d747510SLisandro Dalcin - value - the option value (not used for all options, so can be NULL) 1104e5c89e4eSSatish Balay 1105e5c89e4eSSatish Balay Level: intermediate 1106e5c89e4eSSatish Balay 1107e5c89e4eSSatish Balay Note: 1108d49172ceSBarry Smith This function can be called BEFORE PetscInitialize() 1109d49172ceSBarry Smith 11109666a313SBarry Smith The collectivity of this routine is complex; only the MPI processes that call this routine will 11111c9f3c13SBarry Smith have the affect of these options. If some processes that create objects call this routine and others do 11121c9f3c13SBarry Smith not the code may fail in complicated ways because the same parallel solvers may incorrectly use different options 11131c9f3c13SBarry Smith on different ranks. 11141c9f3c13SBarry Smith 11152d747510SLisandro Dalcin Developers Note: Uses malloc() directly because PETSc may not be initialized yet. 1116b0250c70SBarry Smith 11172d747510SLisandro Dalcin .seealso: PetscOptionsInsert(), PetscOptionsClearValue() 1118e5c89e4eSSatish Balay @*/ 11192d747510SLisandro Dalcin PetscErrorCode PetscOptionsSetValue(PetscOptions options,const char name[],const char value[]) 1120e5c89e4eSSatish Balay { 1121c5b5d8d5SVaclav Hapla return PetscOptionsSetValue_Private(options,name,value,NULL); 1122c5b5d8d5SVaclav Hapla } 1123c5b5d8d5SVaclav Hapla 1124c5b5d8d5SVaclav Hapla static PetscErrorCode PetscOptionsSetValue_Private(PetscOptions options,const char name[],const char value[],int *pos) 1125c5b5d8d5SVaclav Hapla { 1126e5c89e4eSSatish Balay size_t len; 11272d747510SLisandro Dalcin int N,n,i; 1128e5c89e4eSSatish Balay char **names; 11292d747510SLisandro Dalcin char fullname[MAXOPTNAME] = ""; 1130c5b5d8d5SVaclav Hapla PetscBool flg; 11312d747510SLisandro Dalcin PetscErrorCode ierr; 1132e5c89e4eSSatish Balay 11337272c0d2SVaclav Hapla if (!options) { 11342d747510SLisandro Dalcin ierr = PetscOptionsCreateDefault();if (ierr) return ierr; 11357272c0d2SVaclav Hapla options = defaultoptions; 1136c5929fdfSBarry Smith } 11372d747510SLisandro Dalcin 11382d747510SLisandro Dalcin if (name[0] != '-') return PETSC_ERR_ARG_OUTOFRANGE; 1139e5c89e4eSSatish Balay 1140c5b5d8d5SVaclav Hapla ierr = PetscOptionsSkipPrecedent(options,name,&flg);CHKERRQ(ierr); 1141c5b5d8d5SVaclav Hapla if (flg) return 0; 1142e5c89e4eSSatish Balay 11432d747510SLisandro Dalcin name++; /* skip starting dash */ 11442d747510SLisandro Dalcin 114574e0666dSJed Brown if (options->prefixind > 0) { 1146d49172ceSBarry Smith strncpy(fullname,options->prefix,sizeof(fullname)); 11472d747510SLisandro Dalcin fullname[sizeof(fullname)-1] = 0; 114889ae1891SBarry Smith strncat(fullname,name,sizeof(fullname)-strlen(fullname)-1); 11492d747510SLisandro Dalcin fullname[sizeof(fullname)-1] = 0; 115074e0666dSJed Brown name = fullname; 115174e0666dSJed Brown } 115274e0666dSJed Brown 115374e0666dSJed Brown /* check against aliases */ 1154e5c89e4eSSatish Balay N = options->Naliases; 1155e5c89e4eSSatish Balay for (i=0; i<N; i++) { 11562d747510SLisandro Dalcin int result = PetscOptNameCmp(options->aliases1[i],name); 11572d747510SLisandro Dalcin if (!result) { name = options->aliases2[i]; break; } 1158e5c89e4eSSatish Balay } 1159e5c89e4eSSatish Balay 11602d747510SLisandro Dalcin /* slow search */ 11612d747510SLisandro Dalcin N = n = options->N; 1162e5c89e4eSSatish Balay names = options->names; 1163e5c89e4eSSatish Balay for (i=0; i<N; i++) { 11642d747510SLisandro Dalcin int result = PetscOptNameCmp(names[i],name); 11652d747510SLisandro Dalcin if (!result) { 11662d747510SLisandro Dalcin n = i; goto setvalue; 11672d747510SLisandro Dalcin } else if (result > 0) { 11682d747510SLisandro Dalcin n = i; break; 1169e5c89e4eSSatish Balay } 1170e5c89e4eSSatish Balay } 11712d747510SLisandro Dalcin if (N >= MAXOPTIONS) return PETSC_ERR_MEM; 11722d747510SLisandro Dalcin /* shift remaining values up 1 */ 1173e5c89e4eSSatish Balay for (i=N; i>n; i--) { 11745e8c5e88SLisandro Dalcin options->names[i] = options->names[i-1]; 1175e5c89e4eSSatish Balay options->values[i] = options->values[i-1]; 1176e5c89e4eSSatish Balay options->used[i] = options->used[i-1]; 1177e5c89e4eSSatish Balay } 11782d747510SLisandro Dalcin options->names[n] = NULL; 11792d747510SLisandro Dalcin options->values[n] = NULL; 11802d747510SLisandro Dalcin options->used[n] = PETSC_FALSE; 11812d747510SLisandro Dalcin options->N++; 11822d747510SLisandro Dalcin 11832d747510SLisandro Dalcin /* destroy hash table */ 11842d747510SLisandro Dalcin kh_destroy(HO,options->ht); 11852d747510SLisandro Dalcin options->ht = NULL; 11862d747510SLisandro Dalcin 11872d747510SLisandro Dalcin /* set new name */ 118870d8d27cSBarry Smith len = strlen(name); 11895e8c5e88SLisandro Dalcin options->names[n] = (char*)malloc((len+1)*sizeof(char)); 1190d49172ceSBarry Smith if (!options->names[n]) return PETSC_ERR_MEM; 1191d49172ceSBarry Smith strcpy(options->names[n],name); 11922d747510SLisandro Dalcin 11932d747510SLisandro Dalcin setvalue: 11942d747510SLisandro Dalcin /* set new value */ 11952d747510SLisandro Dalcin if (options->values[n]) free(options->values[n]); 1196d49172ceSBarry Smith len = value ? strlen(value) : 0; 11975e8c5e88SLisandro Dalcin if (len) { 1198e5c89e4eSSatish Balay options->values[n] = (char*)malloc((len+1)*sizeof(char)); 1199d49172ceSBarry Smith if (!options->values[n]) return PETSC_ERR_MEM; 1200d49172ceSBarry Smith strcpy(options->values[n],value); 12012d747510SLisandro Dalcin } else { 12022d747510SLisandro Dalcin options->values[n] = NULL; 12032d747510SLisandro Dalcin } 12042d747510SLisandro Dalcin 120591ad3481SVaclav Hapla /* handle -help so that it can be set from anywhere */ 120691ad3481SVaclav Hapla if (!PetscOptNameCmp(name,"help")) { 120791ad3481SVaclav Hapla options->help = PETSC_TRUE; 120891ad3481SVaclav Hapla ierr = PetscStrcasecmp(value, "intro", &options->help_intro);CHKERRQ(ierr); 120991ad3481SVaclav Hapla options->used[n] = PETSC_TRUE; 121091ad3481SVaclav Hapla } 121191ad3481SVaclav Hapla 1212c5b5d8d5SVaclav Hapla if (PetscErrorHandlingInitialized) { 1213c5b5d8d5SVaclav Hapla ierr = PetscOptionsMonitor(options,name,value);CHKERRQ(ierr); 1214c5b5d8d5SVaclav Hapla } 1215c5b5d8d5SVaclav Hapla if (pos) *pos = n; 1216d49172ceSBarry Smith return 0; 1217e5c89e4eSSatish Balay } 1218e5c89e4eSSatish Balay 1219e5c89e4eSSatish Balay /*@C 1220e5c89e4eSSatish Balay PetscOptionsClearValue - Clears an option name-value pair in the options 1221e5c89e4eSSatish Balay database, overriding whatever is already present. 1222e5c89e4eSSatish Balay 12231c9f3c13SBarry Smith Logically Collective 1224e5c89e4eSSatish Balay 1225e5c89e4eSSatish Balay Input Parameter: 1226c5929fdfSBarry Smith + options - options database, use NULL for the default global database 1227a2b725a8SWilliam Gropp - name - name of option, this SHOULD have the - prepended 1228e5c89e4eSSatish Balay 1229e5c89e4eSSatish Balay Level: intermediate 1230e5c89e4eSSatish Balay 12319666a313SBarry Smith The collectivity of this routine is complex; only the MPI processes that call this routine will 12321c9f3c13SBarry Smith have the affect of these options. If some processes that create objects call this routine and others do 12331c9f3c13SBarry Smith not the code may fail in complicated ways because the same parallel solvers may incorrectly use different options 12341c9f3c13SBarry Smith on different ranks. 12351c9f3c13SBarry Smith 1236e5c89e4eSSatish Balay .seealso: PetscOptionsInsert() 1237e5c89e4eSSatish Balay @*/ 12382d747510SLisandro Dalcin PetscErrorCode PetscOptionsClearValue(PetscOptions options,const char name[]) 1239e5c89e4eSSatish Balay { 12402d747510SLisandro Dalcin int N,n,i; 12412d747510SLisandro Dalcin char **names; 1242e5c89e4eSSatish Balay PetscErrorCode ierr; 1243e5c89e4eSSatish Balay 1244e5c89e4eSSatish Balay PetscFunctionBegin; 1245c5929fdfSBarry Smith options = options ? options : defaultoptions; 12462d747510SLisandro Dalcin if (name[0] != '-') SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Name must begin with '-': Instead %s",name); 1247c9dcd962SLisandro Dalcin if (!PetscOptNameCmp(name,"-help")) options->help = options->help_intro = PETSC_FALSE; 12482d747510SLisandro Dalcin 12492d747510SLisandro Dalcin name++; /* skip starting dash */ 12502d747510SLisandro Dalcin 12512d747510SLisandro Dalcin /* slow search */ 12522d747510SLisandro Dalcin N = n = options->N; 1253e5c89e4eSSatish Balay names = options->names; 1254e5c89e4eSSatish Balay for (i=0; i<N; i++) { 12552d747510SLisandro Dalcin int result = PetscOptNameCmp(names[i],name); 12562d747510SLisandro Dalcin if (!result) { 12572d747510SLisandro Dalcin n = i; break; 12582d747510SLisandro Dalcin } else if (result > 0) { 12592d747510SLisandro Dalcin n = N; break; 1260e5c89e4eSSatish Balay } 12612d747510SLisandro Dalcin } 12622d747510SLisandro Dalcin if (n == N) PetscFunctionReturn(0); /* it was not present */ 1263e5c89e4eSSatish Balay 12642d747510SLisandro Dalcin /* remove name and value */ 12652d747510SLisandro Dalcin if (options->names[n]) free(options->names[n]); 12662d747510SLisandro Dalcin if (options->values[n]) free(options->values[n]); 1267e5c89e4eSSatish Balay /* shift remaining values down 1 */ 1268e5c89e4eSSatish Balay for (i=n; i<N-1; i++) { 12695e8c5e88SLisandro Dalcin options->names[i] = options->names[i+1]; 1270e5c89e4eSSatish Balay options->values[i] = options->values[i+1]; 1271e5c89e4eSSatish Balay options->used[i] = options->used[i+1]; 1272e5c89e4eSSatish Balay } 1273e5c89e4eSSatish Balay options->N--; 12742d747510SLisandro Dalcin 12752d747510SLisandro Dalcin /* destroy hash table */ 12762d747510SLisandro Dalcin kh_destroy(HO,options->ht); 12772d747510SLisandro Dalcin options->ht = NULL; 12782d747510SLisandro Dalcin 12792d747510SLisandro Dalcin ierr = PetscOptionsMonitor(options,name,NULL);CHKERRQ(ierr); 1280e5c89e4eSSatish Balay PetscFunctionReturn(0); 1281e5c89e4eSSatish Balay } 1282e5c89e4eSSatish Balay 1283e5c89e4eSSatish Balay /*@C 12842d747510SLisandro Dalcin PetscOptionsFindPair - Gets an option name-value pair from the options database. 1285e5c89e4eSSatish Balay 12862d747510SLisandro Dalcin Not Collective 1287e5c89e4eSSatish Balay 1288e5c89e4eSSatish Balay Input Parameters: 12892d747510SLisandro Dalcin + options - options database, use NULL for the default global database 12902d747510SLisandro Dalcin . pre - the string to prepend to the name or NULL, this SHOULD NOT have the "-" prepended 12912d747510SLisandro Dalcin - name - name of option, this SHOULD have the "-" prepended 1292e5c89e4eSSatish Balay 12932d747510SLisandro Dalcin Output Parameters: 12942d747510SLisandro Dalcin + value - the option value (optional, not used for all options) 12952d747510SLisandro Dalcin - set - whether the option is set (optional) 1296e5c89e4eSSatish Balay 12979666a313SBarry Smith Notes: 12989666a313SBarry Smith Each process may find different values or no value depending on how options were inserted into the database 12991c9f3c13SBarry Smith 13002d747510SLisandro Dalcin Level: developer 13012d747510SLisandro Dalcin 13022d747510SLisandro Dalcin .seealso: PetscOptionsSetValue(), PetscOptionsClearValue() 1303e5c89e4eSSatish Balay @*/ 13042d747510SLisandro Dalcin PetscErrorCode PetscOptionsFindPair(PetscOptions options,const char pre[],const char name[],const char *value[],PetscBool *set) 1305e5c89e4eSSatish Balay { 13062d747510SLisandro Dalcin char buf[MAXOPTNAME]; 1307daabea38SBarry Smith PetscBool usehashtable = PETSC_TRUE; 13082d747510SLisandro Dalcin PetscBool matchnumbers = PETSC_TRUE; 1309e5c89e4eSSatish Balay PetscErrorCode ierr; 1310e5c89e4eSSatish Balay 1311e5c89e4eSSatish Balay PetscFunctionBegin; 1312c5929fdfSBarry Smith options = options ? options : defaultoptions; 13132d747510SLisandro Dalcin if (pre && PetscUnlikely(pre[0] == '-')) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Prefix cannot begin with '-': Instead %s",pre); 13142d747510SLisandro Dalcin if (PetscUnlikely(name[0] != '-')) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Name must begin with '-': Instead %s",name); 1315e5c89e4eSSatish Balay 13162d747510SLisandro Dalcin name++; /* skip starting dash */ 1317e5c89e4eSSatish Balay 13187cd08cecSJed Brown /* append prefix to name, if prefix="foo_" and option='--bar", prefixed option is --foo_bar */ 13192d747510SLisandro Dalcin if (pre && pre[0]) { 13202d747510SLisandro Dalcin char *ptr = buf; 13212d747510SLisandro Dalcin if (name[0] == '-') { *ptr++ = '-'; name++; } 13222d747510SLisandro Dalcin ierr = PetscStrncpy(ptr,pre,buf+sizeof(buf)-ptr);CHKERRQ(ierr); 13232d747510SLisandro Dalcin ierr = PetscStrlcat(buf,name,sizeof(buf));CHKERRQ(ierr); 13242d747510SLisandro Dalcin name = buf; 13257cd08cecSJed Brown } 13262d747510SLisandro Dalcin 132776bd3646SJed Brown if (PetscDefined(USE_DEBUG)) { 13282f828895SJed Brown PetscBool valid; 13292d747510SLisandro Dalcin char key[MAXOPTNAME+1] = "-"; 13302d747510SLisandro Dalcin ierr = PetscStrncpy(key+1,name,sizeof(key)-1);CHKERRQ(ierr); 13312f828895SJed Brown ierr = PetscOptionsValidKey(key,&valid);CHKERRQ(ierr); 13322f828895SJed 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); 13332f828895SJed Brown } 1334e5c89e4eSSatish Balay 13352d747510SLisandro Dalcin if (!options->ht && usehashtable) { 13362d747510SLisandro Dalcin int i,ret; 13372d747510SLisandro Dalcin khiter_t it; 13382d747510SLisandro Dalcin khash_t(HO) *ht; 13392d747510SLisandro Dalcin ht = kh_init(HO); 13402d747510SLisandro Dalcin if (PetscUnlikely(!ht)) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_MEM,"Hash table allocation failed"); 13412d747510SLisandro Dalcin ret = kh_resize(HO,ht,options->N*2); /* twice the required size to reduce risk of collisions */ 13422d747510SLisandro Dalcin if (PetscUnlikely(ret)) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_MEM,"Hash table allocation failed"); 13432d747510SLisandro Dalcin for (i=0; i<options->N; i++) { 13442d747510SLisandro Dalcin it = kh_put(HO,ht,options->names[i],&ret); 13452d747510SLisandro Dalcin if (PetscUnlikely(ret != 1)) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_MEM,"Hash table allocation failed"); 13462d747510SLisandro Dalcin kh_val(ht,it) = i; 13472d747510SLisandro Dalcin } 13482d747510SLisandro Dalcin options->ht = ht; 13492d747510SLisandro Dalcin } 13502d747510SLisandro Dalcin 13512d747510SLisandro Dalcin if (usehashtable) 13522d747510SLisandro Dalcin { /* fast search */ 13532d747510SLisandro Dalcin khash_t(HO) *ht = options->ht; 13542d747510SLisandro Dalcin khiter_t it = kh_get(HO,ht,name); 13552d747510SLisandro Dalcin if (it != kh_end(ht)) { 13562d747510SLisandro Dalcin int i = kh_val(ht,it); 1357e5c89e4eSSatish Balay options->used[i] = PETSC_TRUE; 13582d747510SLisandro Dalcin if (value) *value = options->values[i]; 13592d747510SLisandro Dalcin if (set) *set = PETSC_TRUE; 13602d747510SLisandro Dalcin PetscFunctionReturn(0); 13612d747510SLisandro Dalcin } 13622d747510SLisandro Dalcin } else 13632d747510SLisandro Dalcin { /* slow search */ 13642d747510SLisandro Dalcin int i, N = options->N; 13652d747510SLisandro Dalcin for (i=0; i<N; i++) { 1366daabea38SBarry Smith int result = PetscOptNameCmp(options->names[i],name); 13672d747510SLisandro Dalcin if (!result) { 13682d747510SLisandro Dalcin options->used[i] = PETSC_TRUE; 13692d747510SLisandro Dalcin if (value) *value = options->values[i]; 13702d747510SLisandro Dalcin if (set) *set = PETSC_TRUE; 13712d747510SLisandro Dalcin PetscFunctionReturn(0); 13722d747510SLisandro Dalcin } else if (result > 0) { 1373e5c89e4eSSatish Balay break; 1374e5c89e4eSSatish Balay } 1375e5c89e4eSSatish Balay } 13762d747510SLisandro Dalcin } 13772d747510SLisandro Dalcin 13782d747510SLisandro Dalcin /* 13792d747510SLisandro Dalcin The following block slows down all lookups in the most frequent path (most lookups are unsuccessful). 13802d747510SLisandro Dalcin Maybe this special lookup mode should be enabled on request with a push/pop API. 13812d747510SLisandro Dalcin The feature of matching _%d_ used sparingly in the codebase. 13822d747510SLisandro Dalcin */ 13832d747510SLisandro Dalcin if (matchnumbers) { 13842d747510SLisandro Dalcin int i,j,cnt = 0,locs[16],loce[16]; 1385e5c89e4eSSatish Balay /* determine the location and number of all _%d_ in the key */ 13862d747510SLisandro Dalcin for (i=0; name[i]; i++) { 13872d747510SLisandro Dalcin if (name[i] == '_') { 13882d747510SLisandro Dalcin for (j=i+1; name[j]; j++) { 13892d747510SLisandro Dalcin if (name[j] >= '0' && name[j] <= '9') continue; 13902d747510SLisandro Dalcin if (name[j] == '_' && j > i+1) { /* found a number */ 1391e5c89e4eSSatish Balay locs[cnt] = i+1; 1392e5c89e4eSSatish Balay loce[cnt++] = j+1; 1393e5c89e4eSSatish Balay } 13942d747510SLisandro Dalcin i = j-1; 1395e5c89e4eSSatish Balay break; 1396e5c89e4eSSatish Balay } 1397e5c89e4eSSatish Balay } 1398e5c89e4eSSatish Balay } 1399e5c89e4eSSatish Balay for (i=0; i<cnt; i++) { 14002d747510SLisandro Dalcin PetscBool found; 14012d747510SLisandro Dalcin char opt[MAXOPTNAME+1] = "-", tmp[MAXOPTNAME]; 14022d747510SLisandro Dalcin ierr = PetscStrncpy(tmp,name,PetscMin((size_t)(locs[i]+1),sizeof(tmp)));CHKERRQ(ierr); 14032d747510SLisandro Dalcin ierr = PetscStrlcat(opt,tmp,sizeof(opt));CHKERRQ(ierr); 14042d747510SLisandro Dalcin ierr = PetscStrlcat(opt,name+loce[i],sizeof(opt));CHKERRQ(ierr); 14052d747510SLisandro Dalcin ierr = PetscOptionsFindPair(options,NULL,opt,value,&found);CHKERRQ(ierr); 14062d747510SLisandro Dalcin if (found) {if (set) *set = PETSC_TRUE; PetscFunctionReturn(0);} 1407e5c89e4eSSatish Balay } 1408e5c89e4eSSatish Balay } 14092d747510SLisandro Dalcin 14102d747510SLisandro Dalcin if (set) *set = PETSC_FALSE; 1411e5c89e4eSSatish Balay PetscFunctionReturn(0); 1412e5c89e4eSSatish Balay } 1413e5c89e4eSSatish Balay 1414d6ced9c0SMatthew G. Knepley /* Check whether any option begins with pre+name */ 14152d747510SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscOptionsFindPairPrefix_Private(PetscOptions options,const char pre[], const char name[],const char *value[],PetscBool *set) 1416514bf10dSMatthew G Knepley { 14172d747510SLisandro Dalcin char buf[MAXOPTNAME]; 1418d6ced9c0SMatthew G. Knepley int numCnt = 0, locs[16],loce[16]; 1419514bf10dSMatthew G Knepley PetscErrorCode ierr; 1420514bf10dSMatthew G Knepley 1421514bf10dSMatthew G Knepley PetscFunctionBegin; 1422c5929fdfSBarry Smith options = options ? options : defaultoptions; 14232d747510SLisandro Dalcin if (pre && pre[0] == '-') SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Prefix cannot begin with '-': Instead %s",pre); 14242d747510SLisandro Dalcin if (name[0] != '-') SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Name must begin with '-': Instead %s",name); 1425514bf10dSMatthew G Knepley 14262d747510SLisandro Dalcin name++; /* skip starting dash */ 1427514bf10dSMatthew G Knepley 1428514bf10dSMatthew G Knepley /* append prefix to name, if prefix="foo_" and option='--bar", prefixed option is --foo_bar */ 14292d747510SLisandro Dalcin if (pre && pre[0]) { 14302d747510SLisandro Dalcin char *ptr = buf; 14312d747510SLisandro Dalcin if (name[0] == '-') { *ptr++ = '-'; name++; } 14322d747510SLisandro Dalcin ierr = PetscStrncpy(ptr,pre,sizeof(buf)+(size_t)(ptr-buf));CHKERRQ(ierr); 14332d747510SLisandro Dalcin ierr = PetscStrlcat(buf,name,sizeof(buf));CHKERRQ(ierr); 14342d747510SLisandro Dalcin name = buf; 1435514bf10dSMatthew G Knepley } 14362d747510SLisandro Dalcin 143776bd3646SJed Brown if (PetscDefined(USE_DEBUG)) { 1438514bf10dSMatthew G Knepley PetscBool valid; 14392d747510SLisandro Dalcin char key[MAXOPTNAME+1] = "-"; 14402d747510SLisandro Dalcin ierr = PetscStrncpy(key+1,name,sizeof(key)-1);CHKERRQ(ierr); 1441514bf10dSMatthew G Knepley ierr = PetscOptionsValidKey(key,&valid);CHKERRQ(ierr); 1442514bf10dSMatthew 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); 1443514bf10dSMatthew G Knepley } 1444514bf10dSMatthew G Knepley 1445d6ced9c0SMatthew G. Knepley /* determine the location and number of all _%d_ in the key */ 1446d6ced9c0SMatthew G. Knepley { 1447d6ced9c0SMatthew G. Knepley int i,j; 1448d6ced9c0SMatthew G. Knepley for (i=0; name[i]; i++) { 1449d6ced9c0SMatthew G. Knepley if (name[i] == '_') { 1450d6ced9c0SMatthew G. Knepley for (j=i+1; name[j]; j++) { 1451d6ced9c0SMatthew G. Knepley if (name[j] >= '0' && name[j] <= '9') continue; 1452d6ced9c0SMatthew G. Knepley if (name[j] == '_' && j > i+1) { /* found a number */ 1453d6ced9c0SMatthew G. Knepley locs[numCnt] = i+1; 1454d6ced9c0SMatthew G. Knepley loce[numCnt++] = j+1; 1455d6ced9c0SMatthew G. Knepley } 1456d6ced9c0SMatthew G. Knepley i = j-1; 1457d6ced9c0SMatthew G. Knepley break; 1458d6ced9c0SMatthew G. Knepley } 1459d6ced9c0SMatthew G. Knepley } 1460d6ced9c0SMatthew G. Knepley } 1461d6ced9c0SMatthew G. Knepley } 1462d6ced9c0SMatthew G. Knepley 14632d747510SLisandro Dalcin { /* slow search */ 1464d6ced9c0SMatthew G. Knepley int c, i; 14652d747510SLisandro Dalcin size_t len; 14662d747510SLisandro Dalcin PetscBool match; 1467d6ced9c0SMatthew G. Knepley 1468d6ced9c0SMatthew G. Knepley for (c = -1; c < numCnt; ++c) { 1469d6ced9c0SMatthew G. Knepley char opt[MAXOPTNAME+1] = "", tmp[MAXOPTNAME]; 1470d6ced9c0SMatthew G. Knepley 1471d6ced9c0SMatthew G. Knepley if (c < 0) { 1472d6ced9c0SMatthew G. Knepley ierr = PetscStrcpy(opt,name);CHKERRQ(ierr); 1473d6ced9c0SMatthew G. Knepley } else { 1474d6ced9c0SMatthew G. Knepley ierr = PetscStrncpy(tmp,name,PetscMin((size_t)(locs[c]+1),sizeof(tmp)));CHKERRQ(ierr); 1475d6ced9c0SMatthew G. Knepley ierr = PetscStrlcat(opt,tmp,sizeof(opt));CHKERRQ(ierr); 1476d6ced9c0SMatthew G. Knepley ierr = PetscStrlcat(opt,name+loce[c],sizeof(opt));CHKERRQ(ierr); 1477d6ced9c0SMatthew G. Knepley } 1478d6ced9c0SMatthew G. Knepley ierr = PetscStrlen(opt,&len);CHKERRQ(ierr); 14792d747510SLisandro Dalcin for (i=0; i<options->N; i++) { 1480d6ced9c0SMatthew G. Knepley ierr = PetscStrncmp(options->names[i],opt,len,&match);CHKERRQ(ierr); 1481514bf10dSMatthew G Knepley if (match) { 1482514bf10dSMatthew G Knepley options->used[i] = PETSC_TRUE; 14832d747510SLisandro Dalcin if (value) *value = options->values[i]; 14842d747510SLisandro Dalcin if (set) *set = PETSC_TRUE; 14852d747510SLisandro Dalcin PetscFunctionReturn(0); 1486514bf10dSMatthew G Knepley } 1487514bf10dSMatthew G Knepley } 14882d747510SLisandro Dalcin } 1489d6ced9c0SMatthew G. Knepley } 14902d747510SLisandro Dalcin 14912d747510SLisandro Dalcin if (set) *set = PETSC_FALSE; 1492514bf10dSMatthew G Knepley PetscFunctionReturn(0); 1493514bf10dSMatthew G Knepley } 1494514bf10dSMatthew G Knepley 1495e5c89e4eSSatish Balay /*@C 1496e5c89e4eSSatish Balay PetscOptionsReject - Generates an error if a certain option is given. 1497e5c89e4eSSatish Balay 14981c9f3c13SBarry Smith Not Collective 1499e5c89e4eSSatish Balay 1500e5c89e4eSSatish Balay Input Parameters: 15015c9cc608SHong Zhang + options - options database, use NULL for default global database 15022d747510SLisandro Dalcin . pre - the option prefix (may be NULL) 15032d747510SLisandro Dalcin . name - the option name one is seeking 15040298fd71SBarry Smith - mess - error message (may be NULL) 1505e5c89e4eSSatish Balay 1506e5c89e4eSSatish Balay Level: advanced 1507e5c89e4eSSatish Balay 1508e5c89e4eSSatish Balay .seealso: PetscOptionsGetInt(), PetscOptionsGetReal(),OptionsHasName(), 1509acfcf0e5SJed Brown PetscOptionsGetString(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool(), 1510e5c89e4eSSatish Balay PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 1511e5c89e4eSSatish Balay PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 1512acfcf0e5SJed Brown PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 1513a264d7a6SBarry Smith PetscOptionsFList(), PetscOptionsEList() 1514e5c89e4eSSatish Balay @*/ 15152d747510SLisandro Dalcin PetscErrorCode PetscOptionsReject(PetscOptions options,const char pre[],const char name[],const char mess[]) 1516e5c89e4eSSatish Balay { 1517e5c89e4eSSatish Balay PetscErrorCode ierr; 1518ace3abfcSBarry Smith PetscBool flag = PETSC_FALSE; 1519e5c89e4eSSatish Balay 1520e5c89e4eSSatish Balay PetscFunctionBegin; 15212d747510SLisandro Dalcin ierr = PetscOptionsHasName(options,pre,name,&flag);CHKERRQ(ierr); 1522e5c89e4eSSatish Balay if (flag) { 15232d747510SLisandro 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); 15242d747510SLisandro Dalcin else SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Program has disabled option: -%s%s",pre?pre:"",name+1); 1525e5c89e4eSSatish Balay } 1526e5c89e4eSSatish Balay PetscFunctionReturn(0); 1527e5c89e4eSSatish Balay } 1528e5c89e4eSSatish Balay 1529e5c89e4eSSatish Balay /*@C 15302d747510SLisandro Dalcin PetscOptionsHasHelp - Determines whether the "-help" option is in the database. 15312d747510SLisandro Dalcin 15322d747510SLisandro Dalcin Not Collective 15332d747510SLisandro Dalcin 15342d747510SLisandro Dalcin Input Parameters: 15352d747510SLisandro Dalcin . options - options database, use NULL for default global database 15362d747510SLisandro Dalcin 15372d747510SLisandro Dalcin Output Parameters: 15382d747510SLisandro Dalcin . set - PETSC_TRUE if found else PETSC_FALSE. 15392d747510SLisandro Dalcin 15402d747510SLisandro Dalcin Level: advanced 15412d747510SLisandro Dalcin 15422d747510SLisandro Dalcin .seealso: PetscOptionsHasName() 15432d747510SLisandro Dalcin @*/ 15442d747510SLisandro Dalcin PetscErrorCode PetscOptionsHasHelp(PetscOptions options,PetscBool *set) 15452d747510SLisandro Dalcin { 15462d747510SLisandro Dalcin PetscFunctionBegin; 15472d747510SLisandro Dalcin PetscValidPointer(set,2); 15482d747510SLisandro Dalcin options = options ? options : defaultoptions; 15492d747510SLisandro Dalcin *set = options->help; 15502d747510SLisandro Dalcin PetscFunctionReturn(0); 15512d747510SLisandro Dalcin } 15522d747510SLisandro Dalcin 1553d314f959SVaclav Hapla PetscErrorCode PetscOptionsHasHelpIntro_Internal(PetscOptions options,PetscBool *set) 1554d314f959SVaclav Hapla { 1555d314f959SVaclav Hapla PetscFunctionBegin; 1556d314f959SVaclav Hapla PetscValidPointer(set,2); 1557d314f959SVaclav Hapla options = options ? options : defaultoptions; 1558d314f959SVaclav Hapla *set = options->help_intro; 1559d314f959SVaclav Hapla PetscFunctionReturn(0); 1560d314f959SVaclav Hapla } 1561d314f959SVaclav Hapla 15622d747510SLisandro Dalcin /*@C 156390d69ab7SBarry 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 156490d69ab7SBarry Smith its value is set to false. 1565e5c89e4eSSatish Balay 1566e5c89e4eSSatish Balay Not Collective 1567e5c89e4eSSatish Balay 1568e5c89e4eSSatish Balay Input Parameters: 15695c9cc608SHong Zhang + options - options database, use NULL for default global database 15703de71b31SHong Zhang . pre - string to prepend to the name or NULL 15713de71b31SHong Zhang - name - the option one is seeking 1572e5c89e4eSSatish Balay 1573e5c89e4eSSatish Balay Output Parameters: 157496ef3cdfSSatish Balay . set - PETSC_TRUE if found else PETSC_FALSE. 1575e5c89e4eSSatish Balay 1576e5c89e4eSSatish Balay Level: beginner 1577e5c89e4eSSatish Balay 157895452b02SPatrick Sanan Notes: 1579acfcf0e5SJed Brown In many cases you probably want to use PetscOptionsGetBool() instead of calling this, to allowing toggling values. 158090d69ab7SBarry Smith 1581e5c89e4eSSatish Balay .seealso: PetscOptionsGetInt(), PetscOptionsGetReal(), 1582f3e3d7dfSBarry Smith PetscOptionsGetString(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool(), 1583e5c89e4eSSatish Balay PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 1584e5c89e4eSSatish Balay PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 1585acfcf0e5SJed Brown PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 1586a264d7a6SBarry Smith PetscOptionsFList(), PetscOptionsEList() 1587e5c89e4eSSatish Balay @*/ 1588c5929fdfSBarry Smith PetscErrorCode PetscOptionsHasName(PetscOptions options,const char pre[],const char name[],PetscBool *set) 1589e5c89e4eSSatish Balay { 15902d747510SLisandro Dalcin const char *value; 1591e5c89e4eSSatish Balay PetscErrorCode ierr; 1592ace3abfcSBarry Smith PetscBool flag; 1593e5c89e4eSSatish Balay 1594e5c89e4eSSatish Balay PetscFunctionBegin; 15952d747510SLisandro Dalcin ierr = PetscOptionsFindPair(options,pre,name,&value,&flag);CHKERRQ(ierr); 159696ef3cdfSSatish Balay if (set) *set = flag; 1597e5c89e4eSSatish Balay PetscFunctionReturn(0); 1598e5c89e4eSSatish Balay } 1599e5c89e4eSSatish Balay 1600e5c89e4eSSatish Balay /*@C 16012d747510SLisandro Dalcin PetscOptionsGetAll - Lists all the options the program was run with in a single string. 16022d747510SLisandro Dalcin 16032d747510SLisandro Dalcin Not Collective 16042d747510SLisandro Dalcin 1605fd292e60Sprj- Input Parameter: 16062d747510SLisandro Dalcin . options - the options database, use NULL for the default global database 16072d747510SLisandro Dalcin 16082d747510SLisandro Dalcin Output Parameter: 16092d747510SLisandro Dalcin . copts - pointer where string pointer is stored 16102d747510SLisandro Dalcin 16112d747510SLisandro Dalcin Notes: 16121c9f3c13SBarry Smith The array and each entry in the array should be freed with PetscFree() 16131c9f3c13SBarry Smith Each process may have different values depending on how the options were inserted into the database 16142d747510SLisandro Dalcin 16152d747510SLisandro Dalcin Level: advanced 16162d747510SLisandro Dalcin 16171c9f3c13SBarry Smith .seealso: PetscOptionsAllUsed(), PetscOptionsView(), PetscOptionsPush(), PetscOptionsPop() 16182d747510SLisandro Dalcin @*/ 16192d747510SLisandro Dalcin PetscErrorCode PetscOptionsGetAll(PetscOptions options,char *copts[]) 16202d747510SLisandro Dalcin { 16212d747510SLisandro Dalcin PetscErrorCode ierr; 16222d747510SLisandro Dalcin PetscInt i; 16232d747510SLisandro Dalcin size_t len = 1,lent = 0; 16242d747510SLisandro Dalcin char *coptions = NULL; 16252d747510SLisandro Dalcin 16262d747510SLisandro Dalcin PetscFunctionBegin; 16272d747510SLisandro Dalcin PetscValidPointer(copts,2); 16282d747510SLisandro Dalcin options = options ? options : defaultoptions; 16292d747510SLisandro Dalcin /* count the length of the required string */ 16302d747510SLisandro Dalcin for (i=0; i<options->N; i++) { 16312d747510SLisandro Dalcin ierr = PetscStrlen(options->names[i],&lent);CHKERRQ(ierr); 16322d747510SLisandro Dalcin len += 2 + lent; 16332d747510SLisandro Dalcin if (options->values[i]) { 16342d747510SLisandro Dalcin ierr = PetscStrlen(options->values[i],&lent);CHKERRQ(ierr); 16352d747510SLisandro Dalcin len += 1 + lent; 16362d747510SLisandro Dalcin } 16372d747510SLisandro Dalcin } 16382d747510SLisandro Dalcin ierr = PetscMalloc1(len,&coptions);CHKERRQ(ierr); 16392d747510SLisandro Dalcin coptions[0] = 0; 16402d747510SLisandro Dalcin for (i=0; i<options->N; i++) { 16412d747510SLisandro Dalcin ierr = PetscStrcat(coptions,"-");CHKERRQ(ierr); 16422d747510SLisandro Dalcin ierr = PetscStrcat(coptions,options->names[i]);CHKERRQ(ierr); 16432d747510SLisandro Dalcin ierr = PetscStrcat(coptions," ");CHKERRQ(ierr); 16442d747510SLisandro Dalcin if (options->values[i]) { 16452d747510SLisandro Dalcin ierr = PetscStrcat(coptions,options->values[i]);CHKERRQ(ierr); 16462d747510SLisandro Dalcin ierr = PetscStrcat(coptions," ");CHKERRQ(ierr); 16472d747510SLisandro Dalcin } 16482d747510SLisandro Dalcin } 16492d747510SLisandro Dalcin *copts = coptions; 16502d747510SLisandro Dalcin PetscFunctionReturn(0); 16512d747510SLisandro Dalcin } 16522d747510SLisandro Dalcin 16532d747510SLisandro Dalcin /*@C 16542d747510SLisandro Dalcin PetscOptionsUsed - Indicates if PETSc has used a particular option set in the database 16552d747510SLisandro Dalcin 16562d747510SLisandro Dalcin Not Collective 16572d747510SLisandro Dalcin 16582d747510SLisandro Dalcin Input Parameter: 16592d747510SLisandro Dalcin + options - options database, use NULL for default global database 16602d747510SLisandro Dalcin - name - string name of option 16612d747510SLisandro Dalcin 16622d747510SLisandro Dalcin Output Parameter: 16632d747510SLisandro Dalcin . used - PETSC_TRUE if the option was used, otherwise false, including if option was not found in options database 16642d747510SLisandro Dalcin 16652d747510SLisandro Dalcin Level: advanced 16662d747510SLisandro Dalcin 16679666a313SBarry Smith Notes: 16689666a313SBarry Smith The value returned may be different on each process and depends on which options have been processed 16691c9f3c13SBarry Smith on the given process 16701c9f3c13SBarry Smith 16712d747510SLisandro Dalcin .seealso: PetscOptionsView(), PetscOptionsLeft(), PetscOptionsAllUsed() 16722d747510SLisandro Dalcin @*/ 16732d747510SLisandro Dalcin PetscErrorCode PetscOptionsUsed(PetscOptions options,const char *name,PetscBool *used) 16742d747510SLisandro Dalcin { 16752d747510SLisandro Dalcin PetscInt i; 16762d747510SLisandro Dalcin PetscErrorCode ierr; 16772d747510SLisandro Dalcin 16782d747510SLisandro Dalcin PetscFunctionBegin; 16792d747510SLisandro Dalcin PetscValidCharPointer(name,2); 16802d747510SLisandro Dalcin PetscValidPointer(used,3); 16812d747510SLisandro Dalcin options = options ? options : defaultoptions; 16822d747510SLisandro Dalcin *used = PETSC_FALSE; 16832d747510SLisandro Dalcin for (i=0; i<options->N; i++) { 1684ee42b8b3SLisandro Dalcin ierr = PetscStrcasecmp(options->names[i],name,used);CHKERRQ(ierr); 16852d747510SLisandro Dalcin if (*used) { 16862d747510SLisandro Dalcin *used = options->used[i]; 16872d747510SLisandro Dalcin break; 16882d747510SLisandro Dalcin } 16892d747510SLisandro Dalcin } 16902d747510SLisandro Dalcin PetscFunctionReturn(0); 16912d747510SLisandro Dalcin } 16922d747510SLisandro Dalcin 1693487a658cSBarry Smith /*@ 16942d747510SLisandro Dalcin PetscOptionsAllUsed - Returns a count of the number of options in the 16952d747510SLisandro Dalcin database that have never been selected. 16962d747510SLisandro Dalcin 16972d747510SLisandro Dalcin Not Collective 16982d747510SLisandro Dalcin 16992d747510SLisandro Dalcin Input Parameter: 17002d747510SLisandro Dalcin . options - options database, use NULL for default global database 17012d747510SLisandro Dalcin 17022d747510SLisandro Dalcin Output Parameter: 17032d747510SLisandro Dalcin . N - count of options not used 17042d747510SLisandro Dalcin 17052d747510SLisandro Dalcin Level: advanced 17062d747510SLisandro Dalcin 17079666a313SBarry Smith Notes: 17089666a313SBarry Smith The value returned may be different on each process and depends on which options have been processed 17091c9f3c13SBarry Smith on the given process 17101c9f3c13SBarry Smith 17112d747510SLisandro Dalcin .seealso: PetscOptionsView() 17122d747510SLisandro Dalcin @*/ 17132d747510SLisandro Dalcin PetscErrorCode PetscOptionsAllUsed(PetscOptions options,PetscInt *N) 17142d747510SLisandro Dalcin { 17152d747510SLisandro Dalcin PetscInt i,n = 0; 17162d747510SLisandro Dalcin 17172d747510SLisandro Dalcin PetscFunctionBegin; 17182d747510SLisandro Dalcin PetscValidIntPointer(N,2); 17192d747510SLisandro Dalcin options = options ? options : defaultoptions; 17202d747510SLisandro Dalcin for (i=0; i<options->N; i++) { 17212d747510SLisandro Dalcin if (!options->used[i]) n++; 17222d747510SLisandro Dalcin } 17232d747510SLisandro Dalcin *N = n; 17242d747510SLisandro Dalcin PetscFunctionReturn(0); 17252d747510SLisandro Dalcin } 17262d747510SLisandro Dalcin 1727487a658cSBarry Smith /*@ 17282d747510SLisandro Dalcin PetscOptionsLeft - Prints to screen any options that were set and never used. 17292d747510SLisandro Dalcin 17302d747510SLisandro Dalcin Not Collective 17312d747510SLisandro Dalcin 17322d747510SLisandro Dalcin Input Parameter: 17332d747510SLisandro Dalcin . options - options database; use NULL for default global database 17342d747510SLisandro Dalcin 17352d747510SLisandro Dalcin Options Database Key: 17363c6db4c4SPierre Jolivet . -options_left - activates PetscOptionsAllUsed() within PetscFinalize() 17372d747510SLisandro Dalcin 17383de2bfdfSBarry Smith Notes: 17393de2bfdfSBarry Smith This is rarely used directly, it is called by PetscFinalize() in debug more or if -options_left 17401c9f3c13SBarry Smith is passed otherwise to help users determine possible mistakes in their usage of options. This 17411c9f3c13SBarry Smith only prints values on process zero of PETSC_COMM_WORLD. Other processes depending the objects 17421c9f3c13SBarry Smith used may have different options that are left unused. 17433de2bfdfSBarry Smith 17442d747510SLisandro Dalcin Level: advanced 17452d747510SLisandro Dalcin 17462d747510SLisandro Dalcin .seealso: PetscOptionsAllUsed() 17472d747510SLisandro Dalcin @*/ 17482d747510SLisandro Dalcin PetscErrorCode PetscOptionsLeft(PetscOptions options) 17492d747510SLisandro Dalcin { 17502d747510SLisandro Dalcin PetscErrorCode ierr; 17512d747510SLisandro Dalcin PetscInt i; 17523de2bfdfSBarry Smith PetscInt cnt = 0; 17533de2bfdfSBarry Smith PetscOptions toptions; 17542d747510SLisandro Dalcin 17552d747510SLisandro Dalcin PetscFunctionBegin; 17563de2bfdfSBarry Smith toptions = options ? options : defaultoptions; 17573de2bfdfSBarry Smith for (i=0; i<toptions->N; i++) { 17583de2bfdfSBarry Smith if (!toptions->used[i]) { 17593de2bfdfSBarry Smith if (toptions->values[i]) { 17603de2bfdfSBarry Smith ierr = PetscPrintf(PETSC_COMM_WORLD,"Option left: name:-%s value: %s\n",toptions->names[i],toptions->values[i]);CHKERRQ(ierr); 17612d747510SLisandro Dalcin } else { 17623de2bfdfSBarry Smith ierr = PetscPrintf(PETSC_COMM_WORLD,"Option left: name:-%s (no value)\n",toptions->names[i]);CHKERRQ(ierr); 17632d747510SLisandro Dalcin } 17642d747510SLisandro Dalcin } 17652d747510SLisandro Dalcin } 17663de2bfdfSBarry Smith if (!options) { 17673de2bfdfSBarry Smith toptions = defaultoptions; 17683de2bfdfSBarry Smith while (toptions->previous) { 17693de2bfdfSBarry Smith cnt++; 17703de2bfdfSBarry Smith toptions = toptions->previous; 17713de2bfdfSBarry Smith } 17723de2bfdfSBarry Smith if (cnt) { 17733de2bfdfSBarry 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); 17743de2bfdfSBarry Smith } 17753de2bfdfSBarry Smith } 17762d747510SLisandro Dalcin PetscFunctionReturn(0); 17772d747510SLisandro Dalcin } 17782d747510SLisandro Dalcin 17792d747510SLisandro Dalcin /*@C 17802d747510SLisandro Dalcin PetscOptionsLeftGet - Returns all options that were set and never used. 17812d747510SLisandro Dalcin 17822d747510SLisandro Dalcin Not Collective 17832d747510SLisandro Dalcin 17842d747510SLisandro Dalcin Input Parameter: 17852d747510SLisandro Dalcin . options - options database, use NULL for default global database 17862d747510SLisandro Dalcin 17872d747510SLisandro Dalcin Output Parameter: 1788a2b725a8SWilliam Gropp + N - count of options not used 17892d747510SLisandro Dalcin . names - names of options not used 1790a2b725a8SWilliam Gropp - values - values of options not used 17912d747510SLisandro Dalcin 17922d747510SLisandro Dalcin Level: advanced 17932d747510SLisandro Dalcin 17942d747510SLisandro Dalcin Notes: 17952d747510SLisandro Dalcin Users should call PetscOptionsLeftRestore() to free the memory allocated in this routine 17961c9f3c13SBarry Smith Notes: The value returned may be different on each process and depends on which options have been processed 17971c9f3c13SBarry Smith on the given process 17982d747510SLisandro Dalcin 17992d747510SLisandro Dalcin .seealso: PetscOptionsAllUsed(), PetscOptionsLeft() 18002d747510SLisandro Dalcin @*/ 18012d747510SLisandro Dalcin PetscErrorCode PetscOptionsLeftGet(PetscOptions options,PetscInt *N,char **names[],char **values[]) 18022d747510SLisandro Dalcin { 18032d747510SLisandro Dalcin PetscErrorCode ierr; 18042d747510SLisandro Dalcin PetscInt i,n; 18052d747510SLisandro Dalcin 18062d747510SLisandro Dalcin PetscFunctionBegin; 18072d747510SLisandro Dalcin if (N) PetscValidIntPointer(N,2); 18082d747510SLisandro Dalcin if (names) PetscValidPointer(names,3); 18092d747510SLisandro Dalcin if (values) PetscValidPointer(values,4); 18102d747510SLisandro Dalcin options = options ? options : defaultoptions; 18112d747510SLisandro Dalcin 18122d747510SLisandro Dalcin /* The number of unused PETSc options */ 18132d747510SLisandro Dalcin n = 0; 18142d747510SLisandro Dalcin for (i=0; i<options->N; i++) { 18152d747510SLisandro Dalcin if (!options->used[i]) n++; 18162d747510SLisandro Dalcin } 18172d747510SLisandro Dalcin if (N) { *N = n; } 18182d747510SLisandro Dalcin if (names) { ierr = PetscMalloc1(n,names);CHKERRQ(ierr); } 18192d747510SLisandro Dalcin if (values) { ierr = PetscMalloc1(n,values);CHKERRQ(ierr); } 18202d747510SLisandro Dalcin 18212d747510SLisandro Dalcin n = 0; 18222d747510SLisandro Dalcin if (names || values) { 18232d747510SLisandro Dalcin for (i=0; i<options->N; i++) { 18242d747510SLisandro Dalcin if (!options->used[i]) { 18252d747510SLisandro Dalcin if (names) (*names)[n] = options->names[i]; 18262d747510SLisandro Dalcin if (values) (*values)[n] = options->values[i]; 18272d747510SLisandro Dalcin n++; 18282d747510SLisandro Dalcin } 18292d747510SLisandro Dalcin } 18302d747510SLisandro Dalcin } 18312d747510SLisandro Dalcin PetscFunctionReturn(0); 18322d747510SLisandro Dalcin } 18332d747510SLisandro Dalcin 18342d747510SLisandro Dalcin /*@C 18352d747510SLisandro Dalcin PetscOptionsLeftRestore - Free memory for the unused PETSc options obtained using PetscOptionsLeftGet. 18362d747510SLisandro Dalcin 18372d747510SLisandro Dalcin Not Collective 18382d747510SLisandro Dalcin 18392d747510SLisandro Dalcin Input Parameter: 1840a2b725a8SWilliam Gropp + options - options database, use NULL for default global database 18412d747510SLisandro Dalcin . names - names of options not used 1842a2b725a8SWilliam Gropp - values - values of options not used 18432d747510SLisandro Dalcin 18442d747510SLisandro Dalcin Level: advanced 18452d747510SLisandro Dalcin 18462d747510SLisandro Dalcin .seealso: PetscOptionsAllUsed(), PetscOptionsLeft(), PetscOptionsLeftGet() 18472d747510SLisandro Dalcin @*/ 18482d747510SLisandro Dalcin PetscErrorCode PetscOptionsLeftRestore(PetscOptions options,PetscInt *N,char **names[],char **values[]) 18492d747510SLisandro Dalcin { 18502d747510SLisandro Dalcin PetscErrorCode ierr; 18512d747510SLisandro Dalcin 18522d747510SLisandro Dalcin PetscFunctionBegin; 18532d747510SLisandro Dalcin if (N) PetscValidIntPointer(N,2); 18542d747510SLisandro Dalcin if (names) PetscValidPointer(names,3); 18552d747510SLisandro Dalcin if (values) PetscValidPointer(values,4); 18562d747510SLisandro Dalcin if (N) { *N = 0; } 18572d747510SLisandro Dalcin if (names) { ierr = PetscFree(*names);CHKERRQ(ierr); } 18582d747510SLisandro Dalcin if (values) { ierr = PetscFree(*values);CHKERRQ(ierr); } 18592d747510SLisandro Dalcin PetscFunctionReturn(0); 18602d747510SLisandro Dalcin } 18612d747510SLisandro Dalcin 18622d747510SLisandro Dalcin /*@C 18639060e2f9SVaclav Hapla PetscOptionsMonitorDefault - Print all options set value events using the supplied PetscViewer. 18642d747510SLisandro Dalcin 18651c9f3c13SBarry Smith Logically Collective on ctx 18662d747510SLisandro Dalcin 18672d747510SLisandro Dalcin Input Parameters: 18682d747510SLisandro Dalcin + name - option name string 18692d747510SLisandro Dalcin . value - option value string 18709060e2f9SVaclav Hapla - ctx - an ASCII viewer or NULL 18712d747510SLisandro Dalcin 18722d747510SLisandro Dalcin Level: intermediate 18732d747510SLisandro Dalcin 18749666a313SBarry Smith Notes: 18759060e2f9SVaclav Hapla If ctx=NULL, PetscPrintf() is used. 18769666a313SBarry Smith The first MPI rank in the PetscViewer viewer actually prints the values, other 18771c9f3c13SBarry Smith processes may have different values set 18781c9f3c13SBarry Smith 18792d747510SLisandro Dalcin .seealso: PetscOptionsMonitorSet() 18802d747510SLisandro Dalcin @*/ 18812d747510SLisandro Dalcin PetscErrorCode PetscOptionsMonitorDefault(const char name[],const char value[],void *ctx) 18822d747510SLisandro Dalcin { 18832d747510SLisandro Dalcin PetscErrorCode ierr; 18842d747510SLisandro Dalcin 18852d747510SLisandro Dalcin PetscFunctionBegin; 18869060e2f9SVaclav Hapla if (ctx) { 18879060e2f9SVaclav Hapla PetscViewer viewer = (PetscViewer)ctx; 18882d747510SLisandro Dalcin if (!value) { 18892d747510SLisandro Dalcin ierr = PetscViewerASCIIPrintf(viewer,"Removing option: %s\n",name,value);CHKERRQ(ierr); 18902d747510SLisandro Dalcin } else if (!value[0]) { 18912d747510SLisandro Dalcin ierr = PetscViewerASCIIPrintf(viewer,"Setting option: %s (no value)\n",name);CHKERRQ(ierr); 18922d747510SLisandro Dalcin } else { 18932d747510SLisandro Dalcin ierr = PetscViewerASCIIPrintf(viewer,"Setting option: %s = %s\n",name,value);CHKERRQ(ierr); 18942d747510SLisandro Dalcin } 18959060e2f9SVaclav Hapla } else { 18969060e2f9SVaclav Hapla MPI_Comm comm = PETSC_COMM_WORLD; 18979060e2f9SVaclav Hapla if (!value) { 18989060e2f9SVaclav Hapla ierr = PetscPrintf(comm,"Removing option: %s\n",name,value);CHKERRQ(ierr); 18999060e2f9SVaclav Hapla } else if (!value[0]) { 19009060e2f9SVaclav Hapla ierr = PetscPrintf(comm,"Setting option: %s (no value)\n",name);CHKERRQ(ierr); 19019060e2f9SVaclav Hapla } else { 19029060e2f9SVaclav Hapla ierr = PetscPrintf(comm,"Setting option: %s = %s\n",name,value);CHKERRQ(ierr); 19039060e2f9SVaclav Hapla } 19049060e2f9SVaclav Hapla } 19052d747510SLisandro Dalcin PetscFunctionReturn(0); 19062d747510SLisandro Dalcin } 19072d747510SLisandro Dalcin 19082d747510SLisandro Dalcin /*@C 19092d747510SLisandro Dalcin PetscOptionsMonitorSet - Sets an ADDITIONAL function to be called at every method that 19102d747510SLisandro Dalcin modified the PETSc options database. 19112d747510SLisandro Dalcin 19122d747510SLisandro Dalcin Not Collective 19132d747510SLisandro Dalcin 19142d747510SLisandro Dalcin Input Parameters: 19152d747510SLisandro Dalcin + monitor - pointer to function (if this is NULL, it turns off monitoring 19162d747510SLisandro Dalcin . mctx - [optional] context for private data for the 19172d747510SLisandro Dalcin monitor routine (use NULL if no context is desired) 19182d747510SLisandro Dalcin - monitordestroy - [optional] routine that frees monitor context 19192d747510SLisandro Dalcin (may be NULL) 19202d747510SLisandro Dalcin 19212d747510SLisandro Dalcin Calling Sequence of monitor: 19222d747510SLisandro Dalcin $ monitor (const char name[], const char value[], void *mctx) 19232d747510SLisandro Dalcin 19242d747510SLisandro Dalcin + name - option name string 19252d747510SLisandro Dalcin . value - option value string 19262d747510SLisandro Dalcin - mctx - optional monitoring context, as set by PetscOptionsMonitorSet() 19272d747510SLisandro Dalcin 19282d747510SLisandro Dalcin Options Database Keys: 1929c5b5d8d5SVaclav Hapla See PetscInitialize() for options related to option database monitoring. 19302d747510SLisandro Dalcin 19312d747510SLisandro Dalcin Notes: 19322d747510SLisandro Dalcin The default is to do nothing. To print the name and value of options 19332d747510SLisandro Dalcin being inserted into the database, use PetscOptionsMonitorDefault() as the monitoring routine, 19342d747510SLisandro Dalcin with a null monitoring context. 19352d747510SLisandro Dalcin 19362d747510SLisandro Dalcin Several different monitoring routines may be set by calling 19372d747510SLisandro Dalcin PetscOptionsMonitorSet() multiple times; all will be called in the 19382d747510SLisandro Dalcin order in which they were set. 19392d747510SLisandro Dalcin 19409060e2f9SVaclav Hapla Level: intermediate 19412d747510SLisandro Dalcin 1942c5b5d8d5SVaclav Hapla .seealso: PetscOptionsMonitorDefault(), PetscInitialize() 19432d747510SLisandro Dalcin @*/ 19442d747510SLisandro Dalcin PetscErrorCode PetscOptionsMonitorSet(PetscErrorCode (*monitor)(const char name[], const char value[], void*),void *mctx,PetscErrorCode (*monitordestroy)(void**)) 19452d747510SLisandro Dalcin { 19462d747510SLisandro Dalcin PetscOptions options = defaultoptions; 19472d747510SLisandro Dalcin 19482d747510SLisandro Dalcin PetscFunctionBegin; 1949c5b5d8d5SVaclav Hapla if (options->monitorCancel) PetscFunctionReturn(0); 19502d747510SLisandro Dalcin if (options->numbermonitors >= MAXOPTIONSMONITORS) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Too many PetscOptions monitors set"); 19512d747510SLisandro Dalcin options->monitor[options->numbermonitors] = monitor; 19522d747510SLisandro Dalcin options->monitordestroy[options->numbermonitors] = monitordestroy; 19532d747510SLisandro Dalcin options->monitorcontext[options->numbermonitors++] = (void*)mctx; 19542d747510SLisandro Dalcin PetscFunctionReturn(0); 19552d747510SLisandro Dalcin } 19562d747510SLisandro Dalcin 19572d747510SLisandro Dalcin /* 19582d747510SLisandro Dalcin PetscOptionsStringToBool - Converts string to PetscBool, handles cases like "yes", "no", "true", "false", "0", "1", "off", "on". 195963fe8743SVaclav Hapla Empty string is considered as true. 19602d747510SLisandro Dalcin */ 19612d747510SLisandro Dalcin PetscErrorCode PetscOptionsStringToBool(const char value[],PetscBool *a) 19622d747510SLisandro Dalcin { 19632d747510SLisandro Dalcin PetscBool istrue,isfalse; 19642d747510SLisandro Dalcin size_t len; 19652d747510SLisandro Dalcin PetscErrorCode ierr; 19662d747510SLisandro Dalcin 19672d747510SLisandro Dalcin PetscFunctionBegin; 196863fe8743SVaclav Hapla /* PetscStrlen() returns 0 for NULL or "" */ 19692d747510SLisandro Dalcin ierr = PetscStrlen(value,&len);CHKERRQ(ierr); 197063fe8743SVaclav Hapla if (!len) {*a = PETSC_TRUE; PetscFunctionReturn(0);} 19712d747510SLisandro Dalcin ierr = PetscStrcasecmp(value,"TRUE",&istrue);CHKERRQ(ierr); 19722d747510SLisandro Dalcin if (istrue) {*a = PETSC_TRUE; PetscFunctionReturn(0);} 19732d747510SLisandro Dalcin ierr = PetscStrcasecmp(value,"YES",&istrue);CHKERRQ(ierr); 19742d747510SLisandro Dalcin if (istrue) {*a = PETSC_TRUE; PetscFunctionReturn(0);} 19752d747510SLisandro Dalcin ierr = PetscStrcasecmp(value,"1",&istrue);CHKERRQ(ierr); 19762d747510SLisandro Dalcin if (istrue) {*a = PETSC_TRUE; PetscFunctionReturn(0);} 19772d747510SLisandro Dalcin ierr = PetscStrcasecmp(value,"on",&istrue);CHKERRQ(ierr); 19782d747510SLisandro Dalcin if (istrue) {*a = PETSC_TRUE; PetscFunctionReturn(0);} 19792d747510SLisandro Dalcin ierr = PetscStrcasecmp(value,"FALSE",&isfalse);CHKERRQ(ierr); 19802d747510SLisandro Dalcin if (isfalse) {*a = PETSC_FALSE; PetscFunctionReturn(0);} 19812d747510SLisandro Dalcin ierr = PetscStrcasecmp(value,"NO",&isfalse);CHKERRQ(ierr); 19822d747510SLisandro Dalcin if (isfalse) {*a = PETSC_FALSE; PetscFunctionReturn(0);} 19832d747510SLisandro Dalcin ierr = PetscStrcasecmp(value,"0",&isfalse);CHKERRQ(ierr); 19842d747510SLisandro Dalcin if (isfalse) {*a = PETSC_FALSE; PetscFunctionReturn(0);} 19852d747510SLisandro Dalcin ierr = PetscStrcasecmp(value,"off",&isfalse);CHKERRQ(ierr); 19862d747510SLisandro Dalcin if (isfalse) {*a = PETSC_FALSE; PetscFunctionReturn(0);} 19872d747510SLisandro Dalcin SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Unknown logical value: %s",value); 19882d747510SLisandro Dalcin } 19892d747510SLisandro Dalcin 19902d747510SLisandro Dalcin /* 19912d747510SLisandro Dalcin PetscOptionsStringToInt - Converts a string to an integer value. Handles special cases such as "default" and "decide" 19922d747510SLisandro Dalcin */ 19932d747510SLisandro Dalcin PetscErrorCode PetscOptionsStringToInt(const char name[],PetscInt *a) 19942d747510SLisandro Dalcin { 19952d747510SLisandro Dalcin PetscErrorCode ierr; 19962d747510SLisandro Dalcin size_t len; 19972d747510SLisandro Dalcin PetscBool decide,tdefault,mouse; 19982d747510SLisandro Dalcin 19992d747510SLisandro Dalcin PetscFunctionBegin; 20002d747510SLisandro Dalcin ierr = PetscStrlen(name,&len);CHKERRQ(ierr); 20012d747510SLisandro Dalcin if (!len) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"character string of length zero has no numerical value"); 20022d747510SLisandro Dalcin 20032d747510SLisandro Dalcin ierr = PetscStrcasecmp(name,"PETSC_DEFAULT",&tdefault);CHKERRQ(ierr); 20042d747510SLisandro Dalcin if (!tdefault) { 20052d747510SLisandro Dalcin ierr = PetscStrcasecmp(name,"DEFAULT",&tdefault);CHKERRQ(ierr); 20062d747510SLisandro Dalcin } 20072d747510SLisandro Dalcin ierr = PetscStrcasecmp(name,"PETSC_DECIDE",&decide);CHKERRQ(ierr); 20082d747510SLisandro Dalcin if (!decide) { 20092d747510SLisandro Dalcin ierr = PetscStrcasecmp(name,"DECIDE",&decide);CHKERRQ(ierr); 20102d747510SLisandro Dalcin } 20112d747510SLisandro Dalcin ierr = PetscStrcasecmp(name,"mouse",&mouse);CHKERRQ(ierr); 20122d747510SLisandro Dalcin 20132d747510SLisandro Dalcin if (tdefault) *a = PETSC_DEFAULT; 20142d747510SLisandro Dalcin else if (decide) *a = PETSC_DECIDE; 20152d747510SLisandro Dalcin else if (mouse) *a = -1; 20162d747510SLisandro Dalcin else { 20172d747510SLisandro Dalcin char *endptr; 20182d747510SLisandro Dalcin long strtolval; 20192d747510SLisandro Dalcin 20202d747510SLisandro Dalcin strtolval = strtol(name,&endptr,10); 20212d747510SLisandro 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); 20222d747510SLisandro Dalcin 20232d747510SLisandro Dalcin #if defined(PETSC_USE_64BIT_INDICES) && defined(PETSC_HAVE_ATOLL) 20242d747510SLisandro Dalcin (void) strtolval; 20252d747510SLisandro Dalcin *a = atoll(name); 20262d747510SLisandro Dalcin #elif defined(PETSC_USE_64BIT_INDICES) && defined(PETSC_HAVE___INT64) 20272d747510SLisandro Dalcin (void) strtolval; 20282d747510SLisandro Dalcin *a = _atoi64(name); 20292d747510SLisandro Dalcin #else 20302d747510SLisandro Dalcin *a = (PetscInt)strtolval; 20312d747510SLisandro Dalcin #endif 20322d747510SLisandro Dalcin } 20332d747510SLisandro Dalcin PetscFunctionReturn(0); 20342d747510SLisandro Dalcin } 20352d747510SLisandro Dalcin 20362d747510SLisandro Dalcin #if defined(PETSC_USE_REAL___FLOAT128) 20372d747510SLisandro Dalcin #include <quadmath.h> 20382d747510SLisandro Dalcin #endif 20392d747510SLisandro Dalcin 20402d747510SLisandro Dalcin static PetscErrorCode PetscStrtod(const char name[],PetscReal *a,char **endptr) 20412d747510SLisandro Dalcin { 20422d747510SLisandro Dalcin PetscFunctionBegin; 20432d747510SLisandro Dalcin #if defined(PETSC_USE_REAL___FLOAT128) 20442d747510SLisandro Dalcin *a = strtoflt128(name,endptr); 20452d747510SLisandro Dalcin #else 20462d747510SLisandro Dalcin *a = (PetscReal)strtod(name,endptr); 20472d747510SLisandro Dalcin #endif 20482d747510SLisandro Dalcin PetscFunctionReturn(0); 20492d747510SLisandro Dalcin } 20502d747510SLisandro Dalcin 20512d747510SLisandro Dalcin static PetscErrorCode PetscStrtoz(const char name[],PetscScalar *a,char **endptr,PetscBool *isImaginary) 20522d747510SLisandro Dalcin { 20532d747510SLisandro Dalcin PetscBool hasi = PETSC_FALSE; 20542d747510SLisandro Dalcin char *ptr; 20552d747510SLisandro Dalcin PetscReal strtoval; 20562d747510SLisandro Dalcin PetscErrorCode ierr; 20572d747510SLisandro Dalcin 20582d747510SLisandro Dalcin PetscFunctionBegin; 20592d747510SLisandro Dalcin ierr = PetscStrtod(name,&strtoval,&ptr);CHKERRQ(ierr); 20602d747510SLisandro Dalcin if (ptr == name) { 20612d747510SLisandro Dalcin strtoval = 1.; 20622d747510SLisandro Dalcin hasi = PETSC_TRUE; 20632d747510SLisandro Dalcin if (name[0] == 'i') { 20642d747510SLisandro Dalcin ptr++; 20652d747510SLisandro Dalcin } else if (name[0] == '+' && name[1] == 'i') { 20662d747510SLisandro Dalcin ptr += 2; 20672d747510SLisandro Dalcin } else if (name[0] == '-' && name[1] == 'i') { 20682d747510SLisandro Dalcin strtoval = -1.; 20692d747510SLisandro Dalcin ptr += 2; 20702d747510SLisandro Dalcin } 20712d747510SLisandro Dalcin } else if (*ptr == 'i') { 20722d747510SLisandro Dalcin hasi = PETSC_TRUE; 20732d747510SLisandro Dalcin ptr++; 20742d747510SLisandro Dalcin } 20752d747510SLisandro Dalcin *endptr = ptr; 20762d747510SLisandro Dalcin *isImaginary = hasi; 20772d747510SLisandro Dalcin if (hasi) { 20782d747510SLisandro Dalcin #if !defined(PETSC_USE_COMPLEX) 20792d747510SLisandro Dalcin SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Input string %s contains imaginary but complex not supported ",name); 20802d747510SLisandro Dalcin #else 20812d747510SLisandro Dalcin *a = PetscCMPLX(0.,strtoval); 20822d747510SLisandro Dalcin #endif 20832d747510SLisandro Dalcin } else { 20842d747510SLisandro Dalcin *a = strtoval; 20852d747510SLisandro Dalcin } 20862d747510SLisandro Dalcin PetscFunctionReturn(0); 20872d747510SLisandro Dalcin } 20882d747510SLisandro Dalcin 20892d747510SLisandro Dalcin /* 20902d747510SLisandro Dalcin Converts a string to PetscReal value. Handles special cases like "default" and "decide" 20912d747510SLisandro Dalcin */ 20922d747510SLisandro Dalcin PetscErrorCode PetscOptionsStringToReal(const char name[],PetscReal *a) 20932d747510SLisandro Dalcin { 20942d747510SLisandro Dalcin size_t len; 20952d747510SLisandro Dalcin PetscBool match; 20962d747510SLisandro Dalcin char *endptr; 20972d747510SLisandro Dalcin PetscErrorCode ierr; 20982d747510SLisandro Dalcin 20992d747510SLisandro Dalcin PetscFunctionBegin; 21002d747510SLisandro Dalcin ierr = PetscStrlen(name,&len);CHKERRQ(ierr); 21012d747510SLisandro Dalcin if (!len) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"String of length zero has no numerical value"); 21022d747510SLisandro Dalcin 21032d747510SLisandro Dalcin ierr = PetscStrcasecmp(name,"PETSC_DEFAULT",&match);CHKERRQ(ierr); 21042d747510SLisandro Dalcin if (!match) { 21052d747510SLisandro Dalcin ierr = PetscStrcasecmp(name,"DEFAULT",&match);CHKERRQ(ierr); 21062d747510SLisandro Dalcin } 21072d747510SLisandro Dalcin if (match) {*a = PETSC_DEFAULT; PetscFunctionReturn(0);} 21082d747510SLisandro Dalcin 21092d747510SLisandro Dalcin ierr = PetscStrcasecmp(name,"PETSC_DECIDE",&match);CHKERRQ(ierr); 21102d747510SLisandro Dalcin if (!match) { 21112d747510SLisandro Dalcin ierr = PetscStrcasecmp(name,"DECIDE",&match);CHKERRQ(ierr); 21122d747510SLisandro Dalcin } 21132d747510SLisandro Dalcin if (match) {*a = PETSC_DECIDE; PetscFunctionReturn(0);} 21142d747510SLisandro Dalcin 21152d747510SLisandro Dalcin ierr = PetscStrtod(name,a,&endptr);CHKERRQ(ierr); 21162d747510SLisandro Dalcin if ((size_t) (endptr - name) != len) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Input string %s has no numeric value",name); 21172d747510SLisandro Dalcin PetscFunctionReturn(0); 21182d747510SLisandro Dalcin } 21192d747510SLisandro Dalcin 21202d747510SLisandro Dalcin PetscErrorCode PetscOptionsStringToScalar(const char name[],PetscScalar *a) 21212d747510SLisandro Dalcin { 21222d747510SLisandro Dalcin PetscBool imag1; 21232d747510SLisandro Dalcin size_t len; 21242d747510SLisandro Dalcin PetscScalar val = 0.; 21252d747510SLisandro Dalcin char *ptr = NULL; 21262d747510SLisandro Dalcin PetscErrorCode ierr; 21272d747510SLisandro Dalcin 21282d747510SLisandro Dalcin PetscFunctionBegin; 21292d747510SLisandro Dalcin ierr = PetscStrlen(name,&len);CHKERRQ(ierr); 21302d747510SLisandro Dalcin if (!len) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"character string of length zero has no numerical value"); 21312d747510SLisandro Dalcin ierr = PetscStrtoz(name,&val,&ptr,&imag1);CHKERRQ(ierr); 21322d747510SLisandro Dalcin #if defined(PETSC_USE_COMPLEX) 21332d747510SLisandro Dalcin if ((size_t) (ptr - name) < len) { 21342d747510SLisandro Dalcin PetscBool imag2; 21352d747510SLisandro Dalcin PetscScalar val2; 21362d747510SLisandro Dalcin 21372d747510SLisandro Dalcin ierr = PetscStrtoz(ptr,&val2,&ptr,&imag2);CHKERRQ(ierr); 21382d747510SLisandro Dalcin if (imag1 || !imag2) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Input string %s: must specify imaginary component second",name); 21392d747510SLisandro Dalcin val = PetscCMPLX(PetscRealPart(val),PetscImaginaryPart(val2)); 21402d747510SLisandro Dalcin } 21412d747510SLisandro Dalcin #endif 21422d747510SLisandro Dalcin if ((size_t) (ptr - name) != len) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Input string %s has no numeric value ",name); 21432d747510SLisandro Dalcin *a = val; 21442d747510SLisandro Dalcin PetscFunctionReturn(0); 21452d747510SLisandro Dalcin } 21462d747510SLisandro Dalcin 21472d747510SLisandro Dalcin /*@C 21482d747510SLisandro Dalcin PetscOptionsGetBool - Gets the Logical (true or false) value for a particular 21492d747510SLisandro Dalcin option in the database. 2150e5c89e4eSSatish Balay 2151e5c89e4eSSatish Balay Not Collective 2152e5c89e4eSSatish Balay 2153e5c89e4eSSatish Balay Input Parameters: 21545c9cc608SHong Zhang + options - options database, use NULL for default global database 2155c5929fdfSBarry Smith . pre - the string to prepend to the name or NULL 2156e5c89e4eSSatish Balay - name - the option one is seeking 2157e5c89e4eSSatish Balay 2158e5c89e4eSSatish Balay Output Parameter: 21592d747510SLisandro Dalcin + ivalue - the logical value to return 216096ef3cdfSSatish Balay - set - PETSC_TRUE if found, else PETSC_FALSE 2161e5c89e4eSSatish Balay 2162e5c89e4eSSatish Balay Level: beginner 2163e5c89e4eSSatish Balay 216495452b02SPatrick Sanan Notes: 21652d747510SLisandro Dalcin TRUE, true, YES, yes, nostring, and 1 all translate to PETSC_TRUE 21662d747510SLisandro Dalcin FALSE, false, NO, no, and 0 all translate to PETSC_FALSE 21672d747510SLisandro Dalcin 21682d747510SLisandro 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 21692d747510SLisandro Dalcin is equivalent to -requested_bool true 21702d747510SLisandro Dalcin 21712d747510SLisandro Dalcin If the user does not supply the option at all ivalue is NOT changed. Thus 21722efd9cb1SBarry Smith you should ALWAYS initialize the ivalue if you access it without first checking if the set flag is true. 21732efd9cb1SBarry Smith 2174e5c89e4eSSatish Balay .seealso: PetscOptionsGetReal(), PetscOptionsHasName(), PetscOptionsGetString(), 21752d747510SLisandro Dalcin PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsGetInt(), PetscOptionsBool(), 2176e5c89e4eSSatish Balay PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 2177e5c89e4eSSatish Balay PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 2178acfcf0e5SJed Brown PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 2179a264d7a6SBarry Smith PetscOptionsFList(), PetscOptionsEList() 2180e5c89e4eSSatish Balay @*/ 21812d747510SLisandro Dalcin PetscErrorCode PetscOptionsGetBool(PetscOptions options,const char pre[],const char name[],PetscBool *ivalue,PetscBool *set) 2182e5c89e4eSSatish Balay { 21832d747510SLisandro Dalcin const char *value; 2184ace3abfcSBarry Smith PetscBool flag; 21852d747510SLisandro Dalcin PetscErrorCode ierr; 2186e5c89e4eSSatish Balay 2187e5c89e4eSSatish Balay PetscFunctionBegin; 21882d747510SLisandro Dalcin PetscValidCharPointer(name,3); 21892d747510SLisandro Dalcin if (ivalue) PetscValidIntPointer(ivalue,4); 21902d747510SLisandro Dalcin ierr = PetscOptionsFindPair(options,pre,name,&value,&flag);CHKERRQ(ierr); 2191e5c89e4eSSatish Balay if (flag) { 219296ef3cdfSSatish Balay if (set) *set = PETSC_TRUE; 21932d747510SLisandro Dalcin ierr = PetscOptionsStringToBool(value, &flag);CHKERRQ(ierr); 21942d747510SLisandro Dalcin if (ivalue) *ivalue = flag; 2195e5c89e4eSSatish Balay } else { 219696ef3cdfSSatish Balay if (set) *set = PETSC_FALSE; 2197e5c89e4eSSatish Balay } 2198e5c89e4eSSatish Balay PetscFunctionReturn(0); 2199e5c89e4eSSatish Balay } 2200e5c89e4eSSatish Balay 2201e5c89e4eSSatish Balay /*@C 2202e5c89e4eSSatish Balay PetscOptionsGetEList - Puts a list of option values that a single one may be selected from 2203e5c89e4eSSatish Balay 2204e5c89e4eSSatish Balay Not Collective 2205e5c89e4eSSatish Balay 2206e5c89e4eSSatish Balay Input Parameters: 22075c9cc608SHong Zhang + options - options database, use NULL for default global database 2208c5929fdfSBarry Smith . pre - the string to prepend to the name or NULL 2209e5c89e4eSSatish Balay . opt - option name 2210a264d7a6SBarry Smith . list - the possible choices (one of these must be selected, anything else is invalid) 2211a2b725a8SWilliam Gropp - ntext - number of choices 2212e5c89e4eSSatish Balay 2213e5c89e4eSSatish Balay Output Parameter: 22142efd9cb1SBarry Smith + value - the index of the value to return (defaults to zero if the option name is given but no choice is listed) 2215e5c89e4eSSatish Balay - set - PETSC_TRUE if found, else PETSC_FALSE 2216e5c89e4eSSatish Balay 2217e5c89e4eSSatish Balay Level: intermediate 2218e5c89e4eSSatish Balay 221995452b02SPatrick Sanan Notes: 222095452b02SPatrick Sanan If the user does not supply the option value is NOT changed. Thus 22212efd9cb1SBarry Smith you should ALWAYS initialize the ivalue if you access it without first checking if the set flag is true. 22222efd9cb1SBarry Smith 2223a264d7a6SBarry Smith See PetscOptionsFList() for when the choices are given in a PetscFunctionList() 2224e5c89e4eSSatish Balay 2225e5c89e4eSSatish Balay .seealso: PetscOptionsGetInt(), PetscOptionsGetReal(), 2226acfcf0e5SJed Brown PetscOptionsHasName(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool(), 2227e5c89e4eSSatish Balay PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 2228e5c89e4eSSatish Balay PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 2229acfcf0e5SJed Brown PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 2230a264d7a6SBarry Smith PetscOptionsFList(), PetscOptionsEList() 2231e5c89e4eSSatish Balay @*/ 2232c5929fdfSBarry Smith PetscErrorCode PetscOptionsGetEList(PetscOptions options,const char pre[],const char opt[],const char * const *list,PetscInt ntext,PetscInt *value,PetscBool *set) 2233e5c89e4eSSatish Balay { 2234e5c89e4eSSatish Balay PetscErrorCode ierr; 223558b0ac4eSStefano Zampini size_t alen,len = 0, tlen = 0; 2236e5c89e4eSSatish Balay char *svalue; 2237ace3abfcSBarry Smith PetscBool aset,flg = PETSC_FALSE; 2238e5c89e4eSSatish Balay PetscInt i; 2239e5c89e4eSSatish Balay 2240e5c89e4eSSatish Balay PetscFunctionBegin; 22412d747510SLisandro Dalcin PetscValidCharPointer(opt,3); 2242e5c89e4eSSatish Balay for (i=0; i<ntext; i++) { 2243e5c89e4eSSatish Balay ierr = PetscStrlen(list[i],&alen);CHKERRQ(ierr); 2244e5c89e4eSSatish Balay if (alen > len) len = alen; 224558b0ac4eSStefano Zampini tlen += len + 1; 2246e5c89e4eSSatish Balay } 2247e5c89e4eSSatish Balay len += 5; /* a little extra space for user mistypes */ 2248785e854fSJed Brown ierr = PetscMalloc1(len,&svalue);CHKERRQ(ierr); 2249c5929fdfSBarry Smith ierr = PetscOptionsGetString(options,pre,opt,svalue,len,&aset);CHKERRQ(ierr); 2250e5c89e4eSSatish Balay if (aset) { 2251fbedd5e0SJed Brown ierr = PetscEListFind(ntext,list,svalue,value,&flg);CHKERRQ(ierr); 225258b0ac4eSStefano Zampini if (!flg) { 225358b0ac4eSStefano Zampini char *avail,*pavl; 225458b0ac4eSStefano Zampini 225558b0ac4eSStefano Zampini ierr = PetscMalloc1(tlen,&avail);CHKERRQ(ierr); 225658b0ac4eSStefano Zampini pavl = avail; 225758b0ac4eSStefano Zampini for (i=0; i<ntext; i++) { 225858b0ac4eSStefano Zampini ierr = PetscStrlen(list[i],&alen);CHKERRQ(ierr); 225958b0ac4eSStefano Zampini ierr = PetscStrcpy(pavl,list[i]);CHKERRQ(ierr); 226058b0ac4eSStefano Zampini pavl += alen; 226158b0ac4eSStefano Zampini ierr = PetscStrcpy(pavl," ");CHKERRQ(ierr); 226258b0ac4eSStefano Zampini pavl += 1; 226358b0ac4eSStefano Zampini } 226458b0ac4eSStefano Zampini ierr = PetscStrtolower(avail);CHKERRQ(ierr); 226558b0ac4eSStefano Zampini SETERRQ4(PETSC_COMM_SELF,PETSC_ERR_USER,"Unknown option %s for -%s%s. Available options: %s",svalue,pre ? pre : "",opt+1,avail); 226658b0ac4eSStefano Zampini } 2267fbedd5e0SJed Brown if (set) *set = PETSC_TRUE; 2268a297a907SKarl Rupp } else if (set) *set = PETSC_FALSE; 2269e5c89e4eSSatish Balay ierr = PetscFree(svalue);CHKERRQ(ierr); 2270e5c89e4eSSatish Balay PetscFunctionReturn(0); 2271e5c89e4eSSatish Balay } 2272e5c89e4eSSatish Balay 2273e5c89e4eSSatish Balay /*@C 2274e5c89e4eSSatish Balay PetscOptionsGetEnum - Gets the enum value for a particular option in the database. 2275e5c89e4eSSatish Balay 2276e5c89e4eSSatish Balay Not Collective 2277e5c89e4eSSatish Balay 2278e5c89e4eSSatish Balay Input Parameters: 22795c9cc608SHong Zhang + options - options database, use NULL for default global database 2280c5929fdfSBarry Smith . pre - option prefix or NULL 2281e5c89e4eSSatish Balay . opt - option name 2282e5c89e4eSSatish Balay . list - array containing the list of choices, followed by the enum name, followed by the enum prefix, followed by a null 2283e5c89e4eSSatish Balay - defaultv - the default (current) value 2284e5c89e4eSSatish Balay 2285e5c89e4eSSatish Balay Output Parameter: 2286e5c89e4eSSatish Balay + value - the value to return 228796ef3cdfSSatish Balay - set - PETSC_TRUE if found, else PETSC_FALSE 2288e5c89e4eSSatish Balay 2289e5c89e4eSSatish Balay Level: beginner 2290e5c89e4eSSatish Balay 229195452b02SPatrick Sanan Notes: 229295452b02SPatrick Sanan If the user does not supply the option value is NOT changed. Thus 22932efd9cb1SBarry Smith you should ALWAYS initialize the ivalue if you access it without first checking if the set flag is true. 2294e5c89e4eSSatish Balay 22952efd9cb1SBarry Smith List is usually something like PCASMTypes or some other predefined list of enum names 2296e5c89e4eSSatish Balay 2297e5c89e4eSSatish Balay .seealso: PetscOptionsGetReal(), PetscOptionsHasName(), PetscOptionsGetString(), PetscOptionsGetInt(), 2298acfcf0e5SJed Brown PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool() 2299acfcf0e5SJed Brown PetscOptionsInt(), PetscOptionsString(), PetscOptionsReal(), PetscOptionsBool(), 2300e5c89e4eSSatish Balay PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 2301e5c89e4eSSatish Balay PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 2302acfcf0e5SJed Brown PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 2303a264d7a6SBarry Smith PetscOptionsFList(), PetscOptionsEList(), PetscOptionsGetEList(), PetscOptionsEnum() 2304e5c89e4eSSatish Balay @*/ 2305c5929fdfSBarry Smith PetscErrorCode PetscOptionsGetEnum(PetscOptions options,const char pre[],const char opt[],const char * const *list,PetscEnum *value,PetscBool *set) 2306e5c89e4eSSatish Balay { 2307e5c89e4eSSatish Balay PetscErrorCode ierr; 230869a24498SJed Brown PetscInt ntext = 0,tval; 2309ace3abfcSBarry Smith PetscBool fset; 2310e5c89e4eSSatish Balay 2311e5c89e4eSSatish Balay PetscFunctionBegin; 23122d747510SLisandro Dalcin PetscValidCharPointer(opt,3); 2313e5c89e4eSSatish Balay while (list[ntext++]) { 2314e32f2f54SBarry Smith if (ntext > 50) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"List argument appears to be wrong or have more than 50 entries"); 2315e5c89e4eSSatish Balay } 2316e32f2f54SBarry Smith if (ntext < 3) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"List argument must have at least two entries: typename and type prefix"); 2317e5c89e4eSSatish Balay ntext -= 3; 2318c5929fdfSBarry Smith ierr = PetscOptionsGetEList(options,pre,opt,list,ntext,&tval,&fset);CHKERRQ(ierr); 231969a24498SJed Brown /* with PETSC_USE_64BIT_INDICES sizeof(PetscInt) != sizeof(PetscEnum) */ 2320809ceb46SBarry Smith if (fset) *value = (PetscEnum)tval; 2321809ceb46SBarry Smith if (set) *set = fset; 2322e5c89e4eSSatish Balay PetscFunctionReturn(0); 2323e5c89e4eSSatish Balay } 2324e5c89e4eSSatish Balay 2325e5c89e4eSSatish Balay /*@C 23262d747510SLisandro Dalcin PetscOptionsGetInt - Gets the integer value for a particular option in the database. 2327e5c89e4eSSatish Balay 2328e5c89e4eSSatish Balay Not Collective 2329e5c89e4eSSatish Balay 2330e5c89e4eSSatish Balay Input Parameters: 23315c9cc608SHong Zhang + options - options database, use NULL for default global database 2332c5929fdfSBarry Smith . pre - the string to prepend to the name or NULL 2333e5c89e4eSSatish Balay - name - the option one is seeking 2334e5c89e4eSSatish Balay 2335e5c89e4eSSatish Balay Output Parameter: 23362d747510SLisandro Dalcin + ivalue - the integer value to return 233796ef3cdfSSatish Balay - set - PETSC_TRUE if found, else PETSC_FALSE 2338e5c89e4eSSatish Balay 2339e5c89e4eSSatish Balay Level: beginner 2340e5c89e4eSSatish Balay 2341e5c89e4eSSatish Balay Notes: 23422d747510SLisandro Dalcin If the user does not supply the option ivalue is NOT changed. Thus 23432efd9cb1SBarry Smith you should ALWAYS initialize the ivalue if you access it without first checking if the set flag is true. 23445c07ccb8SBarry Smith 2345e5c89e4eSSatish Balay .seealso: PetscOptionsGetReal(), PetscOptionsHasName(), PetscOptionsGetString(), 23462d747510SLisandro Dalcin PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool() 23472d747510SLisandro Dalcin PetscOptionsInt(), PetscOptionsString(), PetscOptionsReal(), PetscOptionsBool(), 2348e5c89e4eSSatish Balay PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 2349e5c89e4eSSatish Balay PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 2350acfcf0e5SJed Brown PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 2351a264d7a6SBarry Smith PetscOptionsFList(), PetscOptionsEList() 2352e5c89e4eSSatish Balay @*/ 23532d747510SLisandro Dalcin PetscErrorCode PetscOptionsGetInt(PetscOptions options,const char pre[],const char name[],PetscInt *ivalue,PetscBool *set) 2354e5c89e4eSSatish Balay { 23552d747510SLisandro Dalcin const char *value; 2356e5c89e4eSSatish Balay PetscErrorCode ierr; 23572d747510SLisandro Dalcin PetscBool flag; 2358e5c89e4eSSatish Balay 2359e5c89e4eSSatish Balay PetscFunctionBegin; 23602d747510SLisandro Dalcin PetscValidCharPointer(name,3); 23612d747510SLisandro Dalcin PetscValidIntPointer(ivalue,4); 23622d747510SLisandro Dalcin ierr = PetscOptionsFindPair(options,pre,name,&value,&flag);CHKERRQ(ierr); 2363e5c89e4eSSatish Balay if (flag) { 236434a9cc2cSBarry Smith if (!value) { 23652d747510SLisandro Dalcin if (set) *set = PETSC_FALSE; 236634a9cc2cSBarry Smith } else { 23672d747510SLisandro Dalcin if (set) *set = PETSC_TRUE; 23682d747510SLisandro Dalcin ierr = PetscOptionsStringToInt(value,ivalue);CHKERRQ(ierr); 2369e5c89e4eSSatish Balay } 2370e5c89e4eSSatish Balay } else { 237196ef3cdfSSatish Balay if (set) *set = PETSC_FALSE; 2372e5c89e4eSSatish Balay } 2373e5c89e4eSSatish Balay PetscFunctionReturn(0); 2374e5c89e4eSSatish Balay } 2375e5c89e4eSSatish Balay 2376e2446a98SMatthew Knepley /*@C 2377e5c89e4eSSatish Balay PetscOptionsGetReal - Gets the double precision value for a particular 2378e5c89e4eSSatish Balay option in the database. 2379e5c89e4eSSatish Balay 2380e5c89e4eSSatish Balay Not Collective 2381e5c89e4eSSatish Balay 2382e5c89e4eSSatish Balay Input Parameters: 23835c9cc608SHong Zhang + options - options database, use NULL for default global database 2384c5929fdfSBarry Smith . pre - string to prepend to each name or NULL 2385e5c89e4eSSatish Balay - name - the option one is seeking 2386e5c89e4eSSatish Balay 2387e5c89e4eSSatish Balay Output Parameter: 2388e5c89e4eSSatish Balay + dvalue - the double value to return 238996ef3cdfSSatish Balay - set - PETSC_TRUE if found, PETSC_FALSE if not found 2390e5c89e4eSSatish Balay 239195452b02SPatrick Sanan Notes: 239295452b02SPatrick Sanan If the user does not supply the option dvalue is NOT changed. Thus 23932efd9cb1SBarry Smith you should ALWAYS initialize the ivalue if you access it without first checking if the set flag is true. 2394e4974155SBarry Smith 2395e5c89e4eSSatish Balay Level: beginner 2396e5c89e4eSSatish Balay 2397e5c89e4eSSatish Balay .seealso: PetscOptionsGetInt(), PetscOptionsHasName(), 2398acfcf0e5SJed Brown PetscOptionsGetString(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(),PetscOptionsBool(), 2399e5c89e4eSSatish Balay PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 2400e5c89e4eSSatish Balay PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 2401acfcf0e5SJed Brown PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 2402a264d7a6SBarry Smith PetscOptionsFList(), PetscOptionsEList() 2403e5c89e4eSSatish Balay @*/ 2404c5929fdfSBarry Smith PetscErrorCode PetscOptionsGetReal(PetscOptions options,const char pre[],const char name[],PetscReal *dvalue,PetscBool *set) 2405e5c89e4eSSatish Balay { 24062d747510SLisandro Dalcin const char *value; 2407ace3abfcSBarry Smith PetscBool flag; 24082d747510SLisandro Dalcin PetscErrorCode ierr; 2409e5c89e4eSSatish Balay 2410e5c89e4eSSatish Balay PetscFunctionBegin; 24112d747510SLisandro Dalcin PetscValidCharPointer(name,3); 24122d747510SLisandro Dalcin PetscValidRealPointer(dvalue,4); 24132d747510SLisandro Dalcin ierr = PetscOptionsFindPair(options,pre,name,&value,&flag);CHKERRQ(ierr); 2414e5c89e4eSSatish Balay if (flag) { 2415a297a907SKarl Rupp if (!value) { 2416a297a907SKarl Rupp if (set) *set = PETSC_FALSE; 2417a297a907SKarl Rupp } else { 2418a297a907SKarl Rupp if (set) *set = PETSC_TRUE; 2419a297a907SKarl Rupp ierr = PetscOptionsStringToReal(value,dvalue);CHKERRQ(ierr); 2420a297a907SKarl Rupp } 2421e5c89e4eSSatish Balay } else { 242296ef3cdfSSatish Balay if (set) *set = PETSC_FALSE; 2423e5c89e4eSSatish Balay } 2424e5c89e4eSSatish Balay PetscFunctionReturn(0); 2425e5c89e4eSSatish Balay } 2426e5c89e4eSSatish Balay 2427e5c89e4eSSatish Balay /*@C 2428e5c89e4eSSatish Balay PetscOptionsGetScalar - Gets the scalar value for a particular 2429e5c89e4eSSatish Balay option in the database. 2430e5c89e4eSSatish Balay 2431e5c89e4eSSatish Balay Not Collective 2432e5c89e4eSSatish Balay 2433e5c89e4eSSatish Balay Input Parameters: 24345c9cc608SHong Zhang + options - options database, use NULL for default global database 2435c5929fdfSBarry Smith . pre - string to prepend to each name or NULL 2436e5c89e4eSSatish Balay - name - the option one is seeking 2437e5c89e4eSSatish Balay 2438e5c89e4eSSatish Balay Output Parameter: 2439e5c89e4eSSatish Balay + dvalue - the double value to return 244096ef3cdfSSatish Balay - set - PETSC_TRUE if found, else PETSC_FALSE 2441e5c89e4eSSatish Balay 2442e5c89e4eSSatish Balay Level: beginner 2443e5c89e4eSSatish Balay 2444e5c89e4eSSatish Balay Usage: 2445eb4ae41dSBarry Smith A complex number 2+3i must be specified with NO spaces 2446e5c89e4eSSatish Balay 244795452b02SPatrick Sanan Notes: 244895452b02SPatrick Sanan If the user does not supply the option dvalue is NOT changed. Thus 24492efd9cb1SBarry Smith you should ALWAYS initialize the ivalue if you access it without first checking if the set flag is true. 2450e4974155SBarry Smith 2451e5c89e4eSSatish Balay .seealso: PetscOptionsGetInt(), PetscOptionsHasName(), 2452acfcf0e5SJed Brown PetscOptionsGetString(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool(), 2453e5c89e4eSSatish Balay PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 2454e5c89e4eSSatish Balay PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 2455acfcf0e5SJed Brown PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 2456a264d7a6SBarry Smith PetscOptionsFList(), PetscOptionsEList() 2457e5c89e4eSSatish Balay @*/ 2458c5929fdfSBarry Smith PetscErrorCode PetscOptionsGetScalar(PetscOptions options,const char pre[],const char name[],PetscScalar *dvalue,PetscBool *set) 2459e5c89e4eSSatish Balay { 24602d747510SLisandro Dalcin const char *value; 2461ace3abfcSBarry Smith PetscBool flag; 2462e5c89e4eSSatish Balay PetscErrorCode ierr; 2463e5c89e4eSSatish Balay 2464e5c89e4eSSatish Balay PetscFunctionBegin; 24652d747510SLisandro Dalcin PetscValidCharPointer(name,3); 24662d747510SLisandro Dalcin PetscValidScalarPointer(dvalue,4); 24672d747510SLisandro Dalcin ierr = PetscOptionsFindPair(options,pre,name,&value,&flag);CHKERRQ(ierr); 2468e5c89e4eSSatish Balay if (flag) { 2469e5c89e4eSSatish Balay if (!value) { 247096ef3cdfSSatish Balay if (set) *set = PETSC_FALSE; 2471e5c89e4eSSatish Balay } else { 2472e5c89e4eSSatish Balay #if !defined(PETSC_USE_COMPLEX) 2473cfbddea1SSatish Balay ierr = PetscOptionsStringToReal(value,dvalue);CHKERRQ(ierr); 2474e5c89e4eSSatish Balay #else 2475eb4ae41dSBarry Smith ierr = PetscOptionsStringToScalar(value,dvalue);CHKERRQ(ierr); 2476e5c89e4eSSatish Balay #endif 247796ef3cdfSSatish Balay if (set) *set = PETSC_TRUE; 2478e5c89e4eSSatish Balay } 2479e5c89e4eSSatish Balay } else { /* flag */ 248096ef3cdfSSatish Balay if (set) *set = PETSC_FALSE; 2481e5c89e4eSSatish Balay } 2482e5c89e4eSSatish Balay PetscFunctionReturn(0); 2483e5c89e4eSSatish Balay } 2484e5c89e4eSSatish Balay 2485e5c89e4eSSatish Balay /*@C 2486e5c89e4eSSatish Balay PetscOptionsGetString - Gets the string value for a particular option in 2487e5c89e4eSSatish Balay the database. 2488e5c89e4eSSatish Balay 2489e5c89e4eSSatish Balay Not Collective 2490e5c89e4eSSatish Balay 2491e5c89e4eSSatish Balay Input Parameters: 24925c9cc608SHong Zhang + options - options database, use NULL for default global database 2493c5929fdfSBarry Smith . pre - string to prepend to name or NULL 2494e5c89e4eSSatish Balay . name - the option one is seeking 2495bcbf2dc5SJed Brown - len - maximum length of the string including null termination 2496e5c89e4eSSatish Balay 2497e5c89e4eSSatish Balay Output Parameters: 2498e5c89e4eSSatish Balay + string - location to copy string 249996ef3cdfSSatish Balay - set - PETSC_TRUE if found, else PETSC_FALSE 2500e5c89e4eSSatish Balay 2501e5c89e4eSSatish Balay Level: beginner 2502e5c89e4eSSatish Balay 2503e5c89e4eSSatish Balay Fortran Note: 2504e5c89e4eSSatish Balay The Fortran interface is slightly different from the C/C++ 2505e5c89e4eSSatish Balay interface (len is not used). Sample usage in Fortran follows 2506e5c89e4eSSatish Balay .vb 2507e5c89e4eSSatish Balay character *20 string 250893e6ba5cSBarry Smith PetscErrorCode ierr 250993e6ba5cSBarry Smith PetscBool set 25101b266c99SBarry Smith call PetscOptionsGetString(PETSC_NULL_OPTIONS,PETSC_NULL_CHARACTER,'-s',string,set,ierr) 2511e5c89e4eSSatish Balay .ve 2512e5c89e4eSSatish Balay 251395452b02SPatrick Sanan Notes: 251495452b02SPatrick 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 2515e4974155SBarry Smith 25162efd9cb1SBarry Smith If the user does not use the option then the string is not changed. Thus 25172efd9cb1SBarry Smith you should ALWAYS initialize the string if you access it without first checking if the set flag is true. 25182efd9cb1SBarry Smith 2519f3dea69dSBarry Smith Note: 2520f3dea69dSBarry 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). 2521f3dea69dSBarry Smith 2522e5c89e4eSSatish Balay .seealso: PetscOptionsGetInt(), PetscOptionsGetReal(), 2523acfcf0e5SJed Brown PetscOptionsHasName(), 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 PetscOptionsGetString(PetscOptions options,const char pre[],const char name[],char string[],size_t len,PetscBool *set) 2530e5c89e4eSSatish Balay { 25312d747510SLisandro Dalcin const char *value; 2532ace3abfcSBarry Smith PetscBool flag; 25332d747510SLisandro Dalcin PetscErrorCode ierr; 2534e5c89e4eSSatish Balay 2535e5c89e4eSSatish Balay PetscFunctionBegin; 25362d747510SLisandro Dalcin PetscValidCharPointer(name,3); 25372d747510SLisandro Dalcin PetscValidCharPointer(string,4); 25382d747510SLisandro Dalcin ierr = PetscOptionsFindPair(options,pre,name,&value,&flag);CHKERRQ(ierr); 2539e5c89e4eSSatish Balay if (!flag) { 254096ef3cdfSSatish Balay if (set) *set = PETSC_FALSE; 2541e5c89e4eSSatish Balay } else { 254296ef3cdfSSatish Balay if (set) *set = PETSC_TRUE; 2543e5c89e4eSSatish Balay if (value) { 2544e5c89e4eSSatish Balay ierr = PetscStrncpy(string,value,len);CHKERRQ(ierr); 2545e5c89e4eSSatish Balay } else { 2546580bdb30SBarry Smith ierr = PetscArrayzero(string,len);CHKERRQ(ierr); 2547e5c89e4eSSatish Balay } 2548e5c89e4eSSatish Balay } 2549e5c89e4eSSatish Balay PetscFunctionReturn(0); 2550e5c89e4eSSatish Balay } 2551e5c89e4eSSatish Balay 2552c5929fdfSBarry Smith char *PetscOptionsGetStringMatlab(PetscOptions options,const char pre[],const char name[]) 255314ce751eSBarry Smith { 25542d747510SLisandro Dalcin const char *value; 255514ce751eSBarry Smith PetscBool flag; 25562d747510SLisandro Dalcin PetscErrorCode ierr; 255714ce751eSBarry Smith 255814ce751eSBarry Smith PetscFunctionBegin; 255902c9f0b5SLisandro Dalcin ierr = PetscOptionsFindPair(options,pre,name,&value,&flag);if (ierr) PetscFunctionReturn(NULL); 25602d747510SLisandro Dalcin if (flag) PetscFunctionReturn((char*)value); 256102c9f0b5SLisandro Dalcin else PetscFunctionReturn(NULL); 256214ce751eSBarry Smith } 256314ce751eSBarry Smith 25642d747510SLisandro Dalcin /*@C 25652d747510SLisandro Dalcin PetscOptionsGetBoolArray - Gets an array of Logical (true or false) values for a particular 25662d747510SLisandro Dalcin option in the database. The values must be separated with commas with 25672d747510SLisandro Dalcin no intervening spaces. 25682d747510SLisandro Dalcin 25692d747510SLisandro Dalcin Not Collective 25702d747510SLisandro Dalcin 25712d747510SLisandro Dalcin Input Parameters: 25722d747510SLisandro Dalcin + options - options database, use NULL for default global database 25732d747510SLisandro Dalcin . pre - string to prepend to each name or NULL 25742d747510SLisandro Dalcin . name - the option one is seeking 25752d747510SLisandro Dalcin - nmax - maximum number of values to retrieve 25762d747510SLisandro Dalcin 25772d747510SLisandro Dalcin Output Parameter: 25782d747510SLisandro Dalcin + dvalue - the integer values to return 25792d747510SLisandro Dalcin . nmax - actual number of values retreived 25802d747510SLisandro Dalcin - set - PETSC_TRUE if found, else PETSC_FALSE 25812d747510SLisandro Dalcin 25822d747510SLisandro Dalcin Level: beginner 25832d747510SLisandro Dalcin 25842d747510SLisandro Dalcin Notes: 25852d747510SLisandro Dalcin TRUE, true, YES, yes, nostring, and 1 all translate to PETSC_TRUE 25862d747510SLisandro Dalcin FALSE, false, NO, no, and 0 all translate to PETSC_FALSE 25872d747510SLisandro Dalcin 25882d747510SLisandro Dalcin .seealso: PetscOptionsGetInt(), PetscOptionsHasName(), 25892d747510SLisandro Dalcin PetscOptionsGetString(), PetscOptionsGetRealArray(), PetscOptionsBool(), 25902d747510SLisandro Dalcin PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 25912d747510SLisandro Dalcin PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 25922d747510SLisandro Dalcin PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 25932d747510SLisandro Dalcin PetscOptionsFList(), PetscOptionsEList() 25942d747510SLisandro Dalcin @*/ 25952d747510SLisandro Dalcin PetscErrorCode PetscOptionsGetBoolArray(PetscOptions options,const char pre[],const char name[],PetscBool dvalue[],PetscInt *nmax,PetscBool *set) 25962d747510SLisandro Dalcin { 25972d747510SLisandro Dalcin const char *svalue; 25982d747510SLisandro Dalcin char *value; 25992d747510SLisandro Dalcin PetscErrorCode ierr; 26002d747510SLisandro Dalcin PetscInt n = 0; 26012d747510SLisandro Dalcin PetscBool flag; 26022d747510SLisandro Dalcin PetscToken token; 26032d747510SLisandro Dalcin 26042d747510SLisandro Dalcin PetscFunctionBegin; 26052d747510SLisandro Dalcin PetscValidCharPointer(name,3); 26062d747510SLisandro Dalcin PetscValidIntPointer(dvalue,4); 26072d747510SLisandro Dalcin PetscValidIntPointer(nmax,5); 26082d747510SLisandro Dalcin 26092d747510SLisandro Dalcin ierr = PetscOptionsFindPair(options,pre,name,&svalue,&flag);CHKERRQ(ierr); 26102d747510SLisandro Dalcin if (!flag || !svalue) { if (set) *set = PETSC_FALSE; *nmax = 0; PetscFunctionReturn(0);} 26112d747510SLisandro Dalcin if (set) *set = PETSC_TRUE; 26122d747510SLisandro Dalcin ierr = PetscTokenCreate(svalue,',',&token);CHKERRQ(ierr); 26132d747510SLisandro Dalcin ierr = PetscTokenFind(token,&value);CHKERRQ(ierr); 26142d747510SLisandro Dalcin while (value && n < *nmax) { 26152d747510SLisandro Dalcin ierr = PetscOptionsStringToBool(value,dvalue);CHKERRQ(ierr); 26162d747510SLisandro Dalcin ierr = PetscTokenFind(token,&value);CHKERRQ(ierr); 26172d747510SLisandro Dalcin dvalue++; 26182d747510SLisandro Dalcin n++; 26192d747510SLisandro Dalcin } 26202d747510SLisandro Dalcin ierr = PetscTokenDestroy(&token);CHKERRQ(ierr); 26212d747510SLisandro Dalcin *nmax = n; 26222d747510SLisandro Dalcin PetscFunctionReturn(0); 26232d747510SLisandro Dalcin } 26242d747510SLisandro Dalcin 26252d747510SLisandro Dalcin /*@C 26262d747510SLisandro Dalcin PetscOptionsGetEnumArray - Gets an array of enum values for a particular option in the database. 26272d747510SLisandro Dalcin 26282d747510SLisandro Dalcin Not Collective 26292d747510SLisandro Dalcin 26302d747510SLisandro Dalcin Input Parameters: 26312d747510SLisandro Dalcin + options - options database, use NULL for default global database 26322d747510SLisandro Dalcin . pre - option prefix or NULL 26332d747510SLisandro Dalcin . name - option name 26342d747510SLisandro Dalcin . list - array containing the list of choices, followed by the enum name, followed by the enum prefix, followed by a null 26352d747510SLisandro Dalcin - nmax - maximum number of values to retrieve 26362d747510SLisandro Dalcin 26372d747510SLisandro Dalcin Output Parameters: 26382d747510SLisandro Dalcin + ivalue - the enum values to return 26392d747510SLisandro Dalcin . nmax - actual number of values retreived 26402d747510SLisandro Dalcin - set - PETSC_TRUE if found, else PETSC_FALSE 26412d747510SLisandro Dalcin 26422d747510SLisandro Dalcin Level: beginner 26432d747510SLisandro Dalcin 26442d747510SLisandro Dalcin Notes: 26452d747510SLisandro Dalcin The array must be passed as a comma separated list. 26462d747510SLisandro Dalcin 26472d747510SLisandro Dalcin There must be no intervening spaces between the values. 26482d747510SLisandro Dalcin 26492d747510SLisandro Dalcin list is usually something like PCASMTypes or some other predefined list of enum names. 26502d747510SLisandro Dalcin 26512d747510SLisandro Dalcin .seealso: PetscOptionsGetReal(), PetscOptionsHasName(), PetscOptionsGetString(), PetscOptionsGetInt(), 26522d747510SLisandro Dalcin PetscOptionsGetEnum(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool() 26532d747510SLisandro Dalcin PetscOptionsInt(), PetscOptionsString(), PetscOptionsReal(), PetscOptionsBool(), PetscOptionsName(), 26542d747510SLisandro Dalcin PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), PetscOptionsStringArray(),PetscOptionsRealArray(), 26552d747510SLisandro Dalcin PetscOptionsScalar(), PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 26562d747510SLisandro Dalcin PetscOptionsFList(), PetscOptionsEList(), PetscOptionsGetEList(), PetscOptionsEnum() 26572d747510SLisandro Dalcin @*/ 26582d747510SLisandro Dalcin PetscErrorCode PetscOptionsGetEnumArray(PetscOptions options,const char pre[],const char name[],const char *const *list,PetscEnum ivalue[],PetscInt *nmax,PetscBool *set) 26592d747510SLisandro Dalcin { 26602d747510SLisandro Dalcin const char *svalue; 26612d747510SLisandro Dalcin char *value; 26622d747510SLisandro Dalcin PetscInt n = 0; 26632d747510SLisandro Dalcin PetscEnum evalue; 26642d747510SLisandro Dalcin PetscBool flag; 26652d747510SLisandro Dalcin PetscToken token; 26662d747510SLisandro Dalcin PetscErrorCode ierr; 26672d747510SLisandro Dalcin 26682d747510SLisandro Dalcin PetscFunctionBegin; 26692d747510SLisandro Dalcin PetscValidCharPointer(name,3); 26702d747510SLisandro Dalcin PetscValidPointer(list,4); 26712d747510SLisandro Dalcin PetscValidPointer(ivalue,5); 26722d747510SLisandro Dalcin PetscValidIntPointer(nmax,6); 26732d747510SLisandro Dalcin 26742d747510SLisandro Dalcin ierr = PetscOptionsFindPair(options,pre,name,&svalue,&flag);CHKERRQ(ierr); 26752d747510SLisandro Dalcin if (!flag || !svalue) { if (set) *set = PETSC_FALSE; *nmax = 0; PetscFunctionReturn(0);} 26762d747510SLisandro Dalcin if (set) *set = PETSC_TRUE; 26772d747510SLisandro Dalcin ierr = PetscTokenCreate(svalue,',',&token);CHKERRQ(ierr); 26782d747510SLisandro Dalcin ierr = PetscTokenFind(token,&value);CHKERRQ(ierr); 26792d747510SLisandro Dalcin while (value && n < *nmax) { 26802d747510SLisandro Dalcin ierr = PetscEnumFind(list,value,&evalue,&flag);CHKERRQ(ierr); 26812d747510SLisandro Dalcin if (!flag) SETERRQ3(PETSC_COMM_SELF,PETSC_ERR_USER,"Unknown enum value '%s' for -%s%s",svalue,pre ? pre : "",name+1); 26822d747510SLisandro Dalcin ivalue[n++] = evalue; 26832d747510SLisandro Dalcin ierr = PetscTokenFind(token,&value);CHKERRQ(ierr); 26842d747510SLisandro Dalcin } 26852d747510SLisandro Dalcin ierr = PetscTokenDestroy(&token);CHKERRQ(ierr); 26862d747510SLisandro Dalcin *nmax = n; 26872d747510SLisandro Dalcin PetscFunctionReturn(0); 26882d747510SLisandro Dalcin } 26892d747510SLisandro Dalcin 26902d747510SLisandro Dalcin /*@C 26912d747510SLisandro Dalcin PetscOptionsGetIntArray - Gets an array of integer values for a particular 26922d747510SLisandro Dalcin option in the database. 26932d747510SLisandro Dalcin 26942d747510SLisandro Dalcin Not Collective 26952d747510SLisandro Dalcin 26962d747510SLisandro Dalcin Input Parameters: 26972d747510SLisandro Dalcin + options - options database, use NULL for default global database 26982d747510SLisandro Dalcin . pre - string to prepend to each name or NULL 26992d747510SLisandro Dalcin . name - the option one is seeking 27002d747510SLisandro Dalcin - nmax - maximum number of values to retrieve 27012d747510SLisandro Dalcin 27022d747510SLisandro Dalcin Output Parameter: 27032d747510SLisandro Dalcin + ivalue - the integer values to return 27042d747510SLisandro Dalcin . nmax - actual number of values retreived 27052d747510SLisandro Dalcin - set - PETSC_TRUE if found, else PETSC_FALSE 27062d747510SLisandro Dalcin 27072d747510SLisandro Dalcin Level: beginner 27082d747510SLisandro Dalcin 27092d747510SLisandro Dalcin Notes: 27102d747510SLisandro Dalcin The array can be passed as 27112d747510SLisandro Dalcin a comma separated list: 0,1,2,3,4,5,6,7 27122d747510SLisandro Dalcin a range (start-end+1): 0-8 27132d747510SLisandro Dalcin a range with given increment (start-end+1:inc): 0-7:2 27142d747510SLisandro Dalcin a combination of values and ranges separated by commas: 0,1-8,8-15:2 27152d747510SLisandro Dalcin 27162d747510SLisandro Dalcin There must be no intervening spaces between the values. 27172d747510SLisandro Dalcin 27182d747510SLisandro Dalcin .seealso: PetscOptionsGetInt(), PetscOptionsHasName(), 27192d747510SLisandro Dalcin PetscOptionsGetString(), PetscOptionsGetRealArray(), PetscOptionsBool(), 27202d747510SLisandro Dalcin PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 27212d747510SLisandro Dalcin PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 27222d747510SLisandro Dalcin PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 27232d747510SLisandro Dalcin PetscOptionsFList(), PetscOptionsEList() 27242d747510SLisandro Dalcin @*/ 27252d747510SLisandro Dalcin PetscErrorCode PetscOptionsGetIntArray(PetscOptions options,const char pre[],const char name[],PetscInt ivalue[],PetscInt *nmax,PetscBool *set) 27262d747510SLisandro Dalcin { 27272d747510SLisandro Dalcin const char *svalue; 27282d747510SLisandro Dalcin char *value; 27292d747510SLisandro Dalcin PetscErrorCode ierr; 27302d747510SLisandro Dalcin PetscInt n = 0,i,j,start,end,inc,nvalues; 27312d747510SLisandro Dalcin size_t len; 27322d747510SLisandro Dalcin PetscBool flag,foundrange; 27332d747510SLisandro Dalcin PetscToken token; 27342d747510SLisandro Dalcin 27352d747510SLisandro Dalcin PetscFunctionBegin; 27362d747510SLisandro Dalcin PetscValidCharPointer(name,3); 27372d747510SLisandro Dalcin PetscValidIntPointer(ivalue,4); 27382d747510SLisandro Dalcin PetscValidIntPointer(nmax,5); 27392d747510SLisandro Dalcin 27402d747510SLisandro Dalcin ierr = PetscOptionsFindPair(options,pre,name,&svalue,&flag);CHKERRQ(ierr); 27412d747510SLisandro Dalcin if (!flag || !svalue) { if (set) *set = PETSC_FALSE; *nmax = 0; PetscFunctionReturn(0);} 27422d747510SLisandro Dalcin if (set) *set = PETSC_TRUE; 27432d747510SLisandro Dalcin ierr = PetscTokenCreate(svalue,',',&token);CHKERRQ(ierr); 27442d747510SLisandro Dalcin ierr = PetscTokenFind(token,&value);CHKERRQ(ierr); 27452d747510SLisandro Dalcin while (value && n < *nmax) { 27462d747510SLisandro Dalcin /* look for form d-D where d and D are integers */ 27472d747510SLisandro Dalcin foundrange = PETSC_FALSE; 27482d747510SLisandro Dalcin ierr = PetscStrlen(value,&len);CHKERRQ(ierr); 27492d747510SLisandro Dalcin if (value[0] == '-') i=2; 27502d747510SLisandro Dalcin else i=1; 27512d747510SLisandro Dalcin for (;i<(int)len; i++) { 27522d747510SLisandro Dalcin if (value[i] == '-') { 27532d747510SLisandro Dalcin if (i == (int)len-1) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_USER,"Error in %D-th array entry %s\n",n,value); 27542d747510SLisandro Dalcin value[i] = 0; 27552d747510SLisandro Dalcin 27562d747510SLisandro Dalcin ierr = PetscOptionsStringToInt(value,&start);CHKERRQ(ierr); 27572d747510SLisandro Dalcin inc = 1; 27582d747510SLisandro Dalcin j = i+1; 27592d747510SLisandro Dalcin for (;j<(int)len; j++) { 27602d747510SLisandro Dalcin if (value[j] == ':') { 27612d747510SLisandro Dalcin value[j] = 0; 27622d747510SLisandro Dalcin 27632d747510SLisandro Dalcin ierr = PetscOptionsStringToInt(value+j+1,&inc);CHKERRQ(ierr); 27642d747510SLisandro 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); 27652d747510SLisandro Dalcin break; 27662d747510SLisandro Dalcin } 27672d747510SLisandro Dalcin } 27682d747510SLisandro Dalcin ierr = PetscOptionsStringToInt(value+i+1,&end);CHKERRQ(ierr); 27692d747510SLisandro 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); 27702d747510SLisandro Dalcin nvalues = (end-start)/inc + (end-start)%inc; 27712d747510SLisandro 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); 27722d747510SLisandro Dalcin for (;start<end; start+=inc) { 27732d747510SLisandro Dalcin *ivalue = start; ivalue++;n++; 27742d747510SLisandro Dalcin } 27752d747510SLisandro Dalcin foundrange = PETSC_TRUE; 27762d747510SLisandro Dalcin break; 27772d747510SLisandro Dalcin } 27782d747510SLisandro Dalcin } 27792d747510SLisandro Dalcin if (!foundrange) { 27802d747510SLisandro Dalcin ierr = PetscOptionsStringToInt(value,ivalue);CHKERRQ(ierr); 27812d747510SLisandro Dalcin ivalue++; 27822d747510SLisandro Dalcin n++; 27832d747510SLisandro Dalcin } 27842d747510SLisandro Dalcin ierr = PetscTokenFind(token,&value);CHKERRQ(ierr); 27852d747510SLisandro Dalcin } 27862d747510SLisandro Dalcin ierr = PetscTokenDestroy(&token);CHKERRQ(ierr); 27872d747510SLisandro Dalcin *nmax = n; 27882d747510SLisandro Dalcin PetscFunctionReturn(0); 27892d747510SLisandro Dalcin } 27902d747510SLisandro Dalcin 27912d747510SLisandro Dalcin /*@C 27922d747510SLisandro Dalcin PetscOptionsGetRealArray - Gets an array of double precision values for a 27932d747510SLisandro Dalcin particular option in the database. The values must be separated with 27942d747510SLisandro Dalcin commas with no intervening spaces. 27952d747510SLisandro Dalcin 27962d747510SLisandro Dalcin Not Collective 27972d747510SLisandro Dalcin 27982d747510SLisandro Dalcin Input Parameters: 27992d747510SLisandro Dalcin + options - options database, use NULL for default global database 28002d747510SLisandro Dalcin . pre - string to prepend to each name or NULL 28012d747510SLisandro Dalcin . name - the option one is seeking 28022d747510SLisandro Dalcin - nmax - maximum number of values to retrieve 28032d747510SLisandro Dalcin 28042d747510SLisandro Dalcin Output Parameters: 28052d747510SLisandro Dalcin + dvalue - the double values to return 28062d747510SLisandro Dalcin . nmax - actual number of values retreived 28072d747510SLisandro Dalcin - set - PETSC_TRUE if found, else PETSC_FALSE 28082d747510SLisandro Dalcin 28092d747510SLisandro Dalcin Level: beginner 28102d747510SLisandro Dalcin 28112d747510SLisandro Dalcin .seealso: PetscOptionsGetInt(), PetscOptionsHasName(), 28122d747510SLisandro Dalcin PetscOptionsGetString(), PetscOptionsGetIntArray(), PetscOptionsBool(), 28132d747510SLisandro Dalcin PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 28142d747510SLisandro Dalcin PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 28152d747510SLisandro Dalcin PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 28162d747510SLisandro Dalcin PetscOptionsFList(), PetscOptionsEList() 28172d747510SLisandro Dalcin @*/ 28182d747510SLisandro Dalcin PetscErrorCode PetscOptionsGetRealArray(PetscOptions options,const char pre[],const char name[],PetscReal dvalue[],PetscInt *nmax,PetscBool *set) 28192d747510SLisandro Dalcin { 28202d747510SLisandro Dalcin const char *svalue; 28212d747510SLisandro Dalcin char *value; 28222d747510SLisandro Dalcin PetscErrorCode ierr; 28232d747510SLisandro Dalcin PetscInt n = 0; 28242d747510SLisandro Dalcin PetscBool flag; 28252d747510SLisandro Dalcin PetscToken token; 28262d747510SLisandro Dalcin 28272d747510SLisandro Dalcin PetscFunctionBegin; 28282d747510SLisandro Dalcin PetscValidCharPointer(name,3); 28292d747510SLisandro Dalcin PetscValidRealPointer(dvalue,4); 28302d747510SLisandro Dalcin PetscValidIntPointer(nmax,5); 28312d747510SLisandro Dalcin 28322d747510SLisandro Dalcin ierr = PetscOptionsFindPair(options,pre,name,&svalue,&flag);CHKERRQ(ierr); 28332d747510SLisandro Dalcin if (!flag || !svalue) { if (set) *set = PETSC_FALSE; *nmax = 0; PetscFunctionReturn(0);} 28342d747510SLisandro Dalcin if (set) *set = PETSC_TRUE; 28352d747510SLisandro Dalcin ierr = PetscTokenCreate(svalue,',',&token);CHKERRQ(ierr); 28362d747510SLisandro Dalcin ierr = PetscTokenFind(token,&value);CHKERRQ(ierr); 28372d747510SLisandro Dalcin while (value && n < *nmax) { 28382d747510SLisandro Dalcin ierr = PetscOptionsStringToReal(value,dvalue++);CHKERRQ(ierr); 28392d747510SLisandro Dalcin ierr = PetscTokenFind(token,&value);CHKERRQ(ierr); 28402d747510SLisandro Dalcin n++; 28412d747510SLisandro Dalcin } 28422d747510SLisandro Dalcin ierr = PetscTokenDestroy(&token);CHKERRQ(ierr); 28432d747510SLisandro Dalcin *nmax = n; 28442d747510SLisandro Dalcin PetscFunctionReturn(0); 28452d747510SLisandro Dalcin } 28462d747510SLisandro Dalcin 28472d747510SLisandro Dalcin /*@C 28482d747510SLisandro Dalcin PetscOptionsGetScalarArray - Gets an array of scalars for a 28492d747510SLisandro Dalcin particular option in the database. The values must be separated with 28502d747510SLisandro Dalcin commas with no intervening spaces. 28512d747510SLisandro Dalcin 28522d747510SLisandro Dalcin Not Collective 28532d747510SLisandro Dalcin 28542d747510SLisandro Dalcin Input Parameters: 28552d747510SLisandro Dalcin + options - options database, use NULL for default global database 28562d747510SLisandro Dalcin . pre - string to prepend to each name or NULL 28572d747510SLisandro Dalcin . name - the option one is seeking 28582d747510SLisandro Dalcin - nmax - maximum number of values to retrieve 28592d747510SLisandro Dalcin 28602d747510SLisandro Dalcin Output Parameters: 28612d747510SLisandro Dalcin + dvalue - the scalar values to return 28622d747510SLisandro Dalcin . nmax - actual number of values retreived 28632d747510SLisandro Dalcin - set - PETSC_TRUE if found, else PETSC_FALSE 28642d747510SLisandro Dalcin 28652d747510SLisandro Dalcin Level: beginner 28662d747510SLisandro Dalcin 28672d747510SLisandro Dalcin .seealso: PetscOptionsGetInt(), PetscOptionsHasName(), 28682d747510SLisandro Dalcin PetscOptionsGetString(), PetscOptionsGetIntArray(), PetscOptionsBool(), 28692d747510SLisandro Dalcin PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 28702d747510SLisandro Dalcin PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 28712d747510SLisandro Dalcin PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 28722d747510SLisandro Dalcin PetscOptionsFList(), PetscOptionsEList() 28732d747510SLisandro Dalcin @*/ 28742d747510SLisandro Dalcin PetscErrorCode PetscOptionsGetScalarArray(PetscOptions options,const char pre[],const char name[],PetscScalar dvalue[],PetscInt *nmax,PetscBool *set) 28752d747510SLisandro Dalcin { 28762d747510SLisandro Dalcin const char *svalue; 28772d747510SLisandro Dalcin char *value; 28782d747510SLisandro Dalcin PetscErrorCode ierr; 28792d747510SLisandro Dalcin PetscInt n = 0; 28802d747510SLisandro Dalcin PetscBool flag; 28812d747510SLisandro Dalcin PetscToken token; 28822d747510SLisandro Dalcin 28832d747510SLisandro Dalcin PetscFunctionBegin; 28842d747510SLisandro Dalcin PetscValidCharPointer(name,3); 28852d747510SLisandro Dalcin PetscValidRealPointer(dvalue,4); 28862d747510SLisandro Dalcin PetscValidIntPointer(nmax,5); 28872d747510SLisandro Dalcin 28882d747510SLisandro Dalcin ierr = PetscOptionsFindPair(options,pre,name,&svalue,&flag);CHKERRQ(ierr); 28892d747510SLisandro Dalcin if (!flag || !svalue) { if (set) *set = PETSC_FALSE; *nmax = 0; PetscFunctionReturn(0);} 28902d747510SLisandro Dalcin if (set) *set = PETSC_TRUE; 28912d747510SLisandro Dalcin ierr = PetscTokenCreate(svalue,',',&token);CHKERRQ(ierr); 28922d747510SLisandro Dalcin ierr = PetscTokenFind(token,&value);CHKERRQ(ierr); 28932d747510SLisandro Dalcin while (value && n < *nmax) { 28942d747510SLisandro Dalcin ierr = PetscOptionsStringToScalar(value,dvalue++);CHKERRQ(ierr); 28952d747510SLisandro Dalcin ierr = PetscTokenFind(token,&value);CHKERRQ(ierr); 28962d747510SLisandro Dalcin n++; 28972d747510SLisandro Dalcin } 28982d747510SLisandro Dalcin ierr = PetscTokenDestroy(&token);CHKERRQ(ierr); 28992d747510SLisandro Dalcin *nmax = n; 29002d747510SLisandro Dalcin PetscFunctionReturn(0); 29012d747510SLisandro Dalcin } 290214ce751eSBarry Smith 2903e5c89e4eSSatish Balay /*@C 2904e5c89e4eSSatish Balay PetscOptionsGetStringArray - Gets an array of string values for a particular 2905e5c89e4eSSatish Balay option in the database. The values must be separated with commas with 2906e5c89e4eSSatish Balay no intervening spaces. 2907e5c89e4eSSatish Balay 2908e5c89e4eSSatish Balay Not Collective 2909e5c89e4eSSatish Balay 2910e5c89e4eSSatish Balay Input Parameters: 29115c9cc608SHong Zhang + options - options database, use NULL for default global database 2912c5929fdfSBarry Smith . pre - string to prepend to name or NULL 2913e5c89e4eSSatish Balay . name - the option one is seeking 2914e5c89e4eSSatish Balay - nmax - maximum number of strings 2915e5c89e4eSSatish Balay 2916e7b76fa7SPatrick Sanan Output Parameters: 2917e5c89e4eSSatish Balay + strings - location to copy strings 2918e7b76fa7SPatrick Sanan . nmax - the number of strings found 291996ef3cdfSSatish Balay - set - PETSC_TRUE if found, else PETSC_FALSE 2920e5c89e4eSSatish Balay 2921e5c89e4eSSatish Balay Level: beginner 2922e5c89e4eSSatish Balay 2923e5c89e4eSSatish Balay Notes: 2924e7b76fa7SPatrick Sanan The nmax parameter is used for both input and output. 2925e7b76fa7SPatrick Sanan 2926e5c89e4eSSatish Balay The user should pass in an array of pointers to char, to hold all the 2927e5c89e4eSSatish Balay strings returned by this function. 2928e5c89e4eSSatish Balay 2929e5c89e4eSSatish Balay The user is responsible for deallocating the strings that are 2930e5c89e4eSSatish Balay returned. The Fortran interface for this routine is not supported. 2931e5c89e4eSSatish Balay 2932e5c89e4eSSatish Balay .seealso: PetscOptionsGetInt(), PetscOptionsGetReal(), 2933acfcf0e5SJed Brown PetscOptionsHasName(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool(), 2934e5c89e4eSSatish Balay PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 2935e5c89e4eSSatish Balay PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 2936acfcf0e5SJed Brown PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 2937a264d7a6SBarry Smith PetscOptionsFList(), PetscOptionsEList() 2938e5c89e4eSSatish Balay @*/ 2939c5929fdfSBarry Smith PetscErrorCode PetscOptionsGetStringArray(PetscOptions options,const char pre[],const char name[],char *strings[],PetscInt *nmax,PetscBool *set) 2940e5c89e4eSSatish Balay { 29412d747510SLisandro Dalcin const char *svalue; 2942e5c89e4eSSatish Balay char *value; 2943e5c89e4eSSatish Balay PetscErrorCode ierr; 29442d747510SLisandro Dalcin PetscInt n = 0; 2945ace3abfcSBarry Smith PetscBool flag; 29469c9d3cfdSBarry Smith PetscToken token; 2947e5c89e4eSSatish Balay 2948e5c89e4eSSatish Balay PetscFunctionBegin; 29492d747510SLisandro Dalcin PetscValidCharPointer(name,3); 29502d747510SLisandro Dalcin PetscValidPointer(strings,4); 29512d747510SLisandro Dalcin PetscValidIntPointer(nmax,5); 2952e5c89e4eSSatish Balay 29532d747510SLisandro Dalcin ierr = PetscOptionsFindPair(options,pre,name,&svalue,&flag);CHKERRQ(ierr); 29542d747510SLisandro Dalcin if (!flag || !svalue) { if (set) *set = PETSC_FALSE; *nmax = 0; PetscFunctionReturn(0);} 29552d747510SLisandro Dalcin if (set) *set = PETSC_TRUE; 29562d747510SLisandro Dalcin ierr = PetscTokenCreate(svalue,',',&token);CHKERRQ(ierr); 2957e5c89e4eSSatish Balay ierr = PetscTokenFind(token,&value);CHKERRQ(ierr); 29582d747510SLisandro Dalcin while (value && n < *nmax) { 2959e5c89e4eSSatish Balay ierr = PetscStrallocpy(value,&strings[n]);CHKERRQ(ierr); 2960e5c89e4eSSatish Balay ierr = PetscTokenFind(token,&value);CHKERRQ(ierr); 2961e5c89e4eSSatish Balay n++; 2962e5c89e4eSSatish Balay } 29638c74ee41SBarry Smith ierr = PetscTokenDestroy(&token);CHKERRQ(ierr); 2964e5c89e4eSSatish Balay *nmax = n; 2965e5c89e4eSSatish Balay PetscFunctionReturn(0); 2966e5c89e4eSSatish Balay } 296706824ed3SPatrick Sanan 296806824ed3SPatrick Sanan /*@C 296906824ed3SPatrick Sanan PetscOptionsDeprecated - mark an option as deprecated, optionally replacing it with a new one 297006824ed3SPatrick Sanan 297106824ed3SPatrick Sanan Prints a deprecation warning, unless an option is supplied to suppress. 297206824ed3SPatrick Sanan 29731c9f3c13SBarry Smith Logically Collective 297406824ed3SPatrick Sanan 297506824ed3SPatrick Sanan Input Parameters: 29769503aa97SPatrick Sanan + pre - string to prepend to name or NULL 297706824ed3SPatrick Sanan . oldname - the old, deprecated option 297806824ed3SPatrick Sanan . newname - the new option, or NULL if option is purely removed 29799f3a6782SPatrick Sanan . version - a string describing the version of first deprecation, e.g. "3.9" 29809f3a6782SPatrick Sanan - info - additional information string, or NULL. 298106824ed3SPatrick Sanan 298206824ed3SPatrick Sanan Options Database Keys: 298306824ed3SPatrick Sanan . -options_suppress_deprecated_warnings - do not print deprecation warnings 298406824ed3SPatrick Sanan 298506824ed3SPatrick Sanan Notes: 29861c9f3c13SBarry Smith Must be called between PetscOptionsBegin() (or PetscObjectOptionsBegin()) and PetscOptionsEnd(). 29871c9f3c13SBarry Smith Only the proces of rank zero that owns the PetscOptionsItems are argument (managed by PetscOptionsBegin() or 29881c9f3c13SBarry Smith PetscObjectOptionsBegin() prints the information 2989b40114eaSPatrick Sanan If newname is provided, the old option is replaced. Otherwise, it remains 2990b40114eaSPatrick Sanan in the options database. 29919f3a6782SPatrick Sanan If an option is not replaced, the info argument should be used to advise the user 29929f3a6782SPatrick Sanan on how to proceed. 29939f3a6782SPatrick Sanan There is a limit on the length of the warning printed, so very long strings 29949f3a6782SPatrick Sanan provided as info may be truncated. 299506824ed3SPatrick Sanan 299606824ed3SPatrick Sanan Level: developer 299706824ed3SPatrick Sanan 299806824ed3SPatrick Sanan .seealso: PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsScalar(), PetscOptionsBool(), PetscOptionsString(), PetscOptionsSetValue() 299906824ed3SPatrick Sanan 300006824ed3SPatrick Sanan @*/ 30019f3a6782SPatrick Sanan PetscErrorCode PetscOptionsDeprecated_Private(PetscOptionItems *PetscOptionsObject,const char oldname[],const char newname[],const char version[],const char info[]) 300206824ed3SPatrick Sanan { 300306824ed3SPatrick Sanan PetscErrorCode ierr; 300406824ed3SPatrick Sanan PetscBool found,quiet; 300506824ed3SPatrick Sanan const char *value; 300606824ed3SPatrick Sanan const char * const quietopt="-options_suppress_deprecated_warnings"; 30079f3a6782SPatrick Sanan char msg[4096]; 3008b0bdc838SStefano Zampini char *prefix = NULL; 3009b0bdc838SStefano Zampini PetscOptions options = NULL; 3010b0bdc838SStefano Zampini MPI_Comm comm = PETSC_COMM_SELF; 301106824ed3SPatrick Sanan 301206824ed3SPatrick Sanan PetscFunctionBegin; 301306824ed3SPatrick Sanan PetscValidCharPointer(oldname,2); 301406824ed3SPatrick Sanan PetscValidCharPointer(version,4); 3015b0bdc838SStefano Zampini if (PetscOptionsObject) { 3016b0bdc838SStefano Zampini prefix = PetscOptionsObject->prefix; 3017b0bdc838SStefano Zampini options = PetscOptionsObject->options; 3018b0bdc838SStefano Zampini comm = PetscOptionsObject->comm; 3019b0bdc838SStefano Zampini } 3020b0bdc838SStefano Zampini ierr = PetscOptionsFindPair(options,prefix,oldname,&value,&found);CHKERRQ(ierr); 302106824ed3SPatrick Sanan if (found) { 302206824ed3SPatrick Sanan if (newname) { 3023b0bdc838SStefano Zampini if (prefix) { 3024b0bdc838SStefano Zampini ierr = PetscOptionsPrefixPush(options,prefix);CHKERRQ(ierr); 3025d255429eSPatrick Sanan } 3026b0bdc838SStefano Zampini ierr = PetscOptionsSetValue(options,newname,value);CHKERRQ(ierr); 3027b0bdc838SStefano Zampini if (prefix) { 3028b0bdc838SStefano Zampini ierr = PetscOptionsPrefixPop(options);CHKERRQ(ierr); 3029d255429eSPatrick Sanan } 3030b0bdc838SStefano Zampini ierr = PetscOptionsClearValue(options,oldname);CHKERRQ(ierr); 3031b40114eaSPatrick Sanan } 303206824ed3SPatrick Sanan quiet = PETSC_FALSE; 3033b0bdc838SStefano Zampini ierr = PetscOptionsGetBool(options,NULL,quietopt,&quiet,NULL);CHKERRQ(ierr); 303406824ed3SPatrick Sanan if (!quiet) { 30359f3a6782SPatrick Sanan ierr = PetscStrcpy(msg,"** PETSc DEPRECATION WARNING ** : the option ");CHKERRQ(ierr); 30361fa95f81SSatish Balay ierr = PetscStrcat(msg,oldname);CHKERRQ(ierr); 3037928bb9adSStefano Zampini ierr = PetscStrcat(msg," is deprecated as of version ");CHKERRQ(ierr); 30389f3a6782SPatrick Sanan ierr = PetscStrcat(msg,version);CHKERRQ(ierr); 30399f3a6782SPatrick Sanan ierr = PetscStrcat(msg," and will be removed in a future release.");CHKERRQ(ierr); 304006824ed3SPatrick Sanan if (newname) { 30419f3a6782SPatrick Sanan ierr = PetscStrcat(msg," Please use the option ");CHKERRQ(ierr); 30429f3a6782SPatrick Sanan ierr = PetscStrcat(msg,newname);CHKERRQ(ierr); 30439f3a6782SPatrick Sanan ierr = PetscStrcat(msg," instead.");CHKERRQ(ierr); 304406824ed3SPatrick Sanan } 30459f3a6782SPatrick Sanan if (info) { 30469f3a6782SPatrick Sanan ierr = PetscStrcat(msg," ");CHKERRQ(ierr); 30479f3a6782SPatrick Sanan ierr = PetscStrcat(msg,info);CHKERRQ(ierr); 30489f3a6782SPatrick Sanan } 30499f3a6782SPatrick Sanan ierr = PetscStrcat(msg," (Silence this warning with ");CHKERRQ(ierr); 30509f3a6782SPatrick Sanan ierr = PetscStrcat(msg,quietopt);CHKERRQ(ierr); 30519f3a6782SPatrick Sanan ierr = PetscStrcat(msg,")\n");CHKERRQ(ierr); 3052b0bdc838SStefano Zampini ierr = PetscPrintf(comm,msg);CHKERRQ(ierr); 305306824ed3SPatrick Sanan } 305406824ed3SPatrick Sanan } 305506824ed3SPatrick Sanan PetscFunctionReturn(0); 305606824ed3SPatrick Sanan } 3057