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 213bcbd388SSean Farley #if defined(PETSC_HAVE_YAML) 223bcbd388SSean Farley #include <yaml.h> 233bcbd388SSean Farley #endif 24e5c89e4eSSatish Balay 252d747510SLisandro Dalcin #if defined(PETSC_HAVE_STRCASECMP) 262d747510SLisandro Dalcin #define PetscOptNameCmp(a,b) strcasecmp(a,b) 272d747510SLisandro Dalcin #elif defined(PETSC_HAVE_STRICMP) 282d747510SLisandro Dalcin #define PetscOptNameCmp(a,b) stricmp(a,b) 292d747510SLisandro Dalcin #else 302d747510SLisandro Dalcin #define PetscOptNameCmp(a,b) Error_strcasecmp_not_found 312d747510SLisandro Dalcin #endif 322d747510SLisandro Dalcin 332d747510SLisandro Dalcin #include <petsc/private/hashtable.h> 342d747510SLisandro Dalcin 352d747510SLisandro Dalcin /* This assumes ASCII encoding and ignores locale settings */ 362d747510SLisandro Dalcin /* Using tolower() is about 2X slower in microbenchmarks */ 372d747510SLisandro Dalcin PETSC_STATIC_INLINE int PetscToLower(int c) 382d747510SLisandro Dalcin { 392d747510SLisandro Dalcin return ((c >= 'A') & (c <= 'Z')) ? c + 'a' - 'A' : c; 402d747510SLisandro Dalcin } 412d747510SLisandro Dalcin 422d747510SLisandro Dalcin /* Bob Jenkins's one at a time hash function (case-insensitive) */ 432d747510SLisandro Dalcin PETSC_STATIC_INLINE unsigned int PetscOptHash(const char key[]) 442d747510SLisandro Dalcin { 452d747510SLisandro Dalcin unsigned int hash = 0; 462d747510SLisandro Dalcin while (*key) { 472d747510SLisandro Dalcin hash += PetscToLower(*key++); 482d747510SLisandro Dalcin hash += hash << 10; 492d747510SLisandro Dalcin hash ^= hash >> 6; 502d747510SLisandro Dalcin } 512d747510SLisandro Dalcin hash += hash << 3; 522d747510SLisandro Dalcin hash ^= hash >> 11; 532d747510SLisandro Dalcin hash += hash << 15; 542d747510SLisandro Dalcin return hash; 552d747510SLisandro Dalcin } 562d747510SLisandro Dalcin 572d747510SLisandro Dalcin PETSC_STATIC_INLINE int PetscOptEqual(const char a[],const char b[]) 582d747510SLisandro Dalcin { 592d747510SLisandro Dalcin return !PetscOptNameCmp(a,b); 602d747510SLisandro Dalcin } 612d747510SLisandro Dalcin 622d747510SLisandro Dalcin KHASH_INIT(HO, kh_cstr_t, int, 1, PetscOptHash, PetscOptEqual) 632d747510SLisandro Dalcin 64e5c89e4eSSatish Balay /* 653fc1eb6aSBarry Smith This table holds all the options set by the user. For simplicity, we use a static size database 66e5c89e4eSSatish Balay */ 672d747510SLisandro Dalcin #define MAXOPTNAME 512 68e5c89e4eSSatish Balay #define MAXOPTIONS 512 69e5c89e4eSSatish Balay #define MAXALIASES 25 7074e0666dSJed Brown #define MAXPREFIXES 25 712d747510SLisandro Dalcin #define MAXOPTIONSMONITORS 5 72e5c89e4eSSatish Balay 734416b707SBarry Smith struct _n_PetscOptions { 743de2bfdfSBarry Smith PetscOptions previous; 752d747510SLisandro Dalcin int N; /* number of options */ 762d747510SLisandro Dalcin char *names[MAXOPTIONS]; /* option names */ 772d747510SLisandro Dalcin char *values[MAXOPTIONS]; /* option values */ 782d747510SLisandro Dalcin PetscBool used[MAXOPTIONS]; /* flag option use */ 79081c24baSBoyana Norris 802d747510SLisandro Dalcin /* Hash table */ 812d747510SLisandro Dalcin khash_t(HO) *ht; 822d747510SLisandro Dalcin 832d747510SLisandro Dalcin /* Prefixes */ 842d747510SLisandro Dalcin int prefixind; 852d747510SLisandro Dalcin int prefixstack[MAXPREFIXES]; 862d747510SLisandro Dalcin char prefix[MAXOPTNAME]; 872d747510SLisandro Dalcin 882d747510SLisandro Dalcin /* Aliases */ 892d747510SLisandro Dalcin int Naliases; /* number or aliases */ 902d747510SLisandro Dalcin char *aliases1[MAXALIASES]; /* aliased */ 912d747510SLisandro Dalcin char *aliases2[MAXALIASES]; /* aliasee */ 922d747510SLisandro Dalcin 932d747510SLisandro Dalcin /* Help */ 942d747510SLisandro Dalcin PetscBool help; /* flag whether "-help" is in the database */ 952d747510SLisandro Dalcin 962d747510SLisandro Dalcin /* Monitors */ 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 105081c24baSBoyana Norris /* 106081c24baSBoyana Norris Options events monitor 107081c24baSBoyana Norris */ 1082d747510SLisandro Dalcin static PetscErrorCode PetscOptionsMonitor(PetscOptions options,const char name[],const char value[]) 109e5c89e4eSSatish Balay { 1102d747510SLisandro Dalcin PetscInt i; 111e5c89e4eSSatish Balay PetscErrorCode ierr; 112e5c89e4eSSatish Balay 1132d747510SLisandro Dalcin if (!PetscInitializeCalled) return 0; 114e5c89e4eSSatish Balay PetscFunctionBegin; 1152d747510SLisandro Dalcin for (i=0; i<options->numbermonitors; i++) { 1162d747510SLisandro Dalcin ierr = (*options->monitor[i])(name,value,options->monitorcontext[i]);CHKERRQ(ierr); 117e5c89e4eSSatish Balay } 118e5c89e4eSSatish Balay PetscFunctionReturn(0); 119e5c89e4eSSatish Balay } 120e5c89e4eSSatish Balay 1212d747510SLisandro Dalcin /*@ 1222d747510SLisandro Dalcin PetscOptionsCreate - Creates an empty options database. 123e5c89e4eSSatish Balay 1241c9f3c13SBarry Smith Logically collective 1251c9f3c13SBarry Smith 126e5c89e4eSSatish Balay Output Parameter: 1272d747510SLisandro Dalcin . options - Options database object 128e5c89e4eSSatish Balay 129e5c89e4eSSatish Balay Level: advanced 130e5c89e4eSSatish Balay 1311c9f3c13SBarry Smith Developer Note: We may want eventually to pass a MPI_Comm to determine the ownership of the object 1321c9f3c13SBarry Smith 133b4205f0bSBarry Smith .seealso: PetscOptionsDestroy(), PetscOptionsPush(), PetscOptionsPop(), PetscOptionsInsert(), PetscOptionsSetValue() 134e5c89e4eSSatish Balay @*/ 1352d747510SLisandro Dalcin PetscErrorCode PetscOptionsCreate(PetscOptions *options) 1362d747510SLisandro Dalcin { 1372d747510SLisandro Dalcin if (!options) return PETSC_ERR_ARG_NULL; 1382d747510SLisandro Dalcin *options = (PetscOptions)calloc(1,sizeof(**options)); 1392d747510SLisandro Dalcin if (!*options) return PETSC_ERR_MEM; 1402d747510SLisandro Dalcin return 0; 1412d747510SLisandro Dalcin } 1422d747510SLisandro Dalcin 1432d747510SLisandro Dalcin /*@ 1442d747510SLisandro Dalcin PetscOptionsDestroy - Destroys an option database. 1452d747510SLisandro Dalcin 1461c9f3c13SBarry Smith Logically collective on whatever communicator was associated with the call to PetscOptionsCreate() 1471c9f3c13SBarry Smith 1482d747510SLisandro Dalcin Input Parameter: 1492d747510SLisandro Dalcin . options - the PetscOptions object 1502d747510SLisandro Dalcin 1513de2bfdfSBarry Smith Level: advanced 1522d747510SLisandro Dalcin 153b4205f0bSBarry Smith .seealso: PetscOptionsInsert(), PetscOptionsPush(), PetscOptionsPop(), PetscOptionsInsert(), PetscOptionsSetValue() 1542d747510SLisandro Dalcin @*/ 1552d747510SLisandro Dalcin PetscErrorCode PetscOptionsDestroy(PetscOptions *options) 156e5c89e4eSSatish Balay { 157e5c89e4eSSatish Balay PetscErrorCode ierr; 158e5c89e4eSSatish Balay 1592d747510SLisandro Dalcin if (!*options) return 0; 1603de2bfdfSBarry 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()"); 1612d747510SLisandro Dalcin ierr = PetscOptionsClear(*options);if (ierr) return ierr; 1622d747510SLisandro Dalcin /* XXX what about monitors ? */ 1632800570dSLisandro Dalcin free(*options); 1642d747510SLisandro Dalcin *options = NULL; 165e5c89e4eSSatish Balay PetscFunctionReturn(0); 166e5c89e4eSSatish Balay } 167e5c89e4eSSatish Balay 1682d747510SLisandro Dalcin /* 1692d747510SLisandro Dalcin PetscOptionsCreateDefault - Creates the default global options database 1702d747510SLisandro Dalcin */ 1712d747510SLisandro Dalcin PetscErrorCode PetscOptionsCreateDefault(void) 172e5c89e4eSSatish Balay { 173e5c89e4eSSatish Balay PetscErrorCode ierr; 174e5c89e4eSSatish Balay 1752d747510SLisandro Dalcin if (!defaultoptions) { 1762d747510SLisandro Dalcin ierr = PetscOptionsCreate(&defaultoptions);if (ierr) return ierr; 1772d747510SLisandro Dalcin } 1782d747510SLisandro Dalcin return 0; 1792d747510SLisandro Dalcin } 1802d747510SLisandro Dalcin 181b4205f0bSBarry Smith /*@ 182b4205f0bSBarry Smith PetscOptionsPush - Push a new PetscOptions object as the default provider of options 1831c9f3c13SBarry Smith Allows using different parts of a code to use different options databases 184b4205f0bSBarry Smith 185b4205f0bSBarry Smith Logically Collective 186b4205f0bSBarry Smith 187b4205f0bSBarry Smith Input Parameter: 188b4205f0bSBarry Smith . opt - the options obtained with PetscOptionsCreate() 189b4205f0bSBarry Smith 190b4205f0bSBarry Smith Notes: 191b4205f0bSBarry Smith Use PetscOptionsPop() to return to the previous default options database 1921c9f3c13SBarry Smith 1939666a313SBarry Smith The collectivity of this routine is complex; only the MPI processes that call this routine will 1941c9f3c13SBarry Smith have the affect of these options. If some processes that create objects call this routine and others do 1951c9f3c13SBarry Smith not the code may fail in complicated ways because the same parallel solvers may incorrectly use different options 1961c9f3c13SBarry Smith on different ranks. 197b4205f0bSBarry Smith 1983de2bfdfSBarry Smith Level: advanced 1993de2bfdfSBarry Smith 2003c6db4c4SPierre Jolivet .seealso: PetscOptionsPop(), PetscOptionsCreate(), PetscOptionsInsert(), PetscOptionsSetValue(), PetscOptionsLeft() 201b4205f0bSBarry Smith 202b4205f0bSBarry Smith @*/ 203b4205f0bSBarry Smith PetscErrorCode PetscOptionsPush(PetscOptions opt) 204b4205f0bSBarry Smith { 205b4205f0bSBarry Smith PetscErrorCode ierr; 206b4205f0bSBarry Smith 207b4205f0bSBarry Smith PetscFunctionBegin; 208b4205f0bSBarry Smith ierr = PetscOptionsCreateDefault();CHKERRQ(ierr); 209b4205f0bSBarry Smith opt->previous = defaultoptions; 210b4205f0bSBarry Smith defaultoptions = opt; 211b4205f0bSBarry Smith PetscFunctionReturn(0); 212b4205f0bSBarry Smith } 213b4205f0bSBarry Smith 214b4205f0bSBarry Smith /*@ 215b4205f0bSBarry Smith PetscOptionsPop - Pop the most recent PetscOptionsPush() to return to the previous default options 216b4205f0bSBarry Smith 2171c9f3c13SBarry Smith Logically collective on whatever communicator was associated with the call to PetscOptionsCreate() 218b4205f0bSBarry Smith 219b4205f0bSBarry Smith Notes: 220b4205f0bSBarry Smith Use PetscOptionsPop() to return to the previous default options database 221b4205f0bSBarry Smith Allows using different parts of a code to use different options databases 222b4205f0bSBarry Smith 2233de2bfdfSBarry Smith Level: advanced 2243de2bfdfSBarry Smith 2253c6db4c4SPierre Jolivet .seealso: PetscOptionsPop(), PetscOptionsCreate(), PetscOptionsInsert(), PetscOptionsSetValue(), PetscOptionsLeft() 226b4205f0bSBarry Smith 227b4205f0bSBarry Smith @*/ 228b4205f0bSBarry Smith PetscErrorCode PetscOptionsPop(void) 229b4205f0bSBarry Smith { 2303de2bfdfSBarry Smith PetscOptions current = defaultoptions; 2313de2bfdfSBarry Smith 232b4205f0bSBarry Smith PetscFunctionBegin; 233b4205f0bSBarry Smith if (!defaultoptions) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Missing default options"); 234b4205f0bSBarry Smith if (!defaultoptions->previous) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"PetscOptionsPop() called too many times"); 235b4205f0bSBarry Smith defaultoptions = defaultoptions->previous; 2363de2bfdfSBarry Smith current->previous = NULL; 237b4205f0bSBarry Smith PetscFunctionReturn(0); 238b4205f0bSBarry Smith } 239b4205f0bSBarry Smith 2402d747510SLisandro Dalcin /* 2412d747510SLisandro Dalcin PetscOptionsDestroyDefault - Destroys the default global options database 2422d747510SLisandro Dalcin */ 2432d747510SLisandro Dalcin PetscErrorCode PetscOptionsDestroyDefault(void) 2442d747510SLisandro Dalcin { 2452d747510SLisandro Dalcin PetscErrorCode ierr; 2463de2bfdfSBarry Smith PetscOptions tmp; 2472d747510SLisandro Dalcin 2483de2bfdfSBarry Smith /* Destroy any options that the user forgot to pop */ 2493de2bfdfSBarry Smith while (defaultoptions->previous) { 2503de2bfdfSBarry Smith tmp = defaultoptions; 2513de2bfdfSBarry Smith ierr = PetscOptionsPop();CHKERRQ(ierr); 2523de2bfdfSBarry Smith ierr = PetscOptionsDestroy(&tmp);CHKERRQ(ierr); 2533de2bfdfSBarry Smith } 2542d747510SLisandro Dalcin ierr = PetscOptionsDestroy(&defaultoptions);if (ierr) return ierr; 2552d747510SLisandro Dalcin return 0; 256e5c89e4eSSatish Balay } 257e5c89e4eSSatish Balay 25894ef8ddeSSatish Balay /*@C 2597cd08cecSJed Brown PetscOptionsValidKey - PETSc Options database keys must begin with one or two dashes (-) followed by a letter. 2603fc1eb6aSBarry Smith 261447722d5SBarry Smith Not collective 2621c9f3c13SBarry Smith 2633fc1eb6aSBarry Smith Input Parameter: 2642d747510SLisandro Dalcin . key - string to check if valid 2653fc1eb6aSBarry Smith 2663fc1eb6aSBarry Smith Output Parameter: 2672d747510SLisandro Dalcin . valid - PETSC_TRUE if a valid key 2683fc1eb6aSBarry Smith 269f6680f47SSatish Balay Level: intermediate 2703fc1eb6aSBarry Smith @*/ 2712d747510SLisandro Dalcin PetscErrorCode PetscOptionsValidKey(const char key[],PetscBool *valid) 27296fc60bcSBarry Smith { 273f603b5e9SToby Isaac char *ptr; 2747c5db45bSBarry Smith 27596fc60bcSBarry Smith PetscFunctionBegin; 2762d747510SLisandro Dalcin if (key) PetscValidCharPointer(key,1); 2772d747510SLisandro Dalcin PetscValidPointer(valid,2); 2782d747510SLisandro Dalcin *valid = PETSC_FALSE; 2792d747510SLisandro Dalcin if (!key) PetscFunctionReturn(0); 2802d747510SLisandro Dalcin if (key[0] != '-') PetscFunctionReturn(0); 2812d747510SLisandro Dalcin if (key[1] == '-') key++; 282c850d057SPierre Jolivet if (!isalpha((int)key[1])) PetscFunctionReturn(0); 2832d747510SLisandro Dalcin (void) strtod(key,&ptr); 284c850d057SPierre Jolivet if (ptr != key && !(*ptr == '_' || isalnum((int)*ptr))) PetscFunctionReturn(0); 2852d747510SLisandro Dalcin *valid = PETSC_TRUE; 28696fc60bcSBarry Smith PetscFunctionReturn(0); 28796fc60bcSBarry Smith } 28896fc60bcSBarry Smith 289e5c89e4eSSatish Balay /*@C 290e5c89e4eSSatish Balay PetscOptionsInsertString - Inserts options into the database from a string 291e5c89e4eSSatish Balay 2921c9f3c13SBarry Smith Logically Collective 293e5c89e4eSSatish Balay 294e5c89e4eSSatish Balay Input Parameter: 295080f0011SToby Isaac + options - options object 296080f0011SToby Isaac - in_str - string that contains options separated by blanks 297e5c89e4eSSatish Balay 298e5c89e4eSSatish Balay Level: intermediate 299e5c89e4eSSatish Balay 3009666a313SBarry Smith The collectivity of this routine is complex; only the MPI processes that call this routine will 3011c9f3c13SBarry Smith have the affect of these options. If some processes that create objects call this routine and others do 3021c9f3c13SBarry Smith not the code may fail in complicated ways because the same parallel solvers may incorrectly use different options 3031c9f3c13SBarry Smith on different ranks. 3041c9f3c13SBarry Smith 305e5c89e4eSSatish Balay Contributed by Boyana Norris 306e5c89e4eSSatish Balay 30788c29154SBarry Smith .seealso: PetscOptionsSetValue(), PetscOptionsView(), PetscOptionsHasName(), PetscOptionsGetInt(), 308acfcf0e5SJed Brown PetscOptionsGetReal(), PetscOptionsGetString(), PetscOptionsGetIntArray(), PetscOptionsBool(), 309e5c89e4eSSatish Balay PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 310e5c89e4eSSatish Balay PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 311acfcf0e5SJed Brown PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 312a264d7a6SBarry Smith PetscOptionsFList(), PetscOptionsEList(), PetscOptionsInsertFile() 313e5c89e4eSSatish Balay @*/ 314c5929fdfSBarry Smith PetscErrorCode PetscOptionsInsertString(PetscOptions options,const char in_str[]) 315e5c89e4eSSatish Balay { 31696fc60bcSBarry Smith char *first,*second; 317e5c89e4eSSatish Balay PetscErrorCode ierr; 3189c9d3cfdSBarry Smith PetscToken token; 319bf9c6086SStefano Zampini PetscBool key,ispush,ispop,isopts; 320e5c89e4eSSatish Balay 321e5c89e4eSSatish Balay PetscFunctionBegin; 32296fc60bcSBarry Smith ierr = PetscTokenCreate(in_str,' ',&token);CHKERRQ(ierr); 323e5c89e4eSSatish Balay ierr = PetscTokenFind(token,&first);CHKERRQ(ierr); 32496fc60bcSBarry Smith while (first) { 3259db968c8SJed Brown ierr = PetscStrcasecmp(first,"-prefix_push",&ispush);CHKERRQ(ierr); 3269db968c8SJed Brown ierr = PetscStrcasecmp(first,"-prefix_pop",&ispop);CHKERRQ(ierr); 327bf9c6086SStefano Zampini ierr = PetscStrcasecmp(first,"-options_file",&isopts);CHKERRQ(ierr); 32896fc60bcSBarry Smith ierr = PetscOptionsValidKey(first,&key);CHKERRQ(ierr); 3299db968c8SJed Brown if (ispush) { 3309db968c8SJed Brown ierr = PetscTokenFind(token,&second);CHKERRQ(ierr); 331c5929fdfSBarry Smith ierr = PetscOptionsPrefixPush(options,second);CHKERRQ(ierr); 3329db968c8SJed Brown ierr = PetscTokenFind(token,&first);CHKERRQ(ierr); 3339db968c8SJed Brown } else if (ispop) { 334c5929fdfSBarry Smith ierr = PetscOptionsPrefixPop(options);CHKERRQ(ierr); 3359db968c8SJed Brown ierr = PetscTokenFind(token,&first);CHKERRQ(ierr); 336bf9c6086SStefano Zampini } else if (isopts) { 337bf9c6086SStefano Zampini ierr = PetscTokenFind(token,&second);CHKERRQ(ierr); 338bf9c6086SStefano Zampini ierr = PetscOptionsInsertFile(PETSC_COMM_SELF,options,second,PETSC_TRUE);CHKERRQ(ierr); 339bf9c6086SStefano Zampini ierr = PetscTokenFind(token,&first);CHKERRQ(ierr); 3409db968c8SJed Brown } else if (key) { 341e5c89e4eSSatish Balay ierr = PetscTokenFind(token,&second);CHKERRQ(ierr); 34296fc60bcSBarry Smith ierr = PetscOptionsValidKey(second,&key);CHKERRQ(ierr); 34396fc60bcSBarry Smith if (!key) { 344c5929fdfSBarry Smith ierr = PetscOptionsSetValue(options,first,second);CHKERRQ(ierr); 34596fc60bcSBarry Smith ierr = PetscTokenFind(token,&first);CHKERRQ(ierr); 34696fc60bcSBarry Smith } else { 347c5929fdfSBarry Smith ierr = PetscOptionsSetValue(options,first,NULL);CHKERRQ(ierr); 34896fc60bcSBarry Smith first = second; 34996fc60bcSBarry Smith } 35096fc60bcSBarry Smith } else { 35196fc60bcSBarry Smith ierr = PetscTokenFind(token,&first);CHKERRQ(ierr); 352e5c89e4eSSatish Balay } 353e5c89e4eSSatish Balay } 3548c74ee41SBarry Smith ierr = PetscTokenDestroy(&token);CHKERRQ(ierr); 355e5c89e4eSSatish Balay PetscFunctionReturn(0); 356e5c89e4eSSatish Balay } 357e5c89e4eSSatish Balay 3583fc1eb6aSBarry Smith /* 3593fc1eb6aSBarry Smith Returns a line (ended by a \n, \r or null character of any length. Result should be freed with free() 3603fc1eb6aSBarry Smith */ 3615fa91da5SBarry Smith static char *Petscgetline(FILE * f) 3625fa91da5SBarry Smith { 3635fa91da5SBarry Smith size_t size = 0; 3645fa91da5SBarry Smith size_t len = 0; 3655fa91da5SBarry Smith size_t last = 0; 3660298fd71SBarry Smith char *buf = NULL; 3675fa91da5SBarry Smith 36802c9f0b5SLisandro Dalcin if (feof(f)) return NULL; 3695fa91da5SBarry Smith do { 3705fa91da5SBarry Smith size += 1024; /* BUFSIZ is defined as "the optimal read size for this platform" */ 3716e0c8459SSatish Balay buf = (char*)realloc((void*)buf,size); /* realloc(NULL,n) is the same as malloc(n) */ 3725fa91da5SBarry Smith /* Actually do the read. Note that fgets puts a terminal '\0' on the 3735fa91da5SBarry Smith end of the string, so we make sure we overwrite this */ 374e86f3e45SDave May if (!fgets(buf+len,1024,f)) buf[len]=0; 3755fa91da5SBarry Smith PetscStrlen(buf,&len); 3765fa91da5SBarry Smith last = len - 1; 3775fa91da5SBarry Smith } while (!feof(f) && buf[last] != '\n' && buf[last] != '\r'); 37808ac41f7SSatish Balay if (len) return buf; 3795fa91da5SBarry Smith free(buf); 38002c9f0b5SLisandro Dalcin return NULL; 3815fa91da5SBarry Smith } 3825fa91da5SBarry Smith 383e5c89e4eSSatish Balay /*@C 384e5c89e4eSSatish Balay PetscOptionsInsertFile - Inserts options into the database from a file. 385e5c89e4eSSatish Balay 386d083f849SBarry Smith Collective 387e5c89e4eSSatish Balay 388e5c89e4eSSatish Balay Input Parameter: 3899b754dc9SBarry Smith + comm - the processes that will share the options (usually PETSC_COMM_WORLD) 390c5929fdfSBarry Smith . options - options database, use NULL for default global database 391e5c89e4eSSatish Balay . file - name of file 3929b754dc9SBarry Smith - require - if PETSC_TRUE will generate an error if the file does not exist 393e5c89e4eSSatish Balay 394e5c89e4eSSatish Balay 39595452b02SPatrick Sanan Notes: 39695452b02SPatrick Sanan Use # for lines that are comments and which should be ignored. 397f0feba65SBarry Smith Usually, instead of using this command, one should list the file name in the call to PetscInitialize(), this insures that certain options 398609bdbeeSBarry 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 399f0feba65SBarry Smith calls to XXXSetFromOptions() it should not be used for options listed under PetscInitialize(). 4009666a313SBarry Smith The collectivity of this routine is complex; only the MPI processes in comm will 4011c9f3c13SBarry Smith have the affect of these options. If some processes that create objects call this routine and others do 4021c9f3c13SBarry Smith not the code may fail in complicated ways because the same parallel solvers may incorrectly use different options 4031c9f3c13SBarry Smith on different ranks. 404f0feba65SBarry Smith 4053bcbd388SSean Farley Level: developer 406e5c89e4eSSatish Balay 40788c29154SBarry Smith .seealso: PetscOptionsSetValue(), PetscOptionsView(), PetscOptionsHasName(), PetscOptionsGetInt(), 408acfcf0e5SJed Brown PetscOptionsGetReal(), PetscOptionsGetString(), PetscOptionsGetIntArray(), PetscOptionsBool(), 409e5c89e4eSSatish Balay PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 410e5c89e4eSSatish Balay PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 411acfcf0e5SJed Brown PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 412a264d7a6SBarry Smith PetscOptionsFList(), PetscOptionsEList() 413e5c89e4eSSatish Balay 414e5c89e4eSSatish Balay @*/ 415c5929fdfSBarry Smith PetscErrorCode PetscOptionsInsertFile(MPI_Comm comm,PetscOptions options,const char file[],PetscBool require) 416e5c89e4eSSatish Balay { 41702c9f0b5SLisandro Dalcin char *string,fname[PETSC_MAX_PATH_LEN],*first,*second,*third,*vstring = NULL,*astring = NULL,*packed = NULL; 418e5c89e4eSSatish Balay PetscErrorCode ierr; 41913e3f751SJed Brown size_t i,len,bytes; 420e5c89e4eSSatish Balay FILE *fd; 4219c9d3cfdSBarry Smith PetscToken token; 422ed9cf6e9SBarry Smith int err; 423*581bbe83SVaclav Hapla char *cmatch; 424*581bbe83SVaclav Hapla const char cmt='#'; 4253a018368SJed Brown PetscMPIInt rank,cnt=0,acnt=0,counts[2]; 426ad38b122SPatrick Sanan PetscBool isdir; 427e5c89e4eSSatish Balay 428e5c89e4eSSatish Balay PetscFunctionBegin; 42905c7dedfSBarry Smith ierr = MPI_Comm_rank(comm,&rank);CHKERRQ(ierr); 43005c7dedfSBarry Smith if (!rank) { 43166af5158SSatish Balay cnt = 0; 43266af5158SSatish Balay acnt = 0; 43305c7dedfSBarry Smith 434e5c89e4eSSatish Balay ierr = PetscFixFilename(file,fname);CHKERRQ(ierr); 435e5c89e4eSSatish Balay fd = fopen(fname,"r"); 436ad38b122SPatrick Sanan ierr = PetscTestDirectory(fname,'r',&isdir);CHKERRQ(ierr); 437ad38b122SPatrick Sanan if (isdir && require) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_USER,"Specified options file %s is a directory",fname); 438ad38b122SPatrick Sanan if (fd && !isdir) { 4393a018368SJed Brown PetscSegBuffer vseg,aseg; 4403a018368SJed Brown ierr = PetscSegBufferCreate(1,4000,&vseg);CHKERRQ(ierr); 4413a018368SJed Brown ierr = PetscSegBufferCreate(1,2000,&aseg);CHKERRQ(ierr); 4423a018368SJed Brown 4439b754dc9SBarry Smith /* the following line will not work when opening initial files (like .petscrc) since info is not yet set */ 44402c9f0b5SLisandro Dalcin ierr = PetscInfo1(NULL,"Opened options file %s\n",file);CHKERRQ(ierr); 445e24ecc5dSJed Brown 4465fa91da5SBarry Smith while ((string = Petscgetline(fd))) { 4474704e885SBarry Smith /* eliminate comments from each line */ 448*581bbe83SVaclav Hapla ierr = PetscStrchr(string,cmt,&cmatch);CHKERRQ(ierr); 44990f79514SSatish Balay if (cmatch) *cmatch = 0; 450e5c89e4eSSatish Balay ierr = PetscStrlen(string,&len);CHKERRQ(ierr); 4515981331cSSatish Balay /* replace tabs, ^M, \n with " " */ 452e5c89e4eSSatish Balay for (i=0; i<len; i++) { 4535981331cSSatish Balay if (string[i] == '\t' || string[i] == '\r' || string[i] == '\n') { 454e5c89e4eSSatish Balay string[i] = ' '; 455e5c89e4eSSatish Balay } 456e5c89e4eSSatish Balay } 45790f79514SSatish Balay ierr = PetscTokenCreate(string,' ',&token);CHKERRQ(ierr); 458e5c89e4eSSatish Balay ierr = PetscTokenFind(token,&first);CHKERRQ(ierr); 45990f79514SSatish Balay if (!first) { 46002b0d46eSSatish Balay goto destroy; 46190f79514SSatish Balay } else if (!first[0]) { /* if first token is empty spaces, redo first token */ 46290f79514SSatish Balay ierr = PetscTokenFind(token,&first);CHKERRQ(ierr); 46390f79514SSatish Balay } 464e5c89e4eSSatish Balay ierr = PetscTokenFind(token,&second);CHKERRQ(ierr); 4652662f744SSatish Balay if (!first) { 4662662f744SSatish Balay goto destroy; 4672662f744SSatish Balay } else if (first[0] == '-') { 468e24ecc5dSJed Brown ierr = PetscStrlen(first,&len);CHKERRQ(ierr); 46913e3f751SJed Brown ierr = PetscSegBufferGet(vseg,len+1,&vstring);CHKERRQ(ierr); 470580bdb30SBarry Smith ierr = PetscArraycpy(vstring,first,len);CHKERRQ(ierr); 471e24ecc5dSJed Brown vstring[len] = ' '; 47209192fe3SBarry Smith if (second) { 473e24ecc5dSJed Brown ierr = PetscStrlen(second,&len);CHKERRQ(ierr); 47413e3f751SJed Brown ierr = PetscSegBufferGet(vseg,len+3,&vstring);CHKERRQ(ierr); 475e24ecc5dSJed Brown vstring[0] = '"'; 476580bdb30SBarry Smith ierr = PetscArraycpy(vstring+1,second,len);CHKERRQ(ierr); 477e24ecc5dSJed Brown vstring[len+1] = '"'; 478e24ecc5dSJed Brown vstring[len+2] = ' '; 47909192fe3SBarry Smith } 48090f79514SSatish Balay } else { 481ace3abfcSBarry Smith PetscBool match; 482e5c89e4eSSatish Balay 483e5c89e4eSSatish Balay ierr = PetscStrcasecmp(first,"alias",&match);CHKERRQ(ierr); 484e5c89e4eSSatish Balay if (match) { 485e5c89e4eSSatish Balay ierr = PetscTokenFind(token,&third);CHKERRQ(ierr); 486e32f2f54SBarry Smith if (!third) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Error in options file:alias missing (%s)",second); 487e24ecc5dSJed Brown ierr = PetscStrlen(second,&len);CHKERRQ(ierr); 48813e3f751SJed Brown ierr = PetscSegBufferGet(aseg,len+1,&astring);CHKERRQ(ierr); 489580bdb30SBarry Smith ierr = PetscArraycpy(astring,second,len);CHKERRQ(ierr); 490e24ecc5dSJed Brown astring[len] = ' '; 491e24ecc5dSJed Brown 492e24ecc5dSJed Brown ierr = PetscStrlen(third,&len);CHKERRQ(ierr); 49313e3f751SJed Brown ierr = PetscSegBufferGet(aseg,len+1,&astring);CHKERRQ(ierr); 494580bdb30SBarry Smith ierr = PetscArraycpy(astring,third,len);CHKERRQ(ierr); 495e24ecc5dSJed Brown astring[len] = ' '; 496f23aa3ddSBarry Smith } else SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Unknown statement in options file: (%s)",string); 497e5c89e4eSSatish Balay } 49802b0d46eSSatish Balay destroy: 4994b40f50bSBarry Smith free(string); 5008c74ee41SBarry Smith ierr = PetscTokenDestroy(&token);CHKERRQ(ierr); 501e5c89e4eSSatish Balay } 502ed9cf6e9SBarry Smith err = fclose(fd); 503e32f2f54SBarry Smith if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fclose() failed on file"); 504e24ecc5dSJed Brown ierr = PetscSegBufferGetSize(aseg,&bytes);CHKERRQ(ierr); /* size without null termination */ 505e24ecc5dSJed Brown ierr = PetscMPIIntCast(bytes,&acnt);CHKERRQ(ierr); 506e24ecc5dSJed Brown ierr = PetscSegBufferGet(aseg,1,&astring);CHKERRQ(ierr); 507e24ecc5dSJed Brown astring[0] = 0; 508e24ecc5dSJed Brown ierr = PetscSegBufferGetSize(vseg,&bytes);CHKERRQ(ierr); /* size without null termination */ 509e24ecc5dSJed Brown ierr = PetscMPIIntCast(bytes,&cnt);CHKERRQ(ierr); 510e24ecc5dSJed Brown ierr = PetscSegBufferGet(vseg,1,&vstring);CHKERRQ(ierr); 511e24ecc5dSJed Brown vstring[0] = 0; 512854ce69bSBarry Smith ierr = PetscMalloc1(2+acnt+cnt,&packed);CHKERRQ(ierr); 5133a018368SJed Brown ierr = PetscSegBufferExtractTo(aseg,packed);CHKERRQ(ierr); 5143a018368SJed Brown ierr = PetscSegBufferExtractTo(vseg,packed+acnt+1);CHKERRQ(ierr); 5153a018368SJed Brown ierr = PetscSegBufferDestroy(&aseg);CHKERRQ(ierr); 5163a018368SJed Brown ierr = PetscSegBufferDestroy(&vseg);CHKERRQ(ierr); 517f23aa3ddSBarry Smith } else if (require) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_USER,"Unable to open Options File %s",fname); 5189b754dc9SBarry Smith } 51905c7dedfSBarry Smith 5203a018368SJed Brown counts[0] = acnt; 5213a018368SJed Brown counts[1] = cnt; 5223a018368SJed Brown ierr = MPI_Bcast(counts,2,MPI_INT,0,comm);CHKERRQ(ierr); 5233a018368SJed Brown acnt = counts[0]; 5243a018368SJed Brown cnt = counts[1]; 5253a018368SJed Brown if (rank) { 526854ce69bSBarry Smith ierr = PetscMalloc1(2+acnt+cnt,&packed);CHKERRQ(ierr); 5273a018368SJed Brown } 5283a018368SJed Brown if (acnt || cnt) { 5293a018368SJed Brown ierr = MPI_Bcast(packed,2+acnt+cnt,MPI_CHAR,0,comm);CHKERRQ(ierr); 5303a018368SJed Brown astring = packed; 5313a018368SJed Brown vstring = packed + acnt + 1; 5323a018368SJed Brown } 5333a018368SJed Brown 5349b754dc9SBarry Smith if (acnt) { 5359b754dc9SBarry Smith PetscToken token; 5369b754dc9SBarry Smith char *first,*second; 5379b754dc9SBarry Smith 5389b754dc9SBarry Smith ierr = PetscTokenCreate(astring,' ',&token);CHKERRQ(ierr); 5399b754dc9SBarry Smith ierr = PetscTokenFind(token,&first);CHKERRQ(ierr); 5409b754dc9SBarry Smith while (first) { 5419b754dc9SBarry Smith ierr = PetscTokenFind(token,&second);CHKERRQ(ierr); 542c5929fdfSBarry Smith ierr = PetscOptionsSetAlias(options,first,second);CHKERRQ(ierr); 5439b754dc9SBarry Smith ierr = PetscTokenFind(token,&first);CHKERRQ(ierr); 5449b754dc9SBarry Smith } 5458c74ee41SBarry Smith ierr = PetscTokenDestroy(&token);CHKERRQ(ierr); 5469b754dc9SBarry Smith } 5479b754dc9SBarry Smith 5489b754dc9SBarry Smith if (cnt) { 549c5929fdfSBarry Smith ierr = PetscOptionsInsertString(options,vstring);CHKERRQ(ierr); 550e5c89e4eSSatish Balay } 5513a018368SJed Brown ierr = PetscFree(packed);CHKERRQ(ierr); 552e5c89e4eSSatish Balay PetscFunctionReturn(0); 553e5c89e4eSSatish Balay } 554e5c89e4eSSatish Balay 5552d747510SLisandro Dalcin static PetscErrorCode PetscOptionsInsertArgs(PetscOptions options,int argc,char *args[]) 55685079163SJed Brown { 55785079163SJed Brown PetscErrorCode ierr; 55885079163SJed Brown int left = argc - 1; 55985079163SJed Brown char **eargs = args + 1; 56085079163SJed Brown 56185079163SJed Brown PetscFunctionBegin; 56285079163SJed Brown while (left) { 563093de6efSBarry Smith PetscBool isoptions_file,isprefixpush,isprefixpop,isp4,tisp4,isp4yourname,isp4rmrank,key; 56485079163SJed Brown ierr = PetscStrcasecmp(eargs[0],"-options_file",&isoptions_file);CHKERRQ(ierr); 5659db968c8SJed Brown ierr = PetscStrcasecmp(eargs[0],"-prefix_push",&isprefixpush);CHKERRQ(ierr); 5669db968c8SJed Brown ierr = PetscStrcasecmp(eargs[0],"-prefix_pop",&isprefixpop);CHKERRQ(ierr); 56785079163SJed Brown ierr = PetscStrcasecmp(eargs[0],"-p4pg",&isp4);CHKERRQ(ierr); 56885079163SJed Brown ierr = PetscStrcasecmp(eargs[0],"-p4yourname",&isp4yourname);CHKERRQ(ierr); 56985079163SJed Brown ierr = PetscStrcasecmp(eargs[0],"-p4rmrank",&isp4rmrank);CHKERRQ(ierr); 57085079163SJed Brown ierr = PetscStrcasecmp(eargs[0],"-p4wd",&tisp4);CHKERRQ(ierr); 571ace3abfcSBarry Smith isp4 = (PetscBool) (isp4 || tisp4); 57285079163SJed Brown ierr = PetscStrcasecmp(eargs[0],"-np",&tisp4);CHKERRQ(ierr); 573ace3abfcSBarry Smith isp4 = (PetscBool) (isp4 || tisp4); 57485079163SJed Brown ierr = PetscStrcasecmp(eargs[0],"-p4amslave",&tisp4);CHKERRQ(ierr); 575093de6efSBarry Smith ierr = PetscOptionsValidKey(eargs[0],&key);CHKERRQ(ierr); 57685079163SJed Brown 577093de6efSBarry Smith if (!key) { 57885079163SJed Brown eargs++; left--; 57985079163SJed Brown } else if (isoptions_file) { 58085079163SJed Brown if (left <= 1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_USER,"Missing filename for -options_file filename option"); 58185079163SJed Brown if (eargs[1][0] == '-') SETERRQ(PETSC_COMM_SELF,PETSC_ERR_USER,"Missing filename for -options_file filename option"); 582c5929fdfSBarry Smith ierr = PetscOptionsInsertFile(PETSC_COMM_WORLD,options,eargs[1],PETSC_TRUE);CHKERRQ(ierr); 58385079163SJed Brown eargs += 2; left -= 2; 5849db968c8SJed Brown } else if (isprefixpush) { 5859db968c8SJed Brown if (left <= 1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_USER,"Missing prefix for -prefix_push option"); 5869db968c8SJed Brown if (eargs[1][0] == '-') SETERRQ(PETSC_COMM_SELF,PETSC_ERR_USER,"Missing prefix for -prefix_push option (prefixes cannot start with '-')"); 587c5929fdfSBarry Smith ierr = PetscOptionsPrefixPush(options,eargs[1]);CHKERRQ(ierr); 5889db968c8SJed Brown eargs += 2; left -= 2; 5899db968c8SJed Brown } else if (isprefixpop) { 590c5929fdfSBarry Smith ierr = PetscOptionsPrefixPop(options);CHKERRQ(ierr); 5919db968c8SJed Brown eargs++; left--; 59285079163SJed Brown 59385079163SJed Brown /* 59485079163SJed Brown These are "bad" options that MPICH, etc put on the command line 59585079163SJed Brown we strip them out here. 59685079163SJed Brown */ 59785079163SJed Brown } else if (tisp4 || isp4rmrank) { 59885079163SJed Brown eargs += 1; left -= 1; 59985079163SJed Brown } else if (isp4 || isp4yourname) { 60085079163SJed Brown eargs += 2; left -= 2; 6017935c3d8SJed Brown } else { 6027935c3d8SJed Brown PetscBool nextiskey = PETSC_FALSE; 6037935c3d8SJed Brown if (left >= 2) {ierr = PetscOptionsValidKey(eargs[1],&nextiskey);CHKERRQ(ierr);} 60498b6bf53SJed Brown if (left < 2 || nextiskey) { 605c5929fdfSBarry Smith ierr = PetscOptionsSetValue(options,eargs[0],NULL);CHKERRQ(ierr); 60685079163SJed Brown eargs++; left--; 60785079163SJed Brown } else { 608c5929fdfSBarry Smith ierr = PetscOptionsSetValue(options,eargs[0],eargs[1]);CHKERRQ(ierr); 60985079163SJed Brown eargs += 2; left -= 2; 61085079163SJed Brown } 61185079163SJed Brown } 6127935c3d8SJed Brown } 61385079163SJed Brown PetscFunctionReturn(0); 61485079163SJed Brown } 61585079163SJed Brown 61685079163SJed Brown 617e5c89e4eSSatish Balay /*@C 618e5c89e4eSSatish Balay PetscOptionsInsert - Inserts into the options database from the command line, 619e5c89e4eSSatish Balay the environmental variable and a file. 620e5c89e4eSSatish Balay 6211c9f3c13SBarry Smith Collective on PETSC_COMM_WORLD 6221c9f3c13SBarry Smith 623e5c89e4eSSatish Balay Input Parameters: 624c5929fdfSBarry Smith + options - options database or NULL for the default global database 625c5929fdfSBarry Smith . argc - count of number of command line arguments 626e5c89e4eSSatish Balay . args - the command line arguments 627e5c89e4eSSatish Balay - file - optional filename, defaults to ~username/.petscrc 628e5c89e4eSSatish Balay 629e5c89e4eSSatish Balay Note: 630e5c89e4eSSatish Balay Since PetscOptionsInsert() is automatically called by PetscInitialize(), 631e5c89e4eSSatish Balay the user does not typically need to call this routine. PetscOptionsInsert() 632e5c89e4eSSatish Balay can be called several times, adding additional entries into the database. 633e5c89e4eSSatish Balay 634081c24baSBoyana Norris Options Database Keys: 635081c24baSBoyana Norris + -options_monitor <optional filename> - print options names and values as they are set 636a2b725a8SWilliam Gropp - -options_file <filename> - read options from a file 637081c24baSBoyana Norris 638e5c89e4eSSatish Balay Level: advanced 639e5c89e4eSSatish Balay 6402d747510SLisandro Dalcin .seealso: PetscOptionsDestroy(), PetscOptionsView(), PetscOptionsInsertString(), PetscOptionsInsertFile(), 64196fc60bcSBarry Smith PetscInitialize() 642e5c89e4eSSatish Balay @*/ 643c5929fdfSBarry Smith PetscErrorCode PetscOptionsInsert(PetscOptions options,int *argc,char ***args,const char file[]) 644e5c89e4eSSatish Balay { 645e5c89e4eSSatish Balay PetscErrorCode ierr; 646e5c89e4eSSatish Balay PetscMPIInt rank; 6472d747510SLisandro Dalcin char filename[PETSC_MAX_PATH_LEN]; 648ace3abfcSBarry Smith PetscBool flag = PETSC_FALSE; 649e5c89e4eSSatish Balay 6508dea33a6SBarry Smith 651e5c89e4eSSatish Balay PetscFunctionBegin; 652e5c89e4eSSatish Balay ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr); 653e5c89e4eSSatish Balay 6544b09e917SBarry Smith if (file && file[0]) { 6552d747510SLisandro Dalcin ierr = PetscStrreplace(PETSC_COMM_WORLD,file,filename,PETSC_MAX_PATH_LEN);CHKERRQ(ierr); 6562d747510SLisandro Dalcin ierr = PetscOptionsInsertFile(PETSC_COMM_WORLD,options,filename,PETSC_TRUE);CHKERRQ(ierr); 657321366bcSBarry Smith } 65885079163SJed Brown /* 65985079163SJed Brown We want to be able to give -skip_petscrc on the command line, but need to parse it first. Since the command line 66085079163SJed Brown should take precedence, we insert it twice. It would be sufficient to just scan for -skip_petscrc. 66185079163SJed Brown */ 6622d747510SLisandro Dalcin if (argc && args && *argc) {ierr = PetscOptionsInsertArgs(options,*argc,*args);CHKERRQ(ierr);} 663c5929fdfSBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-skip_petscrc",&flag,NULL);CHKERRQ(ierr); 664321366bcSBarry Smith if (!flag) { 6652d747510SLisandro Dalcin ierr = PetscGetHomeDirectory(filename,PETSC_MAX_PATH_LEN-16);CHKERRQ(ierr); 6661ea3218fSSatish Balay /* PetscOptionsInsertFile() does a fopen() on rank0 only - so only rank0 HomeDir value is relavent */ 6672d747510SLisandro Dalcin if (filename[0]) { ierr = PetscStrcat(filename,"/.petscrc");CHKERRQ(ierr); } 6682d747510SLisandro Dalcin ierr = PetscOptionsInsertFile(PETSC_COMM_WORLD,options,filename,PETSC_FALSE);CHKERRQ(ierr); 669c5929fdfSBarry Smith ierr = PetscOptionsInsertFile(PETSC_COMM_WORLD,options,".petscrc",PETSC_FALSE);CHKERRQ(ierr); 670c5929fdfSBarry Smith ierr = PetscOptionsInsertFile(PETSC_COMM_WORLD,options,"petscrc",PETSC_FALSE);CHKERRQ(ierr); 671e5c89e4eSSatish Balay } 672e5c89e4eSSatish Balay 6732d747510SLisandro Dalcin /* insert environment options */ 674e5c89e4eSSatish Balay { 6752d747510SLisandro Dalcin char *eoptions = NULL; 676e5c89e4eSSatish Balay size_t len = 0; 677e5c89e4eSSatish Balay if (!rank) { 678e5c89e4eSSatish Balay eoptions = (char*)getenv("PETSC_OPTIONS"); 679e5c89e4eSSatish Balay ierr = PetscStrlen(eoptions,&len);CHKERRQ(ierr); 68076434e50SSatish Balay ierr = MPI_Bcast(&len,1,MPIU_SIZE_T,0,PETSC_COMM_WORLD);CHKERRQ(ierr); 681e5c89e4eSSatish Balay } else { 68276434e50SSatish Balay ierr = MPI_Bcast(&len,1,MPIU_SIZE_T,0,PETSC_COMM_WORLD);CHKERRQ(ierr); 683e5c89e4eSSatish Balay if (len) { 684854ce69bSBarry Smith ierr = PetscMalloc1(len+1,&eoptions);CHKERRQ(ierr); 685e5c89e4eSSatish Balay } 686e5c89e4eSSatish Balay } 687e5c89e4eSSatish Balay if (len) { 688e5c89e4eSSatish Balay ierr = MPI_Bcast(eoptions,len,MPI_CHAR,0,PETSC_COMM_WORLD);CHKERRQ(ierr); 68996fc60bcSBarry Smith if (rank) eoptions[len] = 0; 690c5929fdfSBarry Smith ierr = PetscOptionsInsertString(options,eoptions);CHKERRQ(ierr); 691e5c89e4eSSatish Balay if (rank) {ierr = PetscFree(eoptions);CHKERRQ(ierr);} 692e5c89e4eSSatish Balay } 693e5c89e4eSSatish Balay } 694e5c89e4eSSatish Balay 6953bcbd388SSean Farley #if defined(PETSC_HAVE_YAML) 69656a31166SBarry Smith { 6979fc438c3SToby Isaac char *eoptions = NULL; 6989fc438c3SToby Isaac size_t len = 0; 6999fc438c3SToby Isaac if (!rank) { 7009fc438c3SToby Isaac eoptions = (char*)getenv("PETSC_OPTIONS_YAML"); 7019fc438c3SToby Isaac ierr = PetscStrlen(eoptions,&len);CHKERRQ(ierr); 7029fc438c3SToby Isaac ierr = MPI_Bcast(&len,1,MPIU_SIZE_T,0,PETSC_COMM_WORLD);CHKERRQ(ierr); 7039fc438c3SToby Isaac } else { 7049fc438c3SToby Isaac ierr = MPI_Bcast(&len,1,MPIU_SIZE_T,0,PETSC_COMM_WORLD);CHKERRQ(ierr); 7059fc438c3SToby Isaac if (len) { 7069fc438c3SToby Isaac ierr = PetscMalloc1(len+1,&eoptions);CHKERRQ(ierr); 7079fc438c3SToby Isaac } 7089fc438c3SToby Isaac } 7099fc438c3SToby Isaac if (len) { 7109fc438c3SToby Isaac ierr = MPI_Bcast(eoptions,len,MPI_CHAR,0,PETSC_COMM_WORLD);CHKERRQ(ierr); 7119fc438c3SToby Isaac if (rank) eoptions[len] = 0; 7129fc438c3SToby Isaac ierr = PetscOptionsInsertStringYAML(options,eoptions);CHKERRQ(ierr); 7139fc438c3SToby Isaac if (rank) {ierr = PetscFree(eoptions);CHKERRQ(ierr);} 7149fc438c3SToby Isaac } 7159fc438c3SToby Isaac } 7169fc438c3SToby Isaac { 7173bcbd388SSean Farley char yaml_file[PETSC_MAX_PATH_LEN]; 718080f0011SToby Isaac char yaml_string[BUFSIZ]; 71956a31166SBarry Smith PetscBool yaml_flg; 720c5929fdfSBarry Smith ierr = PetscOptionsGetString(NULL,NULL,"-options_file_yaml",yaml_file,PETSC_MAX_PATH_LEN,&yaml_flg);CHKERRQ(ierr); 72156a31166SBarry Smith if (yaml_flg) { 72256a31166SBarry Smith ierr = PetscOptionsInsertFileYAML(PETSC_COMM_WORLD,yaml_file,PETSC_TRUE);CHKERRQ(ierr); 72356a31166SBarry Smith } 724080f0011SToby Isaac ierr = PetscOptionsGetString(NULL,NULL,"-options_string_yaml",yaml_string,BUFSIZ,&yaml_flg);CHKERRQ(ierr); 725080f0011SToby Isaac if (yaml_flg) { 726080f0011SToby Isaac ierr = PetscOptionsInsertStringYAML(NULL,yaml_string);CHKERRQ(ierr); 727080f0011SToby Isaac } 72856a31166SBarry Smith } 7293bcbd388SSean Farley #endif 7303bcbd388SSean Farley 73185079163SJed Brown /* insert command line options again because they take precedence over arguments in petscrc/environment */ 7322d747510SLisandro Dalcin if (argc && args && *argc) {ierr = PetscOptionsInsertArgs(options,*argc,*args);CHKERRQ(ierr);} 733e5c89e4eSSatish Balay PetscFunctionReturn(0); 734e5c89e4eSSatish Balay } 735e5c89e4eSSatish Balay 736e5c89e4eSSatish Balay /*@C 73788c29154SBarry Smith PetscOptionsView - Prints the options that have been loaded. This is 738e5c89e4eSSatish Balay useful for debugging purposes. 739e5c89e4eSSatish Balay 740c139c21fSBarry Smith Logically Collective on PetscViewer 741e5c89e4eSSatish Balay 742e5c89e4eSSatish Balay Input Parameter: 743a2b725a8SWilliam Gropp + options - options database, use NULL for default global database 744a2b725a8SWilliam Gropp - viewer - must be an PETSCVIEWERASCII viewer 745e5c89e4eSSatish Balay 746e5c89e4eSSatish Balay Options Database Key: 74726a7e8d4SBarry Smith . -options_view - Activates PetscOptionsView() within PetscFinalize() 748e5c89e4eSSatish Balay 7499666a313SBarry Smith Notes: 7509666a313SBarry Smith Only the rank zero process of MPI_Comm used to create view prints the option values. Other processes 7511c9f3c13SBarry Smith may have different values but they are not printed. 7521c9f3c13SBarry Smith 753e5c89e4eSSatish Balay Level: advanced 754e5c89e4eSSatish Balay 755e5c89e4eSSatish Balay .seealso: PetscOptionsAllUsed() 756e5c89e4eSSatish Balay @*/ 757c5929fdfSBarry Smith PetscErrorCode PetscOptionsView(PetscOptions options,PetscViewer viewer) 758e5c89e4eSSatish Balay { 759e5c89e4eSSatish Balay PetscErrorCode ierr; 760431c96f7SBarry Smith PetscInt i; 76188c29154SBarry Smith PetscBool isascii; 762e5c89e4eSSatish Balay 763e5c89e4eSSatish Balay PetscFunctionBegin; 7642d747510SLisandro Dalcin if (viewer) PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2); 765c5929fdfSBarry Smith options = options ? options : defaultoptions; 76688c29154SBarry Smith if (!viewer) viewer = PETSC_VIEWER_STDOUT_WORLD; 767251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&isascii);CHKERRQ(ierr); 768ce94432eSBarry Smith if (!isascii) SETERRQ(PetscObjectComm((PetscObject)viewer),PETSC_ERR_SUP,"Only supports ASCII viewer"); 76988c29154SBarry Smith 7702d747510SLisandro Dalcin if (!options->N) { 77188c29154SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"#No PETSc Option Table entries\n");CHKERRQ(ierr); 7722d747510SLisandro Dalcin PetscFunctionReturn(0); 77330694fe9SBarry Smith } 7742d747510SLisandro Dalcin 7752d747510SLisandro Dalcin ierr = PetscViewerASCIIPrintf(viewer,"#PETSc Option Table entries:\n");CHKERRQ(ierr); 776e5c89e4eSSatish Balay for (i=0; i<options->N; i++) { 777e5c89e4eSSatish Balay if (options->values[i]) { 77888c29154SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"-%s %s\n",options->names[i],options->values[i]);CHKERRQ(ierr); 779e5c89e4eSSatish Balay } else { 78088c29154SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"-%s\n",options->names[i]);CHKERRQ(ierr); 781e5c89e4eSSatish Balay } 782e5c89e4eSSatish Balay } 78388c29154SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"#End of PETSc Option Table entries\n");CHKERRQ(ierr); 784e5c89e4eSSatish Balay PetscFunctionReturn(0); 785e5c89e4eSSatish Balay } 786e5c89e4eSSatish Balay 787e11779c2SBarry Smith /* 788e11779c2SBarry Smith Called by error handlers to print options used in run 789e11779c2SBarry Smith */ 79095c0884eSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscOptionsViewError(void) 791e11779c2SBarry Smith { 792e11779c2SBarry Smith PetscInt i; 7934416b707SBarry Smith PetscOptions options = defaultoptions; 794e11779c2SBarry Smith 795e11779c2SBarry Smith PetscFunctionBegin; 796e11779c2SBarry Smith if (options->N) { 797e11779c2SBarry Smith (*PetscErrorPrintf)("PETSc Option Table entries:\n"); 798e11779c2SBarry Smith } else { 799e11779c2SBarry Smith (*PetscErrorPrintf)("No PETSc Option Table entries\n"); 800e11779c2SBarry Smith } 801e11779c2SBarry Smith for (i=0; i<options->N; i++) { 802e11779c2SBarry Smith if (options->values[i]) { 803e11779c2SBarry Smith (*PetscErrorPrintf)("-%s %s\n",options->names[i],options->values[i]); 804e11779c2SBarry Smith } else { 805e11779c2SBarry Smith (*PetscErrorPrintf)("-%s\n",options->names[i]); 806e11779c2SBarry Smith } 807e11779c2SBarry Smith } 808e11779c2SBarry Smith PetscFunctionReturn(0); 809e11779c2SBarry Smith } 810e11779c2SBarry Smith 811e5c89e4eSSatish Balay /*@C 81274e0666dSJed Brown PetscOptionsPrefixPush - Designate a prefix to be used by all options insertions to follow. 81374e0666dSJed Brown 8141c9f3c13SBarry Smith Logically Collective 81574e0666dSJed Brown 8169db968c8SJed Brown Input Parameter: 817c5929fdfSBarry Smith + options - options database, or NULL for the default global database 818c5929fdfSBarry Smith - prefix - The string to append to the existing prefix 8199db968c8SJed Brown 8209db968c8SJed Brown Options Database Keys: 8219db968c8SJed Brown + -prefix_push <some_prefix_> - push the given prefix 8229db968c8SJed Brown - -prefix_pop - pop the last prefix 8239db968c8SJed Brown 8249db968c8SJed Brown Notes: 8259db968c8SJed Brown It is common to use this in conjunction with -options_file as in 8269db968c8SJed Brown 8279db968c8SJed Brown $ -prefix_push system1_ -options_file system1rc -prefix_pop -prefix_push system2_ -options_file system2rc -prefix_pop 8289db968c8SJed Brown 8299db968c8SJed Brown where the files no longer require all options to be prefixed with -system2_. 83074e0666dSJed Brown 8319666a313SBarry Smith The collectivity of this routine is complex; only the MPI processes that call this routine will 8321c9f3c13SBarry Smith have the affect of these options. If some processes that create objects call this routine and others do 8331c9f3c13SBarry Smith not the code may fail in complicated ways because the same parallel solvers may incorrectly use different options 8341c9f3c13SBarry Smith on different ranks. 8351c9f3c13SBarry Smith 83674e0666dSJed Brown Level: advanced 83774e0666dSJed Brown 8381c9f3c13SBarry Smith .seealso: PetscOptionsPrefixPop(), PetscOptionsPush(), PetscOptionsPop(), PetscOptionsCreate(), PetscOptionsSetValue() 83974e0666dSJed Brown @*/ 840c5929fdfSBarry Smith PetscErrorCode PetscOptionsPrefixPush(PetscOptions options,const char prefix[]) 84174e0666dSJed Brown { 84274e0666dSJed Brown PetscErrorCode ierr; 84374e0666dSJed Brown size_t n; 84474e0666dSJed Brown PetscInt start; 8452d747510SLisandro Dalcin char key[MAXOPTNAME+1]; 8462d747510SLisandro Dalcin PetscBool valid; 84774e0666dSJed Brown 84874e0666dSJed Brown PetscFunctionBegin; 8499db968c8SJed Brown PetscValidCharPointer(prefix,1); 850c5929fdfSBarry Smith options = options ? options : defaultoptions; 85174e0666dSJed 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); 8522d747510SLisandro Dalcin key[0] = '-'; /* keys must start with '-' */ 8532d747510SLisandro Dalcin ierr = PetscStrncpy(key+1,prefix,sizeof(key)-1);CHKERRQ(ierr); 8542d747510SLisandro Dalcin ierr = PetscOptionsValidKey(key,&valid);CHKERRQ(ierr); 8552d747510SLisandro Dalcin if (!valid) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_USER,"Given prefix \"%s\" not valid (the first character must be a letter, do not include leading '-')",prefix); 85674e0666dSJed Brown start = options->prefixind ? options->prefixstack[options->prefixind-1] : 0; 85774e0666dSJed Brown ierr = PetscStrlen(prefix,&n);CHKERRQ(ierr); 85874e0666dSJed Brown if (n+1 > sizeof(options->prefix)-start) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Maximum prefix length %d exceeded",sizeof(options->prefix)); 859580bdb30SBarry Smith ierr = PetscArraycpy(options->prefix+start,prefix,n+1);CHKERRQ(ierr); 86074e0666dSJed Brown options->prefixstack[options->prefixind++] = start+n; 86174e0666dSJed Brown PetscFunctionReturn(0); 86274e0666dSJed Brown } 86374e0666dSJed Brown 864c5929fdfSBarry Smith /*@C 86574e0666dSJed Brown PetscOptionsPrefixPop - Remove the latest options prefix, see PetscOptionsPrefixPush() for details 86674e0666dSJed Brown 8671c9f3c13SBarry Smith Logically Collective on the MPI_Comm that called PetscOptionsPrefixPush() 86874e0666dSJed Brown 869c5929fdfSBarry Smith Input Parameters: 870c5929fdfSBarry Smith . options - options database, or NULL for the default global database 871c5929fdfSBarry Smith 87274e0666dSJed Brown Level: advanced 87374e0666dSJed Brown 8741c9f3c13SBarry Smith .seealso: PetscOptionsPrefixPush(), PetscOptionsPush(), PetscOptionsPop(), PetscOptionsCreate(), PetscOptionsSetValue() 87574e0666dSJed Brown @*/ 876c5929fdfSBarry Smith PetscErrorCode PetscOptionsPrefixPop(PetscOptions options) 87774e0666dSJed Brown { 87874e0666dSJed Brown PetscInt offset; 87974e0666dSJed Brown 88074e0666dSJed Brown PetscFunctionBegin; 881c5929fdfSBarry Smith options = options ? options : defaultoptions; 88274e0666dSJed Brown if (options->prefixind < 1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"More prefixes popped than pushed"); 88374e0666dSJed Brown options->prefixind--; 88474e0666dSJed Brown offset = options->prefixind ? options->prefixstack[options->prefixind-1] : 0; 88574e0666dSJed Brown options->prefix[offset] = 0; 88674e0666dSJed Brown PetscFunctionReturn(0); 88774e0666dSJed Brown } 88874e0666dSJed Brown 889a542b6e8SBarry Smith /*@C 890a542b6e8SBarry Smith PetscOptionsClear - Removes all options form the database leaving it empty. 891a542b6e8SBarry Smith 8921c9f3c13SBarry Smith Logically Collective 8931c9f3c13SBarry Smith 894c5929fdfSBarry Smith Input Parameters: 895c5929fdfSBarry Smith . options - options database, use NULL for the default global database 896c5929fdfSBarry Smith 8979666a313SBarry Smith The collectivity of this routine is complex; only the MPI processes that call this routine will 8981c9f3c13SBarry Smith have the affect of these options. If some processes that create objects call this routine and others do 8991c9f3c13SBarry Smith not the code may fail in complicated ways because the same parallel solvers may incorrectly use different options 9001c9f3c13SBarry Smith on different ranks. 9011c9f3c13SBarry Smith 902a542b6e8SBarry Smith Level: developer 903a542b6e8SBarry Smith 904a542b6e8SBarry Smith .seealso: PetscOptionsInsert() 905a542b6e8SBarry Smith @*/ 906c5929fdfSBarry Smith PetscErrorCode PetscOptionsClear(PetscOptions options) 907a542b6e8SBarry Smith { 908a542b6e8SBarry Smith PetscInt i; 909a542b6e8SBarry Smith 910c5929fdfSBarry Smith options = options ? options : defaultoptions; 9112d747510SLisandro Dalcin if (!options) return 0; 9122d747510SLisandro Dalcin 913a542b6e8SBarry Smith for (i=0; i<options->N; i++) { 914a542b6e8SBarry Smith if (options->names[i]) free(options->names[i]); 915a542b6e8SBarry Smith if (options->values[i]) free(options->values[i]); 916a542b6e8SBarry Smith } 9172d747510SLisandro Dalcin options->N = 0; 9182d747510SLisandro Dalcin 919a542b6e8SBarry Smith for (i=0; i<options->Naliases; i++) { 920a542b6e8SBarry Smith free(options->aliases1[i]); 921a542b6e8SBarry Smith free(options->aliases2[i]); 922a542b6e8SBarry Smith } 923a542b6e8SBarry Smith options->Naliases = 0; 924a542b6e8SBarry Smith 9252d747510SLisandro Dalcin /* destroy hash table */ 9262d747510SLisandro Dalcin kh_destroy(HO,options->ht); 9272d747510SLisandro Dalcin options->ht = NULL; 9280eb63584SBarry Smith 9292d747510SLisandro Dalcin options->prefixind = 0; 9302d747510SLisandro Dalcin options->prefix[0] = 0; 9312d747510SLisandro Dalcin options->help = PETSC_FALSE; 9324416b707SBarry Smith return 0; 9334416b707SBarry Smith } 9344416b707SBarry Smith 9352d747510SLisandro Dalcin /*@C 9362d747510SLisandro Dalcin PetscOptionsSetAlias - Makes a key and alias for another key 9372d747510SLisandro Dalcin 9381c9f3c13SBarry Smith Logically Collective 9392d747510SLisandro Dalcin 9402d747510SLisandro Dalcin Input Parameters: 9412d747510SLisandro Dalcin + options - options database, or NULL for default global database 9422d747510SLisandro Dalcin . newname - the alias 9432d747510SLisandro Dalcin - oldname - the name that alias will refer to 9442d747510SLisandro Dalcin 9452d747510SLisandro Dalcin Level: advanced 9462d747510SLisandro Dalcin 9479666a313SBarry Smith The collectivity of this routine is complex; only the MPI processes that call this routine will 9481c9f3c13SBarry Smith have the affect of these options. If some processes that create objects call this routine and others do 9491c9f3c13SBarry Smith not the code may fail in complicated ways because the same parallel solvers may incorrectly use different options 9501c9f3c13SBarry Smith on different ranks. 9511c9f3c13SBarry Smith 9522d747510SLisandro Dalcin .seealso: PetscOptionsGetInt(), PetscOptionsGetReal(),OptionsHasName(), 9532d747510SLisandro Dalcin PetscOptionsGetString(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(),PetscOptionsBool(), 9542d747510SLisandro Dalcin PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 9552d747510SLisandro Dalcin PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 9562d747510SLisandro Dalcin PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 9572d747510SLisandro Dalcin PetscOptionsFList(), PetscOptionsEList() 9582d747510SLisandro Dalcin @*/ 9592d747510SLisandro Dalcin PetscErrorCode PetscOptionsSetAlias(PetscOptions options,const char newname[],const char oldname[]) 9602d747510SLisandro Dalcin { 9612d747510SLisandro Dalcin PetscInt n; 9622d747510SLisandro Dalcin size_t len; 9632d747510SLisandro Dalcin PetscErrorCode ierr; 9642d747510SLisandro Dalcin 9652d747510SLisandro Dalcin PetscFunctionBegin; 9662d747510SLisandro Dalcin PetscValidCharPointer(newname,2); 9672d747510SLisandro Dalcin PetscValidCharPointer(oldname,3); 9682d747510SLisandro Dalcin options = options ? options : defaultoptions; 9692d747510SLisandro Dalcin if (newname[0] != '-') SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"aliased must start with '-': Instead %s",newname); 9702d747510SLisandro Dalcin if (oldname[0] != '-') SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"aliasee must start with '-': Instead %s",oldname); 9712d747510SLisandro Dalcin 9722d747510SLisandro Dalcin n = options->Naliases; 9732d747510SLisandro 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); 9742d747510SLisandro Dalcin 9752d747510SLisandro Dalcin newname++; oldname++; 9762d747510SLisandro Dalcin ierr = PetscStrlen(newname,&len);CHKERRQ(ierr); 9772d747510SLisandro Dalcin options->aliases1[n] = (char*)malloc((len+1)*sizeof(char)); 9782d747510SLisandro Dalcin ierr = PetscStrcpy(options->aliases1[n],newname);CHKERRQ(ierr); 9792d747510SLisandro Dalcin ierr = PetscStrlen(oldname,&len);CHKERRQ(ierr); 9802d747510SLisandro Dalcin options->aliases2[n] = (char*)malloc((len+1)*sizeof(char)); 9812d747510SLisandro Dalcin ierr = PetscStrcpy(options->aliases2[n],oldname);CHKERRQ(ierr); 9822d747510SLisandro Dalcin options->Naliases++; 9832d747510SLisandro Dalcin PetscFunctionReturn(0); 9842d747510SLisandro Dalcin } 9854416b707SBarry Smith 986e5c89e4eSSatish Balay /*@C 987e5c89e4eSSatish Balay PetscOptionsSetValue - Sets an option name-value pair in the options 988e5c89e4eSSatish Balay database, overriding whatever is already present. 989e5c89e4eSSatish Balay 9901c9f3c13SBarry Smith Logically Collective 991e5c89e4eSSatish Balay 992e5c89e4eSSatish Balay Input Parameters: 993c5929fdfSBarry Smith + options - options database, use NULL for the default global database 994c5929fdfSBarry Smith . name - name of option, this SHOULD have the - prepended 9952d747510SLisandro Dalcin - value - the option value (not used for all options, so can be NULL) 996e5c89e4eSSatish Balay 997e5c89e4eSSatish Balay Level: intermediate 998e5c89e4eSSatish Balay 999e5c89e4eSSatish Balay Note: 1000d49172ceSBarry Smith This function can be called BEFORE PetscInitialize() 1001d49172ceSBarry 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 10072d747510SLisandro Dalcin Developers Note: Uses malloc() directly because PETSc may not be initialized yet. 1008b0250c70SBarry Smith 10092d747510SLisandro Dalcin .seealso: PetscOptionsInsert(), PetscOptionsClearValue() 1010e5c89e4eSSatish Balay @*/ 10112d747510SLisandro Dalcin PetscErrorCode PetscOptionsSetValue(PetscOptions options,const char name[],const char value[]) 1012e5c89e4eSSatish Balay { 1013e5c89e4eSSatish Balay size_t len; 10142d747510SLisandro Dalcin int N,n,i; 1015e5c89e4eSSatish Balay char **names; 10162d747510SLisandro Dalcin char fullname[MAXOPTNAME] = ""; 10172d747510SLisandro Dalcin PetscErrorCode ierr; 1018e5c89e4eSSatish Balay 10197272c0d2SVaclav Hapla if (!options) { 10202d747510SLisandro Dalcin ierr = PetscOptionsCreateDefault();if (ierr) return ierr; 10217272c0d2SVaclav Hapla options = defaultoptions; 1022c5929fdfSBarry Smith } 10232d747510SLisandro Dalcin 10242d747510SLisandro Dalcin if (name[0] != '-') return PETSC_ERR_ARG_OUTOFRANGE; 1025e5c89e4eSSatish Balay 1026d49172ceSBarry Smith /* this is so that -h and -help are equivalent (p4 does not like -help)*/ 10277272c0d2SVaclav Hapla if (!PetscOptNameCmp(name,"-h")) name = "-help"; 10282d747510SLisandro Dalcin if (!PetscOptNameCmp(name,"-help")) options->help = PETSC_TRUE; 1029e5c89e4eSSatish Balay 10302d747510SLisandro Dalcin name++; /* skip starting dash */ 10312d747510SLisandro Dalcin 103274e0666dSJed Brown if (options->prefixind > 0) { 1033d49172ceSBarry Smith strncpy(fullname,options->prefix,sizeof(fullname)); 10342d747510SLisandro Dalcin fullname[sizeof(fullname)-1] = 0; 103589ae1891SBarry Smith strncat(fullname,name,sizeof(fullname)-strlen(fullname)-1); 10362d747510SLisandro Dalcin fullname[sizeof(fullname)-1] = 0; 103774e0666dSJed Brown name = fullname; 103874e0666dSJed Brown } 103974e0666dSJed Brown 104074e0666dSJed Brown /* check against aliases */ 1041e5c89e4eSSatish Balay N = options->Naliases; 1042e5c89e4eSSatish Balay for (i=0; i<N; i++) { 10432d747510SLisandro Dalcin int result = PetscOptNameCmp(options->aliases1[i],name); 10442d747510SLisandro Dalcin if (!result) { name = options->aliases2[i]; break; } 1045e5c89e4eSSatish Balay } 1046e5c89e4eSSatish Balay 10472d747510SLisandro Dalcin /* slow search */ 10482d747510SLisandro Dalcin N = n = options->N; 1049e5c89e4eSSatish Balay names = options->names; 1050e5c89e4eSSatish Balay for (i=0; i<N; i++) { 10512d747510SLisandro Dalcin int result = PetscOptNameCmp(names[i],name); 10522d747510SLisandro Dalcin if (!result) { 10532d747510SLisandro Dalcin n = i; goto setvalue; 10542d747510SLisandro Dalcin } else if (result > 0) { 10552d747510SLisandro Dalcin n = i; break; 1056e5c89e4eSSatish Balay } 1057e5c89e4eSSatish Balay } 10582d747510SLisandro Dalcin if (N >= MAXOPTIONS) return PETSC_ERR_MEM; 10592d747510SLisandro Dalcin /* shift remaining values up 1 */ 1060e5c89e4eSSatish Balay for (i=N; i>n; i--) { 10615e8c5e88SLisandro Dalcin options->names[i] = options->names[i-1]; 1062e5c89e4eSSatish Balay options->values[i] = options->values[i-1]; 1063e5c89e4eSSatish Balay options->used[i] = options->used[i-1]; 1064e5c89e4eSSatish Balay } 10652d747510SLisandro Dalcin options->names[n] = NULL; 10662d747510SLisandro Dalcin options->values[n] = NULL; 10672d747510SLisandro Dalcin options->used[n] = PETSC_FALSE; 10682d747510SLisandro Dalcin options->N++; 10692d747510SLisandro Dalcin 10702d747510SLisandro Dalcin /* destroy hash table */ 10712d747510SLisandro Dalcin kh_destroy(HO,options->ht); 10722d747510SLisandro Dalcin options->ht = NULL; 10732d747510SLisandro Dalcin 10742d747510SLisandro Dalcin /* set new name */ 107570d8d27cSBarry Smith len = strlen(name); 10765e8c5e88SLisandro Dalcin options->names[n] = (char*)malloc((len+1)*sizeof(char)); 1077d49172ceSBarry Smith if (!options->names[n]) return PETSC_ERR_MEM; 1078d49172ceSBarry Smith strcpy(options->names[n],name); 10792d747510SLisandro Dalcin 10802d747510SLisandro Dalcin setvalue: 10812d747510SLisandro Dalcin /* set new value */ 10822d747510SLisandro Dalcin if (options->values[n]) free(options->values[n]); 1083d49172ceSBarry Smith len = value ? strlen(value) : 0; 10845e8c5e88SLisandro Dalcin if (len) { 1085e5c89e4eSSatish Balay options->values[n] = (char*)malloc((len+1)*sizeof(char)); 1086d49172ceSBarry Smith if (!options->values[n]) return PETSC_ERR_MEM; 1087d49172ceSBarry Smith strcpy(options->values[n],value); 10882d747510SLisandro Dalcin } else { 10892d747510SLisandro Dalcin options->values[n] = NULL; 10902d747510SLisandro Dalcin } 10912d747510SLisandro Dalcin 10922d747510SLisandro Dalcin ierr = PetscOptionsMonitor(options,name,value?value:"");if (ierr) return ierr; 1093d49172ceSBarry Smith return 0; 1094e5c89e4eSSatish Balay } 1095e5c89e4eSSatish Balay 1096e5c89e4eSSatish Balay /*@C 1097e5c89e4eSSatish Balay PetscOptionsClearValue - Clears an option name-value pair in the options 1098e5c89e4eSSatish Balay database, overriding whatever is already present. 1099e5c89e4eSSatish Balay 11001c9f3c13SBarry Smith Logically Collective 1101e5c89e4eSSatish Balay 1102e5c89e4eSSatish Balay Input Parameter: 1103c5929fdfSBarry Smith + options - options database, use NULL for the default global database 1104a2b725a8SWilliam Gropp - name - name of option, this SHOULD have the - prepended 1105e5c89e4eSSatish Balay 1106e5c89e4eSSatish Balay Level: intermediate 1107e5c89e4eSSatish Balay 11089666a313SBarry Smith The collectivity of this routine is complex; only the MPI processes that call this routine will 11091c9f3c13SBarry Smith have the affect of these options. If some processes that create objects call this routine and others do 11101c9f3c13SBarry Smith not the code may fail in complicated ways because the same parallel solvers may incorrectly use different options 11111c9f3c13SBarry Smith on different ranks. 11121c9f3c13SBarry Smith 1113e5c89e4eSSatish Balay .seealso: PetscOptionsInsert() 1114e5c89e4eSSatish Balay @*/ 11152d747510SLisandro Dalcin PetscErrorCode PetscOptionsClearValue(PetscOptions options,const char name[]) 1116e5c89e4eSSatish Balay { 11172d747510SLisandro Dalcin int N,n,i; 11182d747510SLisandro Dalcin char **names; 1119e5c89e4eSSatish Balay PetscErrorCode ierr; 1120e5c89e4eSSatish Balay 1121e5c89e4eSSatish Balay PetscFunctionBegin; 1122c5929fdfSBarry Smith options = options ? options : defaultoptions; 11232d747510SLisandro Dalcin if (name[0] != '-') SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Name must begin with '-': Instead %s",name); 1124e5c89e4eSSatish Balay 11252d747510SLisandro Dalcin /* this is so that -h and -help are equivalent (p4 does not like -help)*/ 11262d747510SLisandro Dalcin if (!strcmp(name,"-h")) name = "-help"; 11272d747510SLisandro Dalcin if (!PetscOptNameCmp(name,"-help")) options->help = PETSC_FALSE; 11282d747510SLisandro Dalcin 11292d747510SLisandro Dalcin name++; /* skip starting dash */ 11302d747510SLisandro Dalcin 11312d747510SLisandro Dalcin /* slow search */ 11322d747510SLisandro Dalcin N = n = options->N; 1133e5c89e4eSSatish Balay names = options->names; 1134e5c89e4eSSatish Balay for (i=0; i<N; i++) { 11352d747510SLisandro Dalcin int result = PetscOptNameCmp(names[i],name); 11362d747510SLisandro Dalcin if (!result) { 11372d747510SLisandro Dalcin n = i; break; 11382d747510SLisandro Dalcin } else if (result > 0) { 11392d747510SLisandro Dalcin n = N; break; 1140e5c89e4eSSatish Balay } 11412d747510SLisandro Dalcin } 11422d747510SLisandro Dalcin if (n == N) PetscFunctionReturn(0); /* it was not present */ 1143e5c89e4eSSatish Balay 11442d747510SLisandro Dalcin /* remove name and value */ 11452d747510SLisandro Dalcin if (options->names[n]) free(options->names[n]); 11462d747510SLisandro Dalcin if (options->values[n]) free(options->values[n]); 1147e5c89e4eSSatish Balay /* shift remaining values down 1 */ 1148e5c89e4eSSatish Balay for (i=n; i<N-1; i++) { 11495e8c5e88SLisandro Dalcin options->names[i] = options->names[i+1]; 1150e5c89e4eSSatish Balay options->values[i] = options->values[i+1]; 1151e5c89e4eSSatish Balay options->used[i] = options->used[i+1]; 1152e5c89e4eSSatish Balay } 1153e5c89e4eSSatish Balay options->N--; 11542d747510SLisandro Dalcin 11552d747510SLisandro Dalcin /* destroy hash table */ 11562d747510SLisandro Dalcin kh_destroy(HO,options->ht); 11572d747510SLisandro Dalcin options->ht = NULL; 11582d747510SLisandro Dalcin 11592d747510SLisandro Dalcin ierr = PetscOptionsMonitor(options,name,NULL);CHKERRQ(ierr); 1160e5c89e4eSSatish Balay PetscFunctionReturn(0); 1161e5c89e4eSSatish Balay } 1162e5c89e4eSSatish Balay 1163e5c89e4eSSatish Balay /*@C 11642d747510SLisandro Dalcin PetscOptionsFindPair - Gets an option name-value pair from the options database. 1165e5c89e4eSSatish Balay 11662d747510SLisandro Dalcin Not Collective 1167e5c89e4eSSatish Balay 1168e5c89e4eSSatish Balay Input Parameters: 11692d747510SLisandro Dalcin + options - options database, use NULL for the default global database 11702d747510SLisandro Dalcin . pre - the string to prepend to the name or NULL, this SHOULD NOT have the "-" prepended 11712d747510SLisandro Dalcin - name - name of option, this SHOULD have the "-" prepended 1172e5c89e4eSSatish Balay 11732d747510SLisandro Dalcin Output Parameters: 11742d747510SLisandro Dalcin + value - the option value (optional, not used for all options) 11752d747510SLisandro Dalcin - set - whether the option is set (optional) 1176e5c89e4eSSatish Balay 11779666a313SBarry Smith Notes: 11789666a313SBarry Smith Each process may find different values or no value depending on how options were inserted into the database 11791c9f3c13SBarry Smith 11802d747510SLisandro Dalcin Level: developer 11812d747510SLisandro Dalcin 11822d747510SLisandro Dalcin .seealso: PetscOptionsSetValue(), PetscOptionsClearValue() 1183e5c89e4eSSatish Balay @*/ 11842d747510SLisandro Dalcin PetscErrorCode PetscOptionsFindPair(PetscOptions options,const char pre[],const char name[],const char *value[],PetscBool *set) 1185e5c89e4eSSatish Balay { 11862d747510SLisandro Dalcin char buf[MAXOPTNAME]; 1187daabea38SBarry Smith PetscBool usehashtable = PETSC_TRUE; 11882d747510SLisandro Dalcin PetscBool matchnumbers = PETSC_TRUE; 1189e5c89e4eSSatish Balay PetscErrorCode ierr; 1190e5c89e4eSSatish Balay 1191e5c89e4eSSatish Balay PetscFunctionBegin; 1192c5929fdfSBarry Smith options = options ? options : defaultoptions; 11932d747510SLisandro Dalcin if (pre && PetscUnlikely(pre[0] == '-')) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Prefix cannot begin with '-': Instead %s",pre); 11942d747510SLisandro Dalcin if (PetscUnlikely(name[0] != '-')) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Name must begin with '-': Instead %s",name); 1195e5c89e4eSSatish Balay 11962d747510SLisandro Dalcin name++; /* skip starting dash */ 1197e5c89e4eSSatish Balay 11987cd08cecSJed Brown /* append prefix to name, if prefix="foo_" and option='--bar", prefixed option is --foo_bar */ 11992d747510SLisandro Dalcin if (pre && pre[0]) { 12002d747510SLisandro Dalcin char *ptr = buf; 12012d747510SLisandro Dalcin if (name[0] == '-') { *ptr++ = '-'; name++; } 12022d747510SLisandro Dalcin ierr = PetscStrncpy(ptr,pre,buf+sizeof(buf)-ptr);CHKERRQ(ierr); 12032d747510SLisandro Dalcin ierr = PetscStrlcat(buf,name,sizeof(buf));CHKERRQ(ierr); 12042d747510SLisandro Dalcin name = buf; 12057cd08cecSJed Brown } 12062d747510SLisandro Dalcin 120776bd3646SJed Brown if (PetscDefined(USE_DEBUG)) { 12082f828895SJed Brown PetscBool valid; 12092d747510SLisandro Dalcin char key[MAXOPTNAME+1] = "-"; 12102d747510SLisandro Dalcin ierr = PetscStrncpy(key+1,name,sizeof(key)-1);CHKERRQ(ierr); 12112f828895SJed Brown ierr = PetscOptionsValidKey(key,&valid);CHKERRQ(ierr); 12122f828895SJed 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); 12132f828895SJed Brown } 1214e5c89e4eSSatish Balay 12152d747510SLisandro Dalcin if (!options->ht && usehashtable) { 12162d747510SLisandro Dalcin int i,ret; 12172d747510SLisandro Dalcin khiter_t it; 12182d747510SLisandro Dalcin khash_t(HO) *ht; 12192d747510SLisandro Dalcin ht = kh_init(HO); 12202d747510SLisandro Dalcin if (PetscUnlikely(!ht)) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_MEM,"Hash table allocation failed"); 12212d747510SLisandro Dalcin ret = kh_resize(HO,ht,options->N*2); /* twice the required size to reduce risk of collisions */ 12222d747510SLisandro Dalcin if (PetscUnlikely(ret)) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_MEM,"Hash table allocation failed"); 12232d747510SLisandro Dalcin for (i=0; i<options->N; i++) { 12242d747510SLisandro Dalcin it = kh_put(HO,ht,options->names[i],&ret); 12252d747510SLisandro Dalcin if (PetscUnlikely(ret != 1)) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_MEM,"Hash table allocation failed"); 12262d747510SLisandro Dalcin kh_val(ht,it) = i; 12272d747510SLisandro Dalcin } 12282d747510SLisandro Dalcin options->ht = ht; 12292d747510SLisandro Dalcin } 12302d747510SLisandro Dalcin 12312d747510SLisandro Dalcin if (usehashtable) 12322d747510SLisandro Dalcin { /* fast search */ 12332d747510SLisandro Dalcin khash_t(HO) *ht = options->ht; 12342d747510SLisandro Dalcin khiter_t it = kh_get(HO,ht,name); 12352d747510SLisandro Dalcin if (it != kh_end(ht)) { 12362d747510SLisandro Dalcin int i = kh_val(ht,it); 1237e5c89e4eSSatish Balay options->used[i] = PETSC_TRUE; 12382d747510SLisandro Dalcin if (value) *value = options->values[i]; 12392d747510SLisandro Dalcin if (set) *set = PETSC_TRUE; 12402d747510SLisandro Dalcin PetscFunctionReturn(0); 12412d747510SLisandro Dalcin } 12422d747510SLisandro Dalcin } else 12432d747510SLisandro Dalcin { /* slow search */ 12442d747510SLisandro Dalcin int i, N = options->N; 12452d747510SLisandro Dalcin for (i=0; i<N; i++) { 1246daabea38SBarry Smith int result = PetscOptNameCmp(options->names[i],name); 12472d747510SLisandro Dalcin if (!result) { 12482d747510SLisandro Dalcin options->used[i] = PETSC_TRUE; 12492d747510SLisandro Dalcin if (value) *value = options->values[i]; 12502d747510SLisandro Dalcin if (set) *set = PETSC_TRUE; 12512d747510SLisandro Dalcin PetscFunctionReturn(0); 12522d747510SLisandro Dalcin } else if (result > 0) { 1253e5c89e4eSSatish Balay break; 1254e5c89e4eSSatish Balay } 1255e5c89e4eSSatish Balay } 12562d747510SLisandro Dalcin } 12572d747510SLisandro Dalcin 12582d747510SLisandro Dalcin /* 12592d747510SLisandro Dalcin The following block slows down all lookups in the most frequent path (most lookups are unsuccessful). 12602d747510SLisandro Dalcin Maybe this special lookup mode should be enabled on request with a push/pop API. 12612d747510SLisandro Dalcin The feature of matching _%d_ used sparingly in the codebase. 12622d747510SLisandro Dalcin */ 12632d747510SLisandro Dalcin if (matchnumbers) { 12642d747510SLisandro Dalcin int i,j,cnt = 0,locs[16],loce[16]; 1265e5c89e4eSSatish Balay /* determine the location and number of all _%d_ in the key */ 12662d747510SLisandro Dalcin for (i=0; name[i]; i++) { 12672d747510SLisandro Dalcin if (name[i] == '_') { 12682d747510SLisandro Dalcin for (j=i+1; name[j]; j++) { 12692d747510SLisandro Dalcin if (name[j] >= '0' && name[j] <= '9') continue; 12702d747510SLisandro Dalcin if (name[j] == '_' && j > i+1) { /* found a number */ 1271e5c89e4eSSatish Balay locs[cnt] = i+1; 1272e5c89e4eSSatish Balay loce[cnt++] = j+1; 1273e5c89e4eSSatish Balay } 12742d747510SLisandro Dalcin i = j-1; 1275e5c89e4eSSatish Balay break; 1276e5c89e4eSSatish Balay } 1277e5c89e4eSSatish Balay } 1278e5c89e4eSSatish Balay } 1279e5c89e4eSSatish Balay for (i=0; i<cnt; i++) { 12802d747510SLisandro Dalcin PetscBool found; 12812d747510SLisandro Dalcin char opt[MAXOPTNAME+1] = "-", tmp[MAXOPTNAME]; 12822d747510SLisandro Dalcin ierr = PetscStrncpy(tmp,name,PetscMin((size_t)(locs[i]+1),sizeof(tmp)));CHKERRQ(ierr); 12832d747510SLisandro Dalcin ierr = PetscStrlcat(opt,tmp,sizeof(opt));CHKERRQ(ierr); 12842d747510SLisandro Dalcin ierr = PetscStrlcat(opt,name+loce[i],sizeof(opt));CHKERRQ(ierr); 12852d747510SLisandro Dalcin ierr = PetscOptionsFindPair(options,NULL,opt,value,&found);CHKERRQ(ierr); 12862d747510SLisandro Dalcin if (found) {if (set) *set = PETSC_TRUE; PetscFunctionReturn(0);} 1287e5c89e4eSSatish Balay } 1288e5c89e4eSSatish Balay } 12892d747510SLisandro Dalcin 12902d747510SLisandro Dalcin if (set) *set = PETSC_FALSE; 1291e5c89e4eSSatish Balay PetscFunctionReturn(0); 1292e5c89e4eSSatish Balay } 1293e5c89e4eSSatish Balay 1294d6ced9c0SMatthew G. Knepley /* Check whether any option begins with pre+name */ 12952d747510SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscOptionsFindPairPrefix_Private(PetscOptions options,const char pre[], const char name[],const char *value[],PetscBool *set) 1296514bf10dSMatthew G Knepley { 12972d747510SLisandro Dalcin char buf[MAXOPTNAME]; 1298d6ced9c0SMatthew G. Knepley int numCnt = 0, locs[16],loce[16]; 1299514bf10dSMatthew G Knepley PetscErrorCode ierr; 1300514bf10dSMatthew G Knepley 1301514bf10dSMatthew G Knepley PetscFunctionBegin; 1302c5929fdfSBarry Smith options = options ? options : defaultoptions; 13032d747510SLisandro Dalcin if (pre && pre[0] == '-') SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Prefix cannot begin with '-': Instead %s",pre); 13042d747510SLisandro Dalcin if (name[0] != '-') SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Name must begin with '-': Instead %s",name); 1305514bf10dSMatthew G Knepley 13062d747510SLisandro Dalcin name++; /* skip starting dash */ 1307514bf10dSMatthew G Knepley 1308514bf10dSMatthew G Knepley /* append prefix to name, if prefix="foo_" and option='--bar", prefixed option is --foo_bar */ 13092d747510SLisandro Dalcin if (pre && pre[0]) { 13102d747510SLisandro Dalcin char *ptr = buf; 13112d747510SLisandro Dalcin if (name[0] == '-') { *ptr++ = '-'; name++; } 13122d747510SLisandro Dalcin ierr = PetscStrncpy(ptr,pre,sizeof(buf)+(size_t)(ptr-buf));CHKERRQ(ierr); 13132d747510SLisandro Dalcin ierr = PetscStrlcat(buf,name,sizeof(buf));CHKERRQ(ierr); 13142d747510SLisandro Dalcin name = buf; 1315514bf10dSMatthew G Knepley } 13162d747510SLisandro Dalcin 131776bd3646SJed Brown if (PetscDefined(USE_DEBUG)) { 1318514bf10dSMatthew G Knepley PetscBool valid; 13192d747510SLisandro Dalcin char key[MAXOPTNAME+1] = "-"; 13202d747510SLisandro Dalcin ierr = PetscStrncpy(key+1,name,sizeof(key)-1);CHKERRQ(ierr); 1321514bf10dSMatthew G Knepley ierr = PetscOptionsValidKey(key,&valid);CHKERRQ(ierr); 1322514bf10dSMatthew 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); 1323514bf10dSMatthew G Knepley } 1324514bf10dSMatthew G Knepley 1325d6ced9c0SMatthew G. Knepley /* determine the location and number of all _%d_ in the key */ 1326d6ced9c0SMatthew G. Knepley { 1327d6ced9c0SMatthew G. Knepley int i,j; 1328d6ced9c0SMatthew G. Knepley for (i=0; name[i]; i++) { 1329d6ced9c0SMatthew G. Knepley if (name[i] == '_') { 1330d6ced9c0SMatthew G. Knepley for (j=i+1; name[j]; j++) { 1331d6ced9c0SMatthew G. Knepley if (name[j] >= '0' && name[j] <= '9') continue; 1332d6ced9c0SMatthew G. Knepley if (name[j] == '_' && j > i+1) { /* found a number */ 1333d6ced9c0SMatthew G. Knepley locs[numCnt] = i+1; 1334d6ced9c0SMatthew G. Knepley loce[numCnt++] = j+1; 1335d6ced9c0SMatthew G. Knepley } 1336d6ced9c0SMatthew G. Knepley i = j-1; 1337d6ced9c0SMatthew G. Knepley break; 1338d6ced9c0SMatthew G. Knepley } 1339d6ced9c0SMatthew G. Knepley } 1340d6ced9c0SMatthew G. Knepley } 1341d6ced9c0SMatthew G. Knepley } 1342d6ced9c0SMatthew G. Knepley 13432d747510SLisandro Dalcin { /* slow search */ 1344d6ced9c0SMatthew G. Knepley int c, i; 13452d747510SLisandro Dalcin size_t len; 13462d747510SLisandro Dalcin PetscBool match; 1347d6ced9c0SMatthew G. Knepley 1348d6ced9c0SMatthew G. Knepley for (c = -1; c < numCnt; ++c) { 1349d6ced9c0SMatthew G. Knepley char opt[MAXOPTNAME+1] = "", tmp[MAXOPTNAME]; 1350d6ced9c0SMatthew G. Knepley 1351d6ced9c0SMatthew G. Knepley if (c < 0) { 1352d6ced9c0SMatthew G. Knepley ierr = PetscStrcpy(opt,name);CHKERRQ(ierr); 1353d6ced9c0SMatthew G. Knepley } else { 1354d6ced9c0SMatthew G. Knepley ierr = PetscStrncpy(tmp,name,PetscMin((size_t)(locs[c]+1),sizeof(tmp)));CHKERRQ(ierr); 1355d6ced9c0SMatthew G. Knepley ierr = PetscStrlcat(opt,tmp,sizeof(opt));CHKERRQ(ierr); 1356d6ced9c0SMatthew G. Knepley ierr = PetscStrlcat(opt,name+loce[c],sizeof(opt));CHKERRQ(ierr); 1357d6ced9c0SMatthew G. Knepley } 1358d6ced9c0SMatthew G. Knepley ierr = PetscStrlen(opt,&len);CHKERRQ(ierr); 13592d747510SLisandro Dalcin for (i=0; i<options->N; i++) { 1360d6ced9c0SMatthew G. Knepley ierr = PetscStrncmp(options->names[i],opt,len,&match);CHKERRQ(ierr); 1361514bf10dSMatthew G Knepley if (match) { 1362514bf10dSMatthew G Knepley options->used[i] = PETSC_TRUE; 13632d747510SLisandro Dalcin if (value) *value = options->values[i]; 13642d747510SLisandro Dalcin if (set) *set = PETSC_TRUE; 13652d747510SLisandro Dalcin PetscFunctionReturn(0); 1366514bf10dSMatthew G Knepley } 1367514bf10dSMatthew G Knepley } 13682d747510SLisandro Dalcin } 1369d6ced9c0SMatthew G. Knepley } 13702d747510SLisandro Dalcin 13712d747510SLisandro Dalcin if (set) *set = PETSC_FALSE; 1372514bf10dSMatthew G Knepley PetscFunctionReturn(0); 1373514bf10dSMatthew G Knepley } 1374514bf10dSMatthew G Knepley 1375e5c89e4eSSatish Balay /*@C 1376e5c89e4eSSatish Balay PetscOptionsReject - Generates an error if a certain option is given. 1377e5c89e4eSSatish Balay 13781c9f3c13SBarry Smith Not Collective 1379e5c89e4eSSatish Balay 1380e5c89e4eSSatish Balay Input Parameters: 13815c9cc608SHong Zhang + options - options database, use NULL for default global database 13822d747510SLisandro Dalcin . pre - the option prefix (may be NULL) 13832d747510SLisandro Dalcin . name - the option name one is seeking 13840298fd71SBarry Smith - mess - error message (may be NULL) 1385e5c89e4eSSatish Balay 1386e5c89e4eSSatish Balay Level: advanced 1387e5c89e4eSSatish Balay 1388e5c89e4eSSatish Balay .seealso: PetscOptionsGetInt(), PetscOptionsGetReal(),OptionsHasName(), 1389acfcf0e5SJed Brown PetscOptionsGetString(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool(), 1390e5c89e4eSSatish Balay PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 1391e5c89e4eSSatish Balay PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 1392acfcf0e5SJed Brown PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 1393a264d7a6SBarry Smith PetscOptionsFList(), PetscOptionsEList() 1394e5c89e4eSSatish Balay @*/ 13952d747510SLisandro Dalcin PetscErrorCode PetscOptionsReject(PetscOptions options,const char pre[],const char name[],const char mess[]) 1396e5c89e4eSSatish Balay { 1397e5c89e4eSSatish Balay PetscErrorCode ierr; 1398ace3abfcSBarry Smith PetscBool flag = PETSC_FALSE; 1399e5c89e4eSSatish Balay 1400e5c89e4eSSatish Balay PetscFunctionBegin; 14012d747510SLisandro Dalcin ierr = PetscOptionsHasName(options,pre,name,&flag);CHKERRQ(ierr); 1402e5c89e4eSSatish Balay if (flag) { 14032d747510SLisandro 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); 14042d747510SLisandro Dalcin else SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Program has disabled option: -%s%s",pre?pre:"",name+1); 1405e5c89e4eSSatish Balay } 1406e5c89e4eSSatish Balay PetscFunctionReturn(0); 1407e5c89e4eSSatish Balay } 1408e5c89e4eSSatish Balay 1409e5c89e4eSSatish Balay /*@C 14102d747510SLisandro Dalcin PetscOptionsHasHelp - Determines whether the "-help" option is in the database. 14112d747510SLisandro Dalcin 14122d747510SLisandro Dalcin Not Collective 14132d747510SLisandro Dalcin 14142d747510SLisandro Dalcin Input Parameters: 14152d747510SLisandro Dalcin . options - options database, use NULL for default global database 14162d747510SLisandro Dalcin 14172d747510SLisandro Dalcin Output Parameters: 14182d747510SLisandro Dalcin . set - PETSC_TRUE if found else PETSC_FALSE. 14192d747510SLisandro Dalcin 14202d747510SLisandro Dalcin Level: advanced 14212d747510SLisandro Dalcin 14222d747510SLisandro Dalcin .seealso: PetscOptionsHasName() 14232d747510SLisandro Dalcin @*/ 14242d747510SLisandro Dalcin PetscErrorCode PetscOptionsHasHelp(PetscOptions options,PetscBool *set) 14252d747510SLisandro Dalcin { 14262d747510SLisandro Dalcin PetscFunctionBegin; 14272d747510SLisandro Dalcin PetscValidPointer(set,2); 14282d747510SLisandro Dalcin options = options ? options : defaultoptions; 14292d747510SLisandro Dalcin *set = options->help; 14302d747510SLisandro Dalcin PetscFunctionReturn(0); 14312d747510SLisandro Dalcin } 14322d747510SLisandro Dalcin 14332d747510SLisandro Dalcin /*@C 143490d69ab7SBarry 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 143590d69ab7SBarry Smith its value is set to false. 1436e5c89e4eSSatish Balay 1437e5c89e4eSSatish Balay Not Collective 1438e5c89e4eSSatish Balay 1439e5c89e4eSSatish Balay Input Parameters: 14405c9cc608SHong Zhang + options - options database, use NULL for default global database 14413de71b31SHong Zhang . pre - string to prepend to the name or NULL 14423de71b31SHong Zhang - name - the option one is seeking 1443e5c89e4eSSatish Balay 1444e5c89e4eSSatish Balay Output Parameters: 144596ef3cdfSSatish Balay . set - PETSC_TRUE if found else PETSC_FALSE. 1446e5c89e4eSSatish Balay 1447e5c89e4eSSatish Balay Level: beginner 1448e5c89e4eSSatish Balay 144995452b02SPatrick Sanan Notes: 14502d747510SLisandro Dalcin Name cannot be simply "-h". 1451431c96f7SBarry Smith 1452acfcf0e5SJed Brown In many cases you probably want to use PetscOptionsGetBool() instead of calling this, to allowing toggling values. 145390d69ab7SBarry Smith 1454e5c89e4eSSatish Balay .seealso: PetscOptionsGetInt(), PetscOptionsGetReal(), 1455f3e3d7dfSBarry Smith PetscOptionsGetString(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool(), 1456e5c89e4eSSatish Balay PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 1457e5c89e4eSSatish Balay PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 1458acfcf0e5SJed Brown PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 1459a264d7a6SBarry Smith PetscOptionsFList(), PetscOptionsEList() 1460e5c89e4eSSatish Balay @*/ 1461c5929fdfSBarry Smith PetscErrorCode PetscOptionsHasName(PetscOptions options,const char pre[],const char name[],PetscBool *set) 1462e5c89e4eSSatish Balay { 14632d747510SLisandro Dalcin const char *value; 1464e5c89e4eSSatish Balay PetscErrorCode ierr; 1465ace3abfcSBarry Smith PetscBool flag; 1466e5c89e4eSSatish Balay 1467e5c89e4eSSatish Balay PetscFunctionBegin; 14682d747510SLisandro Dalcin ierr = PetscOptionsFindPair(options,pre,name,&value,&flag);CHKERRQ(ierr); 146996ef3cdfSSatish Balay if (set) *set = flag; 1470e5c89e4eSSatish Balay PetscFunctionReturn(0); 1471e5c89e4eSSatish Balay } 1472e5c89e4eSSatish Balay 1473e5c89e4eSSatish Balay /*@C 14742d747510SLisandro Dalcin PetscOptionsGetAll - Lists all the options the program was run with in a single string. 14752d747510SLisandro Dalcin 14762d747510SLisandro Dalcin Not Collective 14772d747510SLisandro Dalcin 1478fd292e60Sprj- Input Parameter: 14792d747510SLisandro Dalcin . options - the options database, use NULL for the default global database 14802d747510SLisandro Dalcin 14812d747510SLisandro Dalcin Output Parameter: 14822d747510SLisandro Dalcin . copts - pointer where string pointer is stored 14832d747510SLisandro Dalcin 14842d747510SLisandro Dalcin Notes: 14851c9f3c13SBarry Smith The array and each entry in the array should be freed with PetscFree() 14861c9f3c13SBarry Smith Each process may have different values depending on how the options were inserted into the database 14872d747510SLisandro Dalcin 14882d747510SLisandro Dalcin Level: advanced 14892d747510SLisandro Dalcin 14901c9f3c13SBarry Smith .seealso: PetscOptionsAllUsed(), PetscOptionsView(), PetscOptionsPush(), PetscOptionsPop() 14912d747510SLisandro Dalcin @*/ 14922d747510SLisandro Dalcin PetscErrorCode PetscOptionsGetAll(PetscOptions options,char *copts[]) 14932d747510SLisandro Dalcin { 14942d747510SLisandro Dalcin PetscErrorCode ierr; 14952d747510SLisandro Dalcin PetscInt i; 14962d747510SLisandro Dalcin size_t len = 1,lent = 0; 14972d747510SLisandro Dalcin char *coptions = NULL; 14982d747510SLisandro Dalcin 14992d747510SLisandro Dalcin PetscFunctionBegin; 15002d747510SLisandro Dalcin PetscValidPointer(copts,2); 15012d747510SLisandro Dalcin options = options ? options : defaultoptions; 15022d747510SLisandro Dalcin /* count the length of the required string */ 15032d747510SLisandro Dalcin for (i=0; i<options->N; i++) { 15042d747510SLisandro Dalcin ierr = PetscStrlen(options->names[i],&lent);CHKERRQ(ierr); 15052d747510SLisandro Dalcin len += 2 + lent; 15062d747510SLisandro Dalcin if (options->values[i]) { 15072d747510SLisandro Dalcin ierr = PetscStrlen(options->values[i],&lent);CHKERRQ(ierr); 15082d747510SLisandro Dalcin len += 1 + lent; 15092d747510SLisandro Dalcin } 15102d747510SLisandro Dalcin } 15112d747510SLisandro Dalcin ierr = PetscMalloc1(len,&coptions);CHKERRQ(ierr); 15122d747510SLisandro Dalcin coptions[0] = 0; 15132d747510SLisandro Dalcin for (i=0; i<options->N; i++) { 15142d747510SLisandro Dalcin ierr = PetscStrcat(coptions,"-");CHKERRQ(ierr); 15152d747510SLisandro Dalcin ierr = PetscStrcat(coptions,options->names[i]);CHKERRQ(ierr); 15162d747510SLisandro Dalcin ierr = PetscStrcat(coptions," ");CHKERRQ(ierr); 15172d747510SLisandro Dalcin if (options->values[i]) { 15182d747510SLisandro Dalcin ierr = PetscStrcat(coptions,options->values[i]);CHKERRQ(ierr); 15192d747510SLisandro Dalcin ierr = PetscStrcat(coptions," ");CHKERRQ(ierr); 15202d747510SLisandro Dalcin } 15212d747510SLisandro Dalcin } 15222d747510SLisandro Dalcin *copts = coptions; 15232d747510SLisandro Dalcin PetscFunctionReturn(0); 15242d747510SLisandro Dalcin } 15252d747510SLisandro Dalcin 15262d747510SLisandro Dalcin /*@C 15272d747510SLisandro Dalcin PetscOptionsUsed - Indicates if PETSc has used a particular option set in the database 15282d747510SLisandro Dalcin 15292d747510SLisandro Dalcin Not Collective 15302d747510SLisandro Dalcin 15312d747510SLisandro Dalcin Input Parameter: 15322d747510SLisandro Dalcin + options - options database, use NULL for default global database 15332d747510SLisandro Dalcin - name - string name of option 15342d747510SLisandro Dalcin 15352d747510SLisandro Dalcin Output Parameter: 15362d747510SLisandro Dalcin . used - PETSC_TRUE if the option was used, otherwise false, including if option was not found in options database 15372d747510SLisandro Dalcin 15382d747510SLisandro Dalcin Level: advanced 15392d747510SLisandro Dalcin 15409666a313SBarry Smith Notes: 15419666a313SBarry Smith The value returned may be different on each process and depends on which options have been processed 15421c9f3c13SBarry Smith on the given process 15431c9f3c13SBarry Smith 15442d747510SLisandro Dalcin .seealso: PetscOptionsView(), PetscOptionsLeft(), PetscOptionsAllUsed() 15452d747510SLisandro Dalcin @*/ 15462d747510SLisandro Dalcin PetscErrorCode PetscOptionsUsed(PetscOptions options,const char *name,PetscBool *used) 15472d747510SLisandro Dalcin { 15482d747510SLisandro Dalcin PetscInt i; 15492d747510SLisandro Dalcin PetscErrorCode ierr; 15502d747510SLisandro Dalcin 15512d747510SLisandro Dalcin PetscFunctionBegin; 15522d747510SLisandro Dalcin PetscValidCharPointer(name,2); 15532d747510SLisandro Dalcin PetscValidPointer(used,3); 15542d747510SLisandro Dalcin options = options ? options : defaultoptions; 15552d747510SLisandro Dalcin *used = PETSC_FALSE; 15562d747510SLisandro Dalcin for (i=0; i<options->N; i++) { 15572d747510SLisandro Dalcin ierr = PetscStrcmp(options->names[i],name,used);CHKERRQ(ierr); 15582d747510SLisandro Dalcin if (*used) { 15592d747510SLisandro Dalcin *used = options->used[i]; 15602d747510SLisandro Dalcin break; 15612d747510SLisandro Dalcin } 15622d747510SLisandro Dalcin } 15632d747510SLisandro Dalcin PetscFunctionReturn(0); 15642d747510SLisandro Dalcin } 15652d747510SLisandro Dalcin 1566487a658cSBarry Smith /*@ 15672d747510SLisandro Dalcin PetscOptionsAllUsed - Returns a count of the number of options in the 15682d747510SLisandro Dalcin database that have never been selected. 15692d747510SLisandro Dalcin 15702d747510SLisandro Dalcin Not Collective 15712d747510SLisandro Dalcin 15722d747510SLisandro Dalcin Input Parameter: 15732d747510SLisandro Dalcin . options - options database, use NULL for default global database 15742d747510SLisandro Dalcin 15752d747510SLisandro Dalcin Output Parameter: 15762d747510SLisandro Dalcin . N - count of options not used 15772d747510SLisandro Dalcin 15782d747510SLisandro Dalcin Level: advanced 15792d747510SLisandro Dalcin 15809666a313SBarry Smith Notes: 15819666a313SBarry Smith The value returned may be different on each process and depends on which options have been processed 15821c9f3c13SBarry Smith on the given process 15831c9f3c13SBarry Smith 15842d747510SLisandro Dalcin .seealso: PetscOptionsView() 15852d747510SLisandro Dalcin @*/ 15862d747510SLisandro Dalcin PetscErrorCode PetscOptionsAllUsed(PetscOptions options,PetscInt *N) 15872d747510SLisandro Dalcin { 15882d747510SLisandro Dalcin PetscInt i,n = 0; 15892d747510SLisandro Dalcin 15902d747510SLisandro Dalcin PetscFunctionBegin; 15912d747510SLisandro Dalcin PetscValidIntPointer(N,2); 15922d747510SLisandro Dalcin options = options ? options : defaultoptions; 15932d747510SLisandro Dalcin for (i=0; i<options->N; i++) { 15942d747510SLisandro Dalcin if (!options->used[i]) n++; 15952d747510SLisandro Dalcin } 15962d747510SLisandro Dalcin *N = n; 15972d747510SLisandro Dalcin PetscFunctionReturn(0); 15982d747510SLisandro Dalcin } 15992d747510SLisandro Dalcin 1600487a658cSBarry Smith /*@ 16012d747510SLisandro Dalcin PetscOptionsLeft - Prints to screen any options that were set and never used. 16022d747510SLisandro Dalcin 16032d747510SLisandro Dalcin Not Collective 16042d747510SLisandro Dalcin 16052d747510SLisandro Dalcin Input Parameter: 16062d747510SLisandro Dalcin . options - options database; use NULL for default global database 16072d747510SLisandro Dalcin 16082d747510SLisandro Dalcin Options Database Key: 16093c6db4c4SPierre Jolivet . -options_left - activates PetscOptionsAllUsed() within PetscFinalize() 16102d747510SLisandro Dalcin 16113de2bfdfSBarry Smith Notes: 16123de2bfdfSBarry Smith This is rarely used directly, it is called by PetscFinalize() in debug more or if -options_left 16131c9f3c13SBarry Smith is passed otherwise to help users determine possible mistakes in their usage of options. This 16141c9f3c13SBarry Smith only prints values on process zero of PETSC_COMM_WORLD. Other processes depending the objects 16151c9f3c13SBarry Smith used may have different options that are left unused. 16163de2bfdfSBarry Smith 16172d747510SLisandro Dalcin Level: advanced 16182d747510SLisandro Dalcin 16192d747510SLisandro Dalcin .seealso: PetscOptionsAllUsed() 16202d747510SLisandro Dalcin @*/ 16212d747510SLisandro Dalcin PetscErrorCode PetscOptionsLeft(PetscOptions options) 16222d747510SLisandro Dalcin { 16232d747510SLisandro Dalcin PetscErrorCode ierr; 16242d747510SLisandro Dalcin PetscInt i; 16253de2bfdfSBarry Smith PetscInt cnt = 0; 16263de2bfdfSBarry Smith PetscOptions toptions; 16272d747510SLisandro Dalcin 16282d747510SLisandro Dalcin PetscFunctionBegin; 16293de2bfdfSBarry Smith toptions = options ? options : defaultoptions; 16303de2bfdfSBarry Smith for (i=0; i<toptions->N; i++) { 16313de2bfdfSBarry Smith if (!toptions->used[i]) { 16323de2bfdfSBarry Smith if (toptions->values[i]) { 16333de2bfdfSBarry Smith ierr = PetscPrintf(PETSC_COMM_WORLD,"Option left: name:-%s value: %s\n",toptions->names[i],toptions->values[i]);CHKERRQ(ierr); 16342d747510SLisandro Dalcin } else { 16353de2bfdfSBarry Smith ierr = PetscPrintf(PETSC_COMM_WORLD,"Option left: name:-%s (no value)\n",toptions->names[i]);CHKERRQ(ierr); 16362d747510SLisandro Dalcin } 16372d747510SLisandro Dalcin } 16382d747510SLisandro Dalcin } 16393de2bfdfSBarry Smith if (!options) { 16403de2bfdfSBarry Smith toptions = defaultoptions; 16413de2bfdfSBarry Smith while (toptions->previous) { 16423de2bfdfSBarry Smith cnt++; 16433de2bfdfSBarry Smith toptions = toptions->previous; 16443de2bfdfSBarry Smith } 16453de2bfdfSBarry Smith if (cnt) { 16463de2bfdfSBarry 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); 16473de2bfdfSBarry Smith } 16483de2bfdfSBarry Smith } 16492d747510SLisandro Dalcin PetscFunctionReturn(0); 16502d747510SLisandro Dalcin } 16512d747510SLisandro Dalcin 16522d747510SLisandro Dalcin /*@C 16532d747510SLisandro Dalcin PetscOptionsLeftGet - Returns all options that were set and never used. 16542d747510SLisandro Dalcin 16552d747510SLisandro Dalcin Not Collective 16562d747510SLisandro Dalcin 16572d747510SLisandro Dalcin Input Parameter: 16582d747510SLisandro Dalcin . options - options database, use NULL for default global database 16592d747510SLisandro Dalcin 16602d747510SLisandro Dalcin Output Parameter: 1661a2b725a8SWilliam Gropp + N - count of options not used 16622d747510SLisandro Dalcin . names - names of options not used 1663a2b725a8SWilliam Gropp - values - values of options not used 16642d747510SLisandro Dalcin 16652d747510SLisandro Dalcin Level: advanced 16662d747510SLisandro Dalcin 16672d747510SLisandro Dalcin Notes: 16682d747510SLisandro Dalcin Users should call PetscOptionsLeftRestore() to free the memory allocated in this routine 16691c9f3c13SBarry Smith Notes: The value returned may be different on each process and depends on which options have been processed 16701c9f3c13SBarry Smith on the given process 16712d747510SLisandro Dalcin 16722d747510SLisandro Dalcin .seealso: PetscOptionsAllUsed(), PetscOptionsLeft() 16732d747510SLisandro Dalcin @*/ 16742d747510SLisandro Dalcin PetscErrorCode PetscOptionsLeftGet(PetscOptions options,PetscInt *N,char **names[],char **values[]) 16752d747510SLisandro Dalcin { 16762d747510SLisandro Dalcin PetscErrorCode ierr; 16772d747510SLisandro Dalcin PetscInt i,n; 16782d747510SLisandro Dalcin 16792d747510SLisandro Dalcin PetscFunctionBegin; 16802d747510SLisandro Dalcin if (N) PetscValidIntPointer(N,2); 16812d747510SLisandro Dalcin if (names) PetscValidPointer(names,3); 16822d747510SLisandro Dalcin if (values) PetscValidPointer(values,4); 16832d747510SLisandro Dalcin options = options ? options : defaultoptions; 16842d747510SLisandro Dalcin 16852d747510SLisandro Dalcin /* The number of unused PETSc options */ 16862d747510SLisandro Dalcin n = 0; 16872d747510SLisandro Dalcin for (i=0; i<options->N; i++) { 16882d747510SLisandro Dalcin if (!options->used[i]) n++; 16892d747510SLisandro Dalcin } 16902d747510SLisandro Dalcin if (N) { *N = n; } 16912d747510SLisandro Dalcin if (names) { ierr = PetscMalloc1(n,names);CHKERRQ(ierr); } 16922d747510SLisandro Dalcin if (values) { ierr = PetscMalloc1(n,values);CHKERRQ(ierr); } 16932d747510SLisandro Dalcin 16942d747510SLisandro Dalcin n = 0; 16952d747510SLisandro Dalcin if (names || values) { 16962d747510SLisandro Dalcin for (i=0; i<options->N; i++) { 16972d747510SLisandro Dalcin if (!options->used[i]) { 16982d747510SLisandro Dalcin if (names) (*names)[n] = options->names[i]; 16992d747510SLisandro Dalcin if (values) (*values)[n] = options->values[i]; 17002d747510SLisandro Dalcin n++; 17012d747510SLisandro Dalcin } 17022d747510SLisandro Dalcin } 17032d747510SLisandro Dalcin } 17042d747510SLisandro Dalcin PetscFunctionReturn(0); 17052d747510SLisandro Dalcin } 17062d747510SLisandro Dalcin 17072d747510SLisandro Dalcin /*@C 17082d747510SLisandro Dalcin PetscOptionsLeftRestore - Free memory for the unused PETSc options obtained using PetscOptionsLeftGet. 17092d747510SLisandro Dalcin 17102d747510SLisandro Dalcin Not Collective 17112d747510SLisandro Dalcin 17122d747510SLisandro Dalcin Input Parameter: 1713a2b725a8SWilliam Gropp + options - options database, use NULL for default global database 17142d747510SLisandro Dalcin . names - names of options not used 1715a2b725a8SWilliam Gropp - values - values of options not used 17162d747510SLisandro Dalcin 17172d747510SLisandro Dalcin Level: advanced 17182d747510SLisandro Dalcin 17192d747510SLisandro Dalcin .seealso: PetscOptionsAllUsed(), PetscOptionsLeft(), PetscOptionsLeftGet() 17202d747510SLisandro Dalcin @*/ 17212d747510SLisandro Dalcin PetscErrorCode PetscOptionsLeftRestore(PetscOptions options,PetscInt *N,char **names[],char **values[]) 17222d747510SLisandro Dalcin { 17232d747510SLisandro Dalcin PetscErrorCode ierr; 17242d747510SLisandro Dalcin 17252d747510SLisandro Dalcin PetscFunctionBegin; 17262d747510SLisandro Dalcin if (N) PetscValidIntPointer(N,2); 17272d747510SLisandro Dalcin if (names) PetscValidPointer(names,3); 17282d747510SLisandro Dalcin if (values) PetscValidPointer(values,4); 17292d747510SLisandro Dalcin if (N) { *N = 0; } 17302d747510SLisandro Dalcin if (names) { ierr = PetscFree(*names);CHKERRQ(ierr); } 17312d747510SLisandro Dalcin if (values) { ierr = PetscFree(*values);CHKERRQ(ierr); } 17322d747510SLisandro Dalcin PetscFunctionReturn(0); 17332d747510SLisandro Dalcin } 17342d747510SLisandro Dalcin 17352d747510SLisandro Dalcin /*@C 17362d747510SLisandro Dalcin PetscOptionsSetFromOptions - Sets options related to the handling of options in PETSc 17372d747510SLisandro Dalcin 17382d747510SLisandro Dalcin Collective on PETSC_COMM_WORLD 17392d747510SLisandro Dalcin 17402d747510SLisandro Dalcin Input Parameter: 17412d747510SLisandro Dalcin . options - options database, use NULL for default global database 17422d747510SLisandro Dalcin 17432d747510SLisandro Dalcin Options Database Keys: 17442d747510SLisandro Dalcin + -options_monitor <optional filename> - prints the names and values of all runtime options as they are set. The monitor functionality is not 17452d747510SLisandro Dalcin available for options set through a file, environment variable, or on 17462d747510SLisandro Dalcin the command line. Only options set after PetscInitialize() completes will 17472d747510SLisandro Dalcin be monitored. 1748a2b725a8SWilliam Gropp - -options_monitor_cancel - cancel all options database monitors 17492d747510SLisandro Dalcin 17502d747510SLisandro Dalcin Notes: 17511c9f3c13SBarry Smith To see all options, run your program with the -help option 17522d747510SLisandro Dalcin 17532d747510SLisandro Dalcin Level: intermediate 17542d747510SLisandro Dalcin 17552d747510SLisandro Dalcin @*/ 17562d747510SLisandro Dalcin PetscErrorCode PetscOptionsSetFromOptions(PetscOptions options) 17572d747510SLisandro Dalcin { 17582d747510SLisandro Dalcin PetscBool flgc = PETSC_FALSE,flgm; 17592d747510SLisandro Dalcin PetscErrorCode ierr; 17602d747510SLisandro Dalcin char monfilename[PETSC_MAX_PATH_LEN]; 17612d747510SLisandro Dalcin PetscViewer monviewer; 17622d747510SLisandro Dalcin 17632d747510SLisandro Dalcin PetscFunctionBegin; 17642d747510SLisandro Dalcin /* 17652d747510SLisandro Dalcin The options argument is currently ignored since we currently maintain only a single options database 17662d747510SLisandro Dalcin 17672d747510SLisandro Dalcin options = options ? options : defaultoptions; 17682d747510SLisandro Dalcin */ 17692d747510SLisandro Dalcin ierr = PetscOptionsBegin(PETSC_COMM_WORLD,NULL,"Options for handling options","PetscOptions");CHKERRQ(ierr); 17702d747510SLisandro Dalcin ierr = PetscOptionsString("-options_monitor","Monitor options database","PetscOptionsMonitorSet","stdout",monfilename,PETSC_MAX_PATH_LEN,&flgm);CHKERRQ(ierr); 17712d747510SLisandro Dalcin ierr = PetscOptionsBool("-options_monitor_cancel","Cancel all options database monitors","PetscOptionsMonitorCancel",flgc,&flgc,NULL);CHKERRQ(ierr); 17722d747510SLisandro Dalcin ierr = PetscOptionsEnd();CHKERRQ(ierr); 17732d747510SLisandro Dalcin if (flgm) { 17742d747510SLisandro Dalcin ierr = PetscViewerASCIIOpen(PETSC_COMM_WORLD,monfilename,&monviewer);CHKERRQ(ierr); 17752d747510SLisandro Dalcin ierr = PetscOptionsMonitorSet(PetscOptionsMonitorDefault,monviewer,(PetscErrorCode (*)(void**))PetscViewerDestroy);CHKERRQ(ierr); 17762d747510SLisandro Dalcin } 17772d747510SLisandro Dalcin if (flgc) { ierr = PetscOptionsMonitorCancel();CHKERRQ(ierr); } 17782d747510SLisandro Dalcin PetscFunctionReturn(0); 17792d747510SLisandro Dalcin } 17802d747510SLisandro Dalcin 17812d747510SLisandro Dalcin /*@C 17822d747510SLisandro Dalcin PetscOptionsMonitorDefault - Print all options set value events. 17832d747510SLisandro Dalcin 17841c9f3c13SBarry Smith Logically Collective on ctx 17852d747510SLisandro Dalcin 17862d747510SLisandro Dalcin Input Parameters: 17872d747510SLisandro Dalcin + name - option name string 17882d747510SLisandro Dalcin . value - option value string 17892d747510SLisandro Dalcin - ctx - an ASCII viewer 17902d747510SLisandro Dalcin 17912d747510SLisandro Dalcin Level: intermediate 17922d747510SLisandro Dalcin 17939666a313SBarry Smith Notes: 17949666a313SBarry Smith The first MPI rank in the PetscViewer viewer actually prints the values, other 17951c9f3c13SBarry Smith processes may have different values set 17961c9f3c13SBarry Smith 17972d747510SLisandro Dalcin .seealso: PetscOptionsMonitorSet() 17982d747510SLisandro Dalcin @*/ 17992d747510SLisandro Dalcin PetscErrorCode PetscOptionsMonitorDefault(const char name[],const char value[],void *ctx) 18002d747510SLisandro Dalcin { 18012d747510SLisandro Dalcin PetscErrorCode ierr; 18022d747510SLisandro Dalcin PetscViewer viewer = (PetscViewer)ctx; 18032d747510SLisandro Dalcin 18042d747510SLisandro Dalcin PetscFunctionBegin; 18052d747510SLisandro Dalcin if (!value) { 18062d747510SLisandro Dalcin ierr = PetscViewerASCIIPrintf(viewer,"Removing option: %s\n",name,value);CHKERRQ(ierr); 18072d747510SLisandro Dalcin } else if (!value[0]) { 18082d747510SLisandro Dalcin ierr = PetscViewerASCIIPrintf(viewer,"Setting option: %s (no value)\n",name);CHKERRQ(ierr); 18092d747510SLisandro Dalcin } else { 18102d747510SLisandro Dalcin ierr = PetscViewerASCIIPrintf(viewer,"Setting option: %s = %s\n",name,value);CHKERRQ(ierr); 18112d747510SLisandro Dalcin } 18122d747510SLisandro Dalcin PetscFunctionReturn(0); 18132d747510SLisandro Dalcin } 18142d747510SLisandro Dalcin 18152d747510SLisandro Dalcin /*@C 18162d747510SLisandro Dalcin PetscOptionsMonitorSet - Sets an ADDITIONAL function to be called at every method that 18172d747510SLisandro Dalcin modified the PETSc options database. 18182d747510SLisandro Dalcin 18192d747510SLisandro Dalcin Not Collective 18202d747510SLisandro Dalcin 18212d747510SLisandro Dalcin Input Parameters: 18222d747510SLisandro Dalcin + monitor - pointer to function (if this is NULL, it turns off monitoring 18232d747510SLisandro Dalcin . mctx - [optional] context for private data for the 18242d747510SLisandro Dalcin monitor routine (use NULL if no context is desired) 18252d747510SLisandro Dalcin - monitordestroy - [optional] routine that frees monitor context 18262d747510SLisandro Dalcin (may be NULL) 18272d747510SLisandro Dalcin 18282d747510SLisandro Dalcin Calling Sequence of monitor: 18292d747510SLisandro Dalcin $ monitor (const char name[], const char value[], void *mctx) 18302d747510SLisandro Dalcin 18312d747510SLisandro Dalcin + name - option name string 18322d747510SLisandro Dalcin . value - option value string 18332d747510SLisandro Dalcin - mctx - optional monitoring context, as set by PetscOptionsMonitorSet() 18342d747510SLisandro Dalcin 18352d747510SLisandro Dalcin Options Database Keys: 18362d747510SLisandro Dalcin + -options_monitor - sets PetscOptionsMonitorDefault() 18372d747510SLisandro Dalcin - -options_monitor_cancel - cancels all monitors that have 18382d747510SLisandro Dalcin been hardwired into a code by 18392d747510SLisandro Dalcin calls to PetscOptionsMonitorSet(), but 18402d747510SLisandro Dalcin does not cancel those set via 18412d747510SLisandro Dalcin the options database. 18422d747510SLisandro Dalcin 18432d747510SLisandro Dalcin Notes: 18442d747510SLisandro Dalcin The default is to do nothing. To print the name and value of options 18452d747510SLisandro Dalcin being inserted into the database, use PetscOptionsMonitorDefault() as the monitoring routine, 18462d747510SLisandro Dalcin with a null monitoring context. 18472d747510SLisandro Dalcin 18482d747510SLisandro Dalcin Several different monitoring routines may be set by calling 18492d747510SLisandro Dalcin PetscOptionsMonitorSet() multiple times; all will be called in the 18502d747510SLisandro Dalcin order in which they were set. 18512d747510SLisandro Dalcin 18522d747510SLisandro Dalcin Level: beginner 18532d747510SLisandro Dalcin 18542d747510SLisandro Dalcin .seealso: PetscOptionsMonitorDefault(), PetscOptionsMonitorCancel() 18552d747510SLisandro Dalcin @*/ 18562d747510SLisandro Dalcin PetscErrorCode PetscOptionsMonitorSet(PetscErrorCode (*monitor)(const char name[], const char value[], void*),void *mctx,PetscErrorCode (*monitordestroy)(void**)) 18572d747510SLisandro Dalcin { 18582d747510SLisandro Dalcin PetscOptions options = defaultoptions; 18592d747510SLisandro Dalcin 18602d747510SLisandro Dalcin PetscFunctionBegin; 18612d747510SLisandro Dalcin if (options->numbermonitors >= MAXOPTIONSMONITORS) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Too many PetscOptions monitors set"); 18622d747510SLisandro Dalcin options->monitor[options->numbermonitors] = monitor; 18632d747510SLisandro Dalcin options->monitordestroy[options->numbermonitors] = monitordestroy; 18642d747510SLisandro Dalcin options->monitorcontext[options->numbermonitors++] = (void*)mctx; 18652d747510SLisandro Dalcin PetscFunctionReturn(0); 18662d747510SLisandro Dalcin } 18672d747510SLisandro Dalcin 18682d747510SLisandro Dalcin /*@ 18692d747510SLisandro Dalcin PetscOptionsMonitorCancel - Clears all monitors for a PetscOptions object. 18702d747510SLisandro Dalcin 18712d747510SLisandro Dalcin Not Collective 18722d747510SLisandro Dalcin 18732d747510SLisandro Dalcin Options Database Key: 18742d747510SLisandro Dalcin . -options_monitor_cancel - Cancels all monitors that have 18752d747510SLisandro Dalcin been hardwired into a code by calls to PetscOptionsMonitorSet(), 18762d747510SLisandro Dalcin but does not cancel those set via the options database. 18772d747510SLisandro Dalcin 18782d747510SLisandro Dalcin Level: intermediate 18792d747510SLisandro Dalcin 18802d747510SLisandro Dalcin .seealso: PetscOptionsMonitorDefault(), PetscOptionsMonitorSet() 18812d747510SLisandro Dalcin @*/ 18822d747510SLisandro Dalcin PetscErrorCode PetscOptionsMonitorCancel(void) 18832d747510SLisandro Dalcin { 18842d747510SLisandro Dalcin PetscErrorCode ierr; 18852d747510SLisandro Dalcin PetscInt i; 18862d747510SLisandro Dalcin PetscOptions options = defaultoptions; 18872d747510SLisandro Dalcin 18882d747510SLisandro Dalcin PetscFunctionBegin; 18892d747510SLisandro Dalcin for (i=0; i<options->numbermonitors; i++) { 18902d747510SLisandro Dalcin if (options->monitordestroy[i]) { 18912d747510SLisandro Dalcin ierr = (*options->monitordestroy[i])(&options->monitorcontext[i]);CHKERRQ(ierr); 18922d747510SLisandro Dalcin } 18932d747510SLisandro Dalcin } 18942d747510SLisandro Dalcin options->numbermonitors = 0; 18952d747510SLisandro Dalcin PetscFunctionReturn(0); 18962d747510SLisandro Dalcin } 18972d747510SLisandro Dalcin 18982d747510SLisandro Dalcin /* 18992d747510SLisandro Dalcin PetscOptionsStringToBool - Converts string to PetscBool , handles cases like "yes", "no", "true", "false", "0", "1", "off", "on". 19002d747510SLisandro Dalcin */ 19012d747510SLisandro Dalcin PetscErrorCode PetscOptionsStringToBool(const char value[],PetscBool *a) 19022d747510SLisandro Dalcin { 19032d747510SLisandro Dalcin PetscBool istrue,isfalse; 19042d747510SLisandro Dalcin size_t len; 19052d747510SLisandro Dalcin PetscErrorCode ierr; 19062d747510SLisandro Dalcin 19072d747510SLisandro Dalcin PetscFunctionBegin; 19082d747510SLisandro Dalcin ierr = PetscStrlen(value,&len);CHKERRQ(ierr); 19092d747510SLisandro Dalcin if (!len) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Character string of length zero has no logical value"); 19102d747510SLisandro Dalcin ierr = PetscStrcasecmp(value,"TRUE",&istrue);CHKERRQ(ierr); 19112d747510SLisandro Dalcin if (istrue) {*a = PETSC_TRUE; PetscFunctionReturn(0);} 19122d747510SLisandro Dalcin ierr = PetscStrcasecmp(value,"YES",&istrue);CHKERRQ(ierr); 19132d747510SLisandro Dalcin if (istrue) {*a = PETSC_TRUE; PetscFunctionReturn(0);} 19142d747510SLisandro Dalcin ierr = PetscStrcasecmp(value,"1",&istrue);CHKERRQ(ierr); 19152d747510SLisandro Dalcin if (istrue) {*a = PETSC_TRUE; PetscFunctionReturn(0);} 19162d747510SLisandro Dalcin ierr = PetscStrcasecmp(value,"on",&istrue);CHKERRQ(ierr); 19172d747510SLisandro Dalcin if (istrue) {*a = PETSC_TRUE; PetscFunctionReturn(0);} 19182d747510SLisandro Dalcin ierr = PetscStrcasecmp(value,"FALSE",&isfalse);CHKERRQ(ierr); 19192d747510SLisandro Dalcin if (isfalse) {*a = PETSC_FALSE; PetscFunctionReturn(0);} 19202d747510SLisandro Dalcin ierr = PetscStrcasecmp(value,"NO",&isfalse);CHKERRQ(ierr); 19212d747510SLisandro Dalcin if (isfalse) {*a = PETSC_FALSE; PetscFunctionReturn(0);} 19222d747510SLisandro Dalcin ierr = PetscStrcasecmp(value,"0",&isfalse);CHKERRQ(ierr); 19232d747510SLisandro Dalcin if (isfalse) {*a = PETSC_FALSE; PetscFunctionReturn(0);} 19242d747510SLisandro Dalcin ierr = PetscStrcasecmp(value,"off",&isfalse);CHKERRQ(ierr); 19252d747510SLisandro Dalcin if (isfalse) {*a = PETSC_FALSE; PetscFunctionReturn(0);} 19262d747510SLisandro Dalcin SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Unknown logical value: %s",value); 19272d747510SLisandro Dalcin } 19282d747510SLisandro Dalcin 19292d747510SLisandro Dalcin /* 19302d747510SLisandro Dalcin PetscOptionsStringToInt - Converts a string to an integer value. Handles special cases such as "default" and "decide" 19312d747510SLisandro Dalcin */ 19322d747510SLisandro Dalcin PetscErrorCode PetscOptionsStringToInt(const char name[],PetscInt *a) 19332d747510SLisandro Dalcin { 19342d747510SLisandro Dalcin PetscErrorCode ierr; 19352d747510SLisandro Dalcin size_t len; 19362d747510SLisandro Dalcin PetscBool decide,tdefault,mouse; 19372d747510SLisandro Dalcin 19382d747510SLisandro Dalcin PetscFunctionBegin; 19392d747510SLisandro Dalcin ierr = PetscStrlen(name,&len);CHKERRQ(ierr); 19402d747510SLisandro Dalcin if (!len) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"character string of length zero has no numerical value"); 19412d747510SLisandro Dalcin 19422d747510SLisandro Dalcin ierr = PetscStrcasecmp(name,"PETSC_DEFAULT",&tdefault);CHKERRQ(ierr); 19432d747510SLisandro Dalcin if (!tdefault) { 19442d747510SLisandro Dalcin ierr = PetscStrcasecmp(name,"DEFAULT",&tdefault);CHKERRQ(ierr); 19452d747510SLisandro Dalcin } 19462d747510SLisandro Dalcin ierr = PetscStrcasecmp(name,"PETSC_DECIDE",&decide);CHKERRQ(ierr); 19472d747510SLisandro Dalcin if (!decide) { 19482d747510SLisandro Dalcin ierr = PetscStrcasecmp(name,"DECIDE",&decide);CHKERRQ(ierr); 19492d747510SLisandro Dalcin } 19502d747510SLisandro Dalcin ierr = PetscStrcasecmp(name,"mouse",&mouse);CHKERRQ(ierr); 19512d747510SLisandro Dalcin 19522d747510SLisandro Dalcin if (tdefault) *a = PETSC_DEFAULT; 19532d747510SLisandro Dalcin else if (decide) *a = PETSC_DECIDE; 19542d747510SLisandro Dalcin else if (mouse) *a = -1; 19552d747510SLisandro Dalcin else { 19562d747510SLisandro Dalcin char *endptr; 19572d747510SLisandro Dalcin long strtolval; 19582d747510SLisandro Dalcin 19592d747510SLisandro Dalcin strtolval = strtol(name,&endptr,10); 19602d747510SLisandro 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); 19612d747510SLisandro Dalcin 19622d747510SLisandro Dalcin #if defined(PETSC_USE_64BIT_INDICES) && defined(PETSC_HAVE_ATOLL) 19632d747510SLisandro Dalcin (void) strtolval; 19642d747510SLisandro Dalcin *a = atoll(name); 19652d747510SLisandro Dalcin #elif defined(PETSC_USE_64BIT_INDICES) && defined(PETSC_HAVE___INT64) 19662d747510SLisandro Dalcin (void) strtolval; 19672d747510SLisandro Dalcin *a = _atoi64(name); 19682d747510SLisandro Dalcin #else 19692d747510SLisandro Dalcin *a = (PetscInt)strtolval; 19702d747510SLisandro Dalcin #endif 19712d747510SLisandro Dalcin } 19722d747510SLisandro Dalcin PetscFunctionReturn(0); 19732d747510SLisandro Dalcin } 19742d747510SLisandro Dalcin 19752d747510SLisandro Dalcin #if defined(PETSC_USE_REAL___FLOAT128) 19762d747510SLisandro Dalcin #include <quadmath.h> 19772d747510SLisandro Dalcin #endif 19782d747510SLisandro Dalcin 19792d747510SLisandro Dalcin static PetscErrorCode PetscStrtod(const char name[],PetscReal *a,char **endptr) 19802d747510SLisandro Dalcin { 19812d747510SLisandro Dalcin PetscFunctionBegin; 19822d747510SLisandro Dalcin #if defined(PETSC_USE_REAL___FLOAT128) 19832d747510SLisandro Dalcin *a = strtoflt128(name,endptr); 19842d747510SLisandro Dalcin #else 19852d747510SLisandro Dalcin *a = (PetscReal)strtod(name,endptr); 19862d747510SLisandro Dalcin #endif 19872d747510SLisandro Dalcin PetscFunctionReturn(0); 19882d747510SLisandro Dalcin } 19892d747510SLisandro Dalcin 19902d747510SLisandro Dalcin static PetscErrorCode PetscStrtoz(const char name[],PetscScalar *a,char **endptr,PetscBool *isImaginary) 19912d747510SLisandro Dalcin { 19922d747510SLisandro Dalcin PetscBool hasi = PETSC_FALSE; 19932d747510SLisandro Dalcin char *ptr; 19942d747510SLisandro Dalcin PetscReal strtoval; 19952d747510SLisandro Dalcin PetscErrorCode ierr; 19962d747510SLisandro Dalcin 19972d747510SLisandro Dalcin PetscFunctionBegin; 19982d747510SLisandro Dalcin ierr = PetscStrtod(name,&strtoval,&ptr);CHKERRQ(ierr); 19992d747510SLisandro Dalcin if (ptr == name) { 20002d747510SLisandro Dalcin strtoval = 1.; 20012d747510SLisandro Dalcin hasi = PETSC_TRUE; 20022d747510SLisandro Dalcin if (name[0] == 'i') { 20032d747510SLisandro Dalcin ptr++; 20042d747510SLisandro Dalcin } else if (name[0] == '+' && name[1] == 'i') { 20052d747510SLisandro Dalcin ptr += 2; 20062d747510SLisandro Dalcin } else if (name[0] == '-' && name[1] == 'i') { 20072d747510SLisandro Dalcin strtoval = -1.; 20082d747510SLisandro Dalcin ptr += 2; 20092d747510SLisandro Dalcin } 20102d747510SLisandro Dalcin } else if (*ptr == 'i') { 20112d747510SLisandro Dalcin hasi = PETSC_TRUE; 20122d747510SLisandro Dalcin ptr++; 20132d747510SLisandro Dalcin } 20142d747510SLisandro Dalcin *endptr = ptr; 20152d747510SLisandro Dalcin *isImaginary = hasi; 20162d747510SLisandro Dalcin if (hasi) { 20172d747510SLisandro Dalcin #if !defined(PETSC_USE_COMPLEX) 20182d747510SLisandro Dalcin SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Input string %s contains imaginary but complex not supported ",name); 20192d747510SLisandro Dalcin #else 20202d747510SLisandro Dalcin *a = PetscCMPLX(0.,strtoval); 20212d747510SLisandro Dalcin #endif 20222d747510SLisandro Dalcin } else { 20232d747510SLisandro Dalcin *a = strtoval; 20242d747510SLisandro Dalcin } 20252d747510SLisandro Dalcin PetscFunctionReturn(0); 20262d747510SLisandro Dalcin } 20272d747510SLisandro Dalcin 20282d747510SLisandro Dalcin /* 20292d747510SLisandro Dalcin Converts a string to PetscReal value. Handles special cases like "default" and "decide" 20302d747510SLisandro Dalcin */ 20312d747510SLisandro Dalcin PetscErrorCode PetscOptionsStringToReal(const char name[],PetscReal *a) 20322d747510SLisandro Dalcin { 20332d747510SLisandro Dalcin size_t len; 20342d747510SLisandro Dalcin PetscBool match; 20352d747510SLisandro Dalcin char *endptr; 20362d747510SLisandro Dalcin PetscErrorCode ierr; 20372d747510SLisandro Dalcin 20382d747510SLisandro Dalcin PetscFunctionBegin; 20392d747510SLisandro Dalcin ierr = PetscStrlen(name,&len);CHKERRQ(ierr); 20402d747510SLisandro Dalcin if (!len) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"String of length zero has no numerical value"); 20412d747510SLisandro Dalcin 20422d747510SLisandro Dalcin ierr = PetscStrcasecmp(name,"PETSC_DEFAULT",&match);CHKERRQ(ierr); 20432d747510SLisandro Dalcin if (!match) { 20442d747510SLisandro Dalcin ierr = PetscStrcasecmp(name,"DEFAULT",&match);CHKERRQ(ierr); 20452d747510SLisandro Dalcin } 20462d747510SLisandro Dalcin if (match) {*a = PETSC_DEFAULT; PetscFunctionReturn(0);} 20472d747510SLisandro Dalcin 20482d747510SLisandro Dalcin ierr = PetscStrcasecmp(name,"PETSC_DECIDE",&match);CHKERRQ(ierr); 20492d747510SLisandro Dalcin if (!match) { 20502d747510SLisandro Dalcin ierr = PetscStrcasecmp(name,"DECIDE",&match);CHKERRQ(ierr); 20512d747510SLisandro Dalcin } 20522d747510SLisandro Dalcin if (match) {*a = PETSC_DECIDE; PetscFunctionReturn(0);} 20532d747510SLisandro Dalcin 20542d747510SLisandro Dalcin ierr = PetscStrtod(name,a,&endptr);CHKERRQ(ierr); 20552d747510SLisandro Dalcin if ((size_t) (endptr - name) != len) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Input string %s has no numeric value",name); 20562d747510SLisandro Dalcin PetscFunctionReturn(0); 20572d747510SLisandro Dalcin } 20582d747510SLisandro Dalcin 20592d747510SLisandro Dalcin PetscErrorCode PetscOptionsStringToScalar(const char name[],PetscScalar *a) 20602d747510SLisandro Dalcin { 20612d747510SLisandro Dalcin PetscBool imag1; 20622d747510SLisandro Dalcin size_t len; 20632d747510SLisandro Dalcin PetscScalar val = 0.; 20642d747510SLisandro Dalcin char *ptr = NULL; 20652d747510SLisandro Dalcin PetscErrorCode ierr; 20662d747510SLisandro Dalcin 20672d747510SLisandro Dalcin PetscFunctionBegin; 20682d747510SLisandro Dalcin ierr = PetscStrlen(name,&len);CHKERRQ(ierr); 20692d747510SLisandro Dalcin if (!len) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"character string of length zero has no numerical value"); 20702d747510SLisandro Dalcin ierr = PetscStrtoz(name,&val,&ptr,&imag1);CHKERRQ(ierr); 20712d747510SLisandro Dalcin #if defined(PETSC_USE_COMPLEX) 20722d747510SLisandro Dalcin if ((size_t) (ptr - name) < len) { 20732d747510SLisandro Dalcin PetscBool imag2; 20742d747510SLisandro Dalcin PetscScalar val2; 20752d747510SLisandro Dalcin 20762d747510SLisandro Dalcin ierr = PetscStrtoz(ptr,&val2,&ptr,&imag2);CHKERRQ(ierr); 20772d747510SLisandro Dalcin if (imag1 || !imag2) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Input string %s: must specify imaginary component second",name); 20782d747510SLisandro Dalcin val = PetscCMPLX(PetscRealPart(val),PetscImaginaryPart(val2)); 20792d747510SLisandro Dalcin } 20802d747510SLisandro Dalcin #endif 20812d747510SLisandro Dalcin if ((size_t) (ptr - name) != len) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Input string %s has no numeric value ",name); 20822d747510SLisandro Dalcin *a = val; 20832d747510SLisandro Dalcin PetscFunctionReturn(0); 20842d747510SLisandro Dalcin } 20852d747510SLisandro Dalcin 20862d747510SLisandro Dalcin /*@C 20872d747510SLisandro Dalcin PetscOptionsGetBool - Gets the Logical (true or false) value for a particular 20882d747510SLisandro Dalcin option in the database. 2089e5c89e4eSSatish Balay 2090e5c89e4eSSatish Balay Not Collective 2091e5c89e4eSSatish Balay 2092e5c89e4eSSatish Balay Input Parameters: 20935c9cc608SHong Zhang + options - options database, use NULL for default global database 2094c5929fdfSBarry Smith . pre - the string to prepend to the name or NULL 2095e5c89e4eSSatish Balay - name - the option one is seeking 2096e5c89e4eSSatish Balay 2097e5c89e4eSSatish Balay Output Parameter: 20982d747510SLisandro Dalcin + ivalue - the logical value to return 209996ef3cdfSSatish Balay - set - PETSC_TRUE if found, else PETSC_FALSE 2100e5c89e4eSSatish Balay 2101e5c89e4eSSatish Balay Level: beginner 2102e5c89e4eSSatish Balay 210395452b02SPatrick Sanan Notes: 21042d747510SLisandro Dalcin TRUE, true, YES, yes, nostring, and 1 all translate to PETSC_TRUE 21052d747510SLisandro Dalcin FALSE, false, NO, no, and 0 all translate to PETSC_FALSE 21062d747510SLisandro Dalcin 21072d747510SLisandro 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 21082d747510SLisandro Dalcin is equivalent to -requested_bool true 21092d747510SLisandro Dalcin 21102d747510SLisandro Dalcin If the user does not supply the option at all ivalue is NOT changed. Thus 21112efd9cb1SBarry Smith you should ALWAYS initialize the ivalue if you access it without first checking if the set flag is true. 21122efd9cb1SBarry Smith 2113e5c89e4eSSatish Balay .seealso: PetscOptionsGetReal(), PetscOptionsHasName(), PetscOptionsGetString(), 21142d747510SLisandro Dalcin PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsGetInt(), PetscOptionsBool(), 2115e5c89e4eSSatish Balay PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 2116e5c89e4eSSatish Balay PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 2117acfcf0e5SJed Brown PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 2118a264d7a6SBarry Smith PetscOptionsFList(), PetscOptionsEList() 2119e5c89e4eSSatish Balay @*/ 21202d747510SLisandro Dalcin PetscErrorCode PetscOptionsGetBool(PetscOptions options,const char pre[],const char name[],PetscBool *ivalue,PetscBool *set) 2121e5c89e4eSSatish Balay { 21222d747510SLisandro Dalcin const char *value; 2123ace3abfcSBarry Smith PetscBool flag; 21242d747510SLisandro Dalcin PetscErrorCode ierr; 2125e5c89e4eSSatish Balay 2126e5c89e4eSSatish Balay PetscFunctionBegin; 21272d747510SLisandro Dalcin PetscValidCharPointer(name,3); 21282d747510SLisandro Dalcin if (ivalue) PetscValidIntPointer(ivalue,4); 21292d747510SLisandro Dalcin ierr = PetscOptionsFindPair(options,pre,name,&value,&flag);CHKERRQ(ierr); 2130e5c89e4eSSatish Balay if (flag) { 213196ef3cdfSSatish Balay if (set) *set = PETSC_TRUE; 21322d747510SLisandro Dalcin if (!value) { 21332d747510SLisandro Dalcin if (ivalue) *ivalue = PETSC_TRUE; 21342d747510SLisandro Dalcin } else { 21352d747510SLisandro Dalcin ierr = PetscOptionsStringToBool(value, &flag);CHKERRQ(ierr); 21362d747510SLisandro Dalcin if (ivalue) *ivalue = flag; 2137e5c89e4eSSatish Balay } 2138e5c89e4eSSatish Balay } else { 213996ef3cdfSSatish Balay if (set) *set = PETSC_FALSE; 2140e5c89e4eSSatish Balay } 2141e5c89e4eSSatish Balay PetscFunctionReturn(0); 2142e5c89e4eSSatish Balay } 2143e5c89e4eSSatish Balay 2144e5c89e4eSSatish Balay /*@C 2145e5c89e4eSSatish Balay PetscOptionsGetEList - Puts a list of option values that a single one may be selected from 2146e5c89e4eSSatish Balay 2147e5c89e4eSSatish Balay Not Collective 2148e5c89e4eSSatish Balay 2149e5c89e4eSSatish Balay Input Parameters: 21505c9cc608SHong Zhang + options - options database, use NULL for default global database 2151c5929fdfSBarry Smith . pre - the string to prepend to the name or NULL 2152e5c89e4eSSatish Balay . opt - option name 2153a264d7a6SBarry Smith . list - the possible choices (one of these must be selected, anything else is invalid) 2154a2b725a8SWilliam Gropp - ntext - number of choices 2155e5c89e4eSSatish Balay 2156e5c89e4eSSatish Balay Output Parameter: 21572efd9cb1SBarry Smith + value - the index of the value to return (defaults to zero if the option name is given but no choice is listed) 2158e5c89e4eSSatish Balay - set - PETSC_TRUE if found, else PETSC_FALSE 2159e5c89e4eSSatish Balay 2160e5c89e4eSSatish Balay Level: intermediate 2161e5c89e4eSSatish Balay 216295452b02SPatrick Sanan Notes: 216395452b02SPatrick Sanan If the user does not supply the option value is NOT changed. Thus 21642efd9cb1SBarry Smith you should ALWAYS initialize the ivalue if you access it without first checking if the set flag is true. 21652efd9cb1SBarry Smith 2166a264d7a6SBarry Smith See PetscOptionsFList() for when the choices are given in a PetscFunctionList() 2167e5c89e4eSSatish Balay 2168e5c89e4eSSatish Balay .seealso: PetscOptionsGetInt(), PetscOptionsGetReal(), 2169acfcf0e5SJed Brown PetscOptionsHasName(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool(), 2170e5c89e4eSSatish Balay PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 2171e5c89e4eSSatish Balay PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 2172acfcf0e5SJed Brown PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 2173a264d7a6SBarry Smith PetscOptionsFList(), PetscOptionsEList() 2174e5c89e4eSSatish Balay @*/ 2175c5929fdfSBarry Smith PetscErrorCode PetscOptionsGetEList(PetscOptions options,const char pre[],const char opt[],const char * const *list,PetscInt ntext,PetscInt *value,PetscBool *set) 2176e5c89e4eSSatish Balay { 2177e5c89e4eSSatish Balay PetscErrorCode ierr; 217858b0ac4eSStefano Zampini size_t alen,len = 0, tlen = 0; 2179e5c89e4eSSatish Balay char *svalue; 2180ace3abfcSBarry Smith PetscBool aset,flg = PETSC_FALSE; 2181e5c89e4eSSatish Balay PetscInt i; 2182e5c89e4eSSatish Balay 2183e5c89e4eSSatish Balay PetscFunctionBegin; 21842d747510SLisandro Dalcin PetscValidCharPointer(opt,3); 2185e5c89e4eSSatish Balay for (i=0; i<ntext; i++) { 2186e5c89e4eSSatish Balay ierr = PetscStrlen(list[i],&alen);CHKERRQ(ierr); 2187e5c89e4eSSatish Balay if (alen > len) len = alen; 218858b0ac4eSStefano Zampini tlen += len + 1; 2189e5c89e4eSSatish Balay } 2190e5c89e4eSSatish Balay len += 5; /* a little extra space for user mistypes */ 2191785e854fSJed Brown ierr = PetscMalloc1(len,&svalue);CHKERRQ(ierr); 2192c5929fdfSBarry Smith ierr = PetscOptionsGetString(options,pre,opt,svalue,len,&aset);CHKERRQ(ierr); 2193e5c89e4eSSatish Balay if (aset) { 2194fbedd5e0SJed Brown ierr = PetscEListFind(ntext,list,svalue,value,&flg);CHKERRQ(ierr); 219558b0ac4eSStefano Zampini if (!flg) { 219658b0ac4eSStefano Zampini char *avail,*pavl; 219758b0ac4eSStefano Zampini 219858b0ac4eSStefano Zampini ierr = PetscMalloc1(tlen,&avail);CHKERRQ(ierr); 219958b0ac4eSStefano Zampini pavl = avail; 220058b0ac4eSStefano Zampini for (i=0; i<ntext; i++) { 220158b0ac4eSStefano Zampini ierr = PetscStrlen(list[i],&alen);CHKERRQ(ierr); 220258b0ac4eSStefano Zampini ierr = PetscStrcpy(pavl,list[i]);CHKERRQ(ierr); 220358b0ac4eSStefano Zampini pavl += alen; 220458b0ac4eSStefano Zampini ierr = PetscStrcpy(pavl," ");CHKERRQ(ierr); 220558b0ac4eSStefano Zampini pavl += 1; 220658b0ac4eSStefano Zampini } 220758b0ac4eSStefano Zampini ierr = PetscStrtolower(avail);CHKERRQ(ierr); 220858b0ac4eSStefano Zampini SETERRQ4(PETSC_COMM_SELF,PETSC_ERR_USER,"Unknown option %s for -%s%s. Available options: %s",svalue,pre ? pre : "",opt+1,avail); 220958b0ac4eSStefano Zampini } 2210fbedd5e0SJed Brown if (set) *set = PETSC_TRUE; 2211a297a907SKarl Rupp } else if (set) *set = PETSC_FALSE; 2212e5c89e4eSSatish Balay ierr = PetscFree(svalue);CHKERRQ(ierr); 2213e5c89e4eSSatish Balay PetscFunctionReturn(0); 2214e5c89e4eSSatish Balay } 2215e5c89e4eSSatish Balay 2216e5c89e4eSSatish Balay /*@C 2217e5c89e4eSSatish Balay PetscOptionsGetEnum - Gets the enum value for a particular option in the database. 2218e5c89e4eSSatish Balay 2219e5c89e4eSSatish Balay Not Collective 2220e5c89e4eSSatish Balay 2221e5c89e4eSSatish Balay Input Parameters: 22225c9cc608SHong Zhang + options - options database, use NULL for default global database 2223c5929fdfSBarry Smith . pre - option prefix or NULL 2224e5c89e4eSSatish Balay . opt - option name 2225e5c89e4eSSatish Balay . list - array containing the list of choices, followed by the enum name, followed by the enum prefix, followed by a null 2226e5c89e4eSSatish Balay - defaultv - the default (current) value 2227e5c89e4eSSatish Balay 2228e5c89e4eSSatish Balay Output Parameter: 2229e5c89e4eSSatish Balay + value - the value to return 223096ef3cdfSSatish Balay - set - PETSC_TRUE if found, else PETSC_FALSE 2231e5c89e4eSSatish Balay 2232e5c89e4eSSatish Balay Level: beginner 2233e5c89e4eSSatish Balay 223495452b02SPatrick Sanan Notes: 223595452b02SPatrick Sanan If the user does not supply the option value is NOT changed. Thus 22362efd9cb1SBarry Smith you should ALWAYS initialize the ivalue if you access it without first checking if the set flag is true. 2237e5c89e4eSSatish Balay 22382efd9cb1SBarry Smith List is usually something like PCASMTypes or some other predefined list of enum names 2239e5c89e4eSSatish Balay 2240e5c89e4eSSatish Balay .seealso: PetscOptionsGetReal(), PetscOptionsHasName(), PetscOptionsGetString(), PetscOptionsGetInt(), 2241acfcf0e5SJed Brown PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool() 2242acfcf0e5SJed Brown PetscOptionsInt(), PetscOptionsString(), PetscOptionsReal(), PetscOptionsBool(), 2243e5c89e4eSSatish Balay PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 2244e5c89e4eSSatish Balay PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 2245acfcf0e5SJed Brown PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 2246a264d7a6SBarry Smith PetscOptionsFList(), PetscOptionsEList(), PetscOptionsGetEList(), PetscOptionsEnum() 2247e5c89e4eSSatish Balay @*/ 2248c5929fdfSBarry Smith PetscErrorCode PetscOptionsGetEnum(PetscOptions options,const char pre[],const char opt[],const char * const *list,PetscEnum *value,PetscBool *set) 2249e5c89e4eSSatish Balay { 2250e5c89e4eSSatish Balay PetscErrorCode ierr; 225169a24498SJed Brown PetscInt ntext = 0,tval; 2252ace3abfcSBarry Smith PetscBool fset; 2253e5c89e4eSSatish Balay 2254e5c89e4eSSatish Balay PetscFunctionBegin; 22552d747510SLisandro Dalcin PetscValidCharPointer(opt,3); 2256e5c89e4eSSatish Balay while (list[ntext++]) { 2257e32f2f54SBarry Smith if (ntext > 50) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"List argument appears to be wrong or have more than 50 entries"); 2258e5c89e4eSSatish Balay } 2259e32f2f54SBarry Smith if (ntext < 3) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"List argument must have at least two entries: typename and type prefix"); 2260e5c89e4eSSatish Balay ntext -= 3; 2261c5929fdfSBarry Smith ierr = PetscOptionsGetEList(options,pre,opt,list,ntext,&tval,&fset);CHKERRQ(ierr); 226269a24498SJed Brown /* with PETSC_USE_64BIT_INDICES sizeof(PetscInt) != sizeof(PetscEnum) */ 2263809ceb46SBarry Smith if (fset) *value = (PetscEnum)tval; 2264809ceb46SBarry Smith if (set) *set = fset; 2265e5c89e4eSSatish Balay PetscFunctionReturn(0); 2266e5c89e4eSSatish Balay } 2267e5c89e4eSSatish Balay 2268e5c89e4eSSatish Balay /*@C 22692d747510SLisandro Dalcin PetscOptionsGetInt - Gets the integer value for a particular option in the database. 2270e5c89e4eSSatish Balay 2271e5c89e4eSSatish Balay Not Collective 2272e5c89e4eSSatish Balay 2273e5c89e4eSSatish Balay Input Parameters: 22745c9cc608SHong Zhang + options - options database, use NULL for default global database 2275c5929fdfSBarry Smith . pre - the string to prepend to the name or NULL 2276e5c89e4eSSatish Balay - name - the option one is seeking 2277e5c89e4eSSatish Balay 2278e5c89e4eSSatish Balay Output Parameter: 22792d747510SLisandro Dalcin + ivalue - the integer value to return 228096ef3cdfSSatish Balay - set - PETSC_TRUE if found, else PETSC_FALSE 2281e5c89e4eSSatish Balay 2282e5c89e4eSSatish Balay Level: beginner 2283e5c89e4eSSatish Balay 2284e5c89e4eSSatish Balay Notes: 22852d747510SLisandro Dalcin If the user does not supply the option ivalue is NOT changed. Thus 22862efd9cb1SBarry Smith you should ALWAYS initialize the ivalue if you access it without first checking if the set flag is true. 22875c07ccb8SBarry Smith 2288e5c89e4eSSatish Balay .seealso: PetscOptionsGetReal(), PetscOptionsHasName(), PetscOptionsGetString(), 22892d747510SLisandro Dalcin PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool() 22902d747510SLisandro Dalcin PetscOptionsInt(), PetscOptionsString(), PetscOptionsReal(), PetscOptionsBool(), 2291e5c89e4eSSatish Balay PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 2292e5c89e4eSSatish Balay PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 2293acfcf0e5SJed Brown PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 2294a264d7a6SBarry Smith PetscOptionsFList(), PetscOptionsEList() 2295e5c89e4eSSatish Balay @*/ 22962d747510SLisandro Dalcin PetscErrorCode PetscOptionsGetInt(PetscOptions options,const char pre[],const char name[],PetscInt *ivalue,PetscBool *set) 2297e5c89e4eSSatish Balay { 22982d747510SLisandro Dalcin const char *value; 2299e5c89e4eSSatish Balay PetscErrorCode ierr; 23002d747510SLisandro Dalcin PetscBool flag; 2301e5c89e4eSSatish Balay 2302e5c89e4eSSatish Balay PetscFunctionBegin; 23032d747510SLisandro Dalcin PetscValidCharPointer(name,3); 23042d747510SLisandro Dalcin PetscValidIntPointer(ivalue,4); 23052d747510SLisandro Dalcin ierr = PetscOptionsFindPair(options,pre,name,&value,&flag);CHKERRQ(ierr); 2306e5c89e4eSSatish Balay if (flag) { 230734a9cc2cSBarry Smith if (!value) { 23082d747510SLisandro Dalcin if (set) *set = PETSC_FALSE; 230934a9cc2cSBarry Smith } else { 23102d747510SLisandro Dalcin if (set) *set = PETSC_TRUE; 23112d747510SLisandro Dalcin ierr = PetscOptionsStringToInt(value,ivalue);CHKERRQ(ierr); 2312e5c89e4eSSatish Balay } 2313e5c89e4eSSatish Balay } else { 231496ef3cdfSSatish Balay if (set) *set = PETSC_FALSE; 2315e5c89e4eSSatish Balay } 2316e5c89e4eSSatish Balay PetscFunctionReturn(0); 2317e5c89e4eSSatish Balay } 2318e5c89e4eSSatish Balay 2319e2446a98SMatthew Knepley /*@C 2320e5c89e4eSSatish Balay PetscOptionsGetReal - Gets the double precision value for a particular 2321e5c89e4eSSatish Balay option in the database. 2322e5c89e4eSSatish Balay 2323e5c89e4eSSatish Balay Not Collective 2324e5c89e4eSSatish Balay 2325e5c89e4eSSatish Balay Input Parameters: 23265c9cc608SHong Zhang + options - options database, use NULL for default global database 2327c5929fdfSBarry Smith . pre - string to prepend to each name or NULL 2328e5c89e4eSSatish Balay - name - the option one is seeking 2329e5c89e4eSSatish Balay 2330e5c89e4eSSatish Balay Output Parameter: 2331e5c89e4eSSatish Balay + dvalue - the double value to return 233296ef3cdfSSatish Balay - set - PETSC_TRUE if found, PETSC_FALSE if not found 2333e5c89e4eSSatish Balay 233495452b02SPatrick Sanan Notes: 233595452b02SPatrick Sanan If the user does not supply the option dvalue is NOT changed. Thus 23362efd9cb1SBarry Smith you should ALWAYS initialize the ivalue if you access it without first checking if the set flag is true. 2337e4974155SBarry Smith 2338e5c89e4eSSatish Balay Level: beginner 2339e5c89e4eSSatish Balay 2340e5c89e4eSSatish Balay .seealso: PetscOptionsGetInt(), PetscOptionsHasName(), 2341acfcf0e5SJed Brown PetscOptionsGetString(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(),PetscOptionsBool(), 2342e5c89e4eSSatish Balay PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 2343e5c89e4eSSatish Balay PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 2344acfcf0e5SJed Brown PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 2345a264d7a6SBarry Smith PetscOptionsFList(), PetscOptionsEList() 2346e5c89e4eSSatish Balay @*/ 2347c5929fdfSBarry Smith PetscErrorCode PetscOptionsGetReal(PetscOptions options,const char pre[],const char name[],PetscReal *dvalue,PetscBool *set) 2348e5c89e4eSSatish Balay { 23492d747510SLisandro Dalcin const char *value; 2350ace3abfcSBarry Smith PetscBool flag; 23512d747510SLisandro Dalcin PetscErrorCode ierr; 2352e5c89e4eSSatish Balay 2353e5c89e4eSSatish Balay PetscFunctionBegin; 23542d747510SLisandro Dalcin PetscValidCharPointer(name,3); 23552d747510SLisandro Dalcin PetscValidRealPointer(dvalue,4); 23562d747510SLisandro Dalcin ierr = PetscOptionsFindPair(options,pre,name,&value,&flag);CHKERRQ(ierr); 2357e5c89e4eSSatish Balay if (flag) { 2358a297a907SKarl Rupp if (!value) { 2359a297a907SKarl Rupp if (set) *set = PETSC_FALSE; 2360a297a907SKarl Rupp } else { 2361a297a907SKarl Rupp if (set) *set = PETSC_TRUE; 2362a297a907SKarl Rupp ierr = PetscOptionsStringToReal(value,dvalue);CHKERRQ(ierr); 2363a297a907SKarl Rupp } 2364e5c89e4eSSatish Balay } else { 236596ef3cdfSSatish Balay if (set) *set = PETSC_FALSE; 2366e5c89e4eSSatish Balay } 2367e5c89e4eSSatish Balay PetscFunctionReturn(0); 2368e5c89e4eSSatish Balay } 2369e5c89e4eSSatish Balay 2370e5c89e4eSSatish Balay /*@C 2371e5c89e4eSSatish Balay PetscOptionsGetScalar - Gets the scalar value for a particular 2372e5c89e4eSSatish Balay option in the database. 2373e5c89e4eSSatish Balay 2374e5c89e4eSSatish Balay Not Collective 2375e5c89e4eSSatish Balay 2376e5c89e4eSSatish Balay Input Parameters: 23775c9cc608SHong Zhang + options - options database, use NULL for default global database 2378c5929fdfSBarry Smith . pre - string to prepend to each name or NULL 2379e5c89e4eSSatish Balay - name - the option one is seeking 2380e5c89e4eSSatish Balay 2381e5c89e4eSSatish Balay Output Parameter: 2382e5c89e4eSSatish Balay + dvalue - the double value to return 238396ef3cdfSSatish Balay - set - PETSC_TRUE if found, else PETSC_FALSE 2384e5c89e4eSSatish Balay 2385e5c89e4eSSatish Balay Level: beginner 2386e5c89e4eSSatish Balay 2387e5c89e4eSSatish Balay Usage: 2388eb4ae41dSBarry Smith A complex number 2+3i must be specified with NO spaces 2389e5c89e4eSSatish Balay 239095452b02SPatrick Sanan Notes: 239195452b02SPatrick Sanan If the user does not supply the option dvalue is NOT changed. Thus 23922efd9cb1SBarry Smith you should ALWAYS initialize the ivalue if you access it without first checking if the set flag is true. 2393e4974155SBarry Smith 2394e5c89e4eSSatish Balay .seealso: PetscOptionsGetInt(), PetscOptionsHasName(), 2395acfcf0e5SJed Brown PetscOptionsGetString(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool(), 2396e5c89e4eSSatish Balay PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 2397e5c89e4eSSatish Balay PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 2398acfcf0e5SJed Brown PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 2399a264d7a6SBarry Smith PetscOptionsFList(), PetscOptionsEList() 2400e5c89e4eSSatish Balay @*/ 2401c5929fdfSBarry Smith PetscErrorCode PetscOptionsGetScalar(PetscOptions options,const char pre[],const char name[],PetscScalar *dvalue,PetscBool *set) 2402e5c89e4eSSatish Balay { 24032d747510SLisandro Dalcin const char *value; 2404ace3abfcSBarry Smith PetscBool flag; 2405e5c89e4eSSatish Balay PetscErrorCode ierr; 2406e5c89e4eSSatish Balay 2407e5c89e4eSSatish Balay PetscFunctionBegin; 24082d747510SLisandro Dalcin PetscValidCharPointer(name,3); 24092d747510SLisandro Dalcin PetscValidScalarPointer(dvalue,4); 24102d747510SLisandro Dalcin ierr = PetscOptionsFindPair(options,pre,name,&value,&flag);CHKERRQ(ierr); 2411e5c89e4eSSatish Balay if (flag) { 2412e5c89e4eSSatish Balay if (!value) { 241396ef3cdfSSatish Balay if (set) *set = PETSC_FALSE; 2414e5c89e4eSSatish Balay } else { 2415e5c89e4eSSatish Balay #if !defined(PETSC_USE_COMPLEX) 2416cfbddea1SSatish Balay ierr = PetscOptionsStringToReal(value,dvalue);CHKERRQ(ierr); 2417e5c89e4eSSatish Balay #else 2418eb4ae41dSBarry Smith ierr = PetscOptionsStringToScalar(value,dvalue);CHKERRQ(ierr); 2419e5c89e4eSSatish Balay #endif 242096ef3cdfSSatish Balay if (set) *set = PETSC_TRUE; 2421e5c89e4eSSatish Balay } 2422e5c89e4eSSatish Balay } else { /* flag */ 242396ef3cdfSSatish Balay if (set) *set = PETSC_FALSE; 2424e5c89e4eSSatish Balay } 2425e5c89e4eSSatish Balay PetscFunctionReturn(0); 2426e5c89e4eSSatish Balay } 2427e5c89e4eSSatish Balay 2428e5c89e4eSSatish Balay /*@C 2429e5c89e4eSSatish Balay PetscOptionsGetString - Gets the string value for a particular option in 2430e5c89e4eSSatish Balay the database. 2431e5c89e4eSSatish Balay 2432e5c89e4eSSatish Balay Not Collective 2433e5c89e4eSSatish Balay 2434e5c89e4eSSatish Balay Input Parameters: 24355c9cc608SHong Zhang + options - options database, use NULL for default global database 2436c5929fdfSBarry Smith . pre - string to prepend to name or NULL 2437e5c89e4eSSatish Balay . name - the option one is seeking 2438bcbf2dc5SJed Brown - len - maximum length of the string including null termination 2439e5c89e4eSSatish Balay 2440e5c89e4eSSatish Balay Output Parameters: 2441e5c89e4eSSatish Balay + string - location to copy string 244296ef3cdfSSatish Balay - set - PETSC_TRUE if found, else PETSC_FALSE 2443e5c89e4eSSatish Balay 2444e5c89e4eSSatish Balay Level: beginner 2445e5c89e4eSSatish Balay 2446e5c89e4eSSatish Balay Fortran Note: 2447e5c89e4eSSatish Balay The Fortran interface is slightly different from the C/C++ 2448e5c89e4eSSatish Balay interface (len is not used). Sample usage in Fortran follows 2449e5c89e4eSSatish Balay .vb 2450e5c89e4eSSatish Balay character *20 string 245193e6ba5cSBarry Smith PetscErrorCode ierr 245293e6ba5cSBarry Smith PetscBool set 24531b266c99SBarry Smith call PetscOptionsGetString(PETSC_NULL_OPTIONS,PETSC_NULL_CHARACTER,'-s',string,set,ierr) 2454e5c89e4eSSatish Balay .ve 2455e5c89e4eSSatish Balay 245695452b02SPatrick Sanan Notes: 245795452b02SPatrick 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 2458e4974155SBarry Smith 24592efd9cb1SBarry Smith If the user does not use the option then the string is not changed. Thus 24602efd9cb1SBarry Smith you should ALWAYS initialize the string if you access it without first checking if the set flag is true. 24612efd9cb1SBarry Smith 2462f3dea69dSBarry Smith Note: 2463f3dea69dSBarry 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). 2464f3dea69dSBarry Smith 2465e5c89e4eSSatish Balay .seealso: PetscOptionsGetInt(), PetscOptionsGetReal(), 2466acfcf0e5SJed Brown PetscOptionsHasName(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool(), 2467e5c89e4eSSatish Balay PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 2468e5c89e4eSSatish Balay PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 2469acfcf0e5SJed Brown PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 2470a264d7a6SBarry Smith PetscOptionsFList(), PetscOptionsEList() 2471e5c89e4eSSatish Balay @*/ 2472c5929fdfSBarry Smith PetscErrorCode PetscOptionsGetString(PetscOptions options,const char pre[],const char name[],char string[],size_t len,PetscBool *set) 2473e5c89e4eSSatish Balay { 24742d747510SLisandro Dalcin const char *value; 2475ace3abfcSBarry Smith PetscBool flag; 24762d747510SLisandro Dalcin PetscErrorCode ierr; 2477e5c89e4eSSatish Balay 2478e5c89e4eSSatish Balay PetscFunctionBegin; 24792d747510SLisandro Dalcin PetscValidCharPointer(name,3); 24802d747510SLisandro Dalcin PetscValidCharPointer(string,4); 24812d747510SLisandro Dalcin ierr = PetscOptionsFindPair(options,pre,name,&value,&flag);CHKERRQ(ierr); 2482e5c89e4eSSatish Balay if (!flag) { 248396ef3cdfSSatish Balay if (set) *set = PETSC_FALSE; 2484e5c89e4eSSatish Balay } else { 248596ef3cdfSSatish Balay if (set) *set = PETSC_TRUE; 2486e5c89e4eSSatish Balay if (value) { 2487e5c89e4eSSatish Balay ierr = PetscStrncpy(string,value,len);CHKERRQ(ierr); 2488e5c89e4eSSatish Balay } else { 2489580bdb30SBarry Smith ierr = PetscArrayzero(string,len);CHKERRQ(ierr); 2490e5c89e4eSSatish Balay } 2491e5c89e4eSSatish Balay } 2492e5c89e4eSSatish Balay PetscFunctionReturn(0); 2493e5c89e4eSSatish Balay } 2494e5c89e4eSSatish Balay 2495c5929fdfSBarry Smith char *PetscOptionsGetStringMatlab(PetscOptions options,const char pre[],const char name[]) 249614ce751eSBarry Smith { 24972d747510SLisandro Dalcin const char *value; 249814ce751eSBarry Smith PetscBool flag; 24992d747510SLisandro Dalcin PetscErrorCode ierr; 250014ce751eSBarry Smith 250114ce751eSBarry Smith PetscFunctionBegin; 250202c9f0b5SLisandro Dalcin ierr = PetscOptionsFindPair(options,pre,name,&value,&flag);if (ierr) PetscFunctionReturn(NULL); 25032d747510SLisandro Dalcin if (flag) PetscFunctionReturn((char*)value); 250402c9f0b5SLisandro Dalcin else PetscFunctionReturn(NULL); 250514ce751eSBarry Smith } 250614ce751eSBarry Smith 25072d747510SLisandro Dalcin /*@C 25082d747510SLisandro Dalcin PetscOptionsGetBoolArray - Gets an array of Logical (true or false) values for a particular 25092d747510SLisandro Dalcin option in the database. The values must be separated with commas with 25102d747510SLisandro Dalcin no intervening spaces. 25112d747510SLisandro Dalcin 25122d747510SLisandro Dalcin Not Collective 25132d747510SLisandro Dalcin 25142d747510SLisandro Dalcin Input Parameters: 25152d747510SLisandro Dalcin + options - options database, use NULL for default global database 25162d747510SLisandro Dalcin . pre - string to prepend to each name or NULL 25172d747510SLisandro Dalcin . name - the option one is seeking 25182d747510SLisandro Dalcin - nmax - maximum number of values to retrieve 25192d747510SLisandro Dalcin 25202d747510SLisandro Dalcin Output Parameter: 25212d747510SLisandro Dalcin + dvalue - the integer values to return 25222d747510SLisandro Dalcin . nmax - actual number of values retreived 25232d747510SLisandro Dalcin - set - PETSC_TRUE if found, else PETSC_FALSE 25242d747510SLisandro Dalcin 25252d747510SLisandro Dalcin Level: beginner 25262d747510SLisandro Dalcin 25272d747510SLisandro Dalcin Notes: 25282d747510SLisandro Dalcin TRUE, true, YES, yes, nostring, and 1 all translate to PETSC_TRUE 25292d747510SLisandro Dalcin FALSE, false, NO, no, and 0 all translate to PETSC_FALSE 25302d747510SLisandro Dalcin 25312d747510SLisandro Dalcin .seealso: PetscOptionsGetInt(), PetscOptionsHasName(), 25322d747510SLisandro Dalcin PetscOptionsGetString(), PetscOptionsGetRealArray(), PetscOptionsBool(), 25332d747510SLisandro Dalcin PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 25342d747510SLisandro Dalcin PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 25352d747510SLisandro Dalcin PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 25362d747510SLisandro Dalcin PetscOptionsFList(), PetscOptionsEList() 25372d747510SLisandro Dalcin @*/ 25382d747510SLisandro Dalcin PetscErrorCode PetscOptionsGetBoolArray(PetscOptions options,const char pre[],const char name[],PetscBool dvalue[],PetscInt *nmax,PetscBool *set) 25392d747510SLisandro Dalcin { 25402d747510SLisandro Dalcin const char *svalue; 25412d747510SLisandro Dalcin char *value; 25422d747510SLisandro Dalcin PetscErrorCode ierr; 25432d747510SLisandro Dalcin PetscInt n = 0; 25442d747510SLisandro Dalcin PetscBool flag; 25452d747510SLisandro Dalcin PetscToken token; 25462d747510SLisandro Dalcin 25472d747510SLisandro Dalcin PetscFunctionBegin; 25482d747510SLisandro Dalcin PetscValidCharPointer(name,3); 25492d747510SLisandro Dalcin PetscValidIntPointer(dvalue,4); 25502d747510SLisandro Dalcin PetscValidIntPointer(nmax,5); 25512d747510SLisandro Dalcin 25522d747510SLisandro Dalcin ierr = PetscOptionsFindPair(options,pre,name,&svalue,&flag);CHKERRQ(ierr); 25532d747510SLisandro Dalcin if (!flag || !svalue) { if (set) *set = PETSC_FALSE; *nmax = 0; PetscFunctionReturn(0);} 25542d747510SLisandro Dalcin if (set) *set = PETSC_TRUE; 25552d747510SLisandro Dalcin ierr = PetscTokenCreate(svalue,',',&token);CHKERRQ(ierr); 25562d747510SLisandro Dalcin ierr = PetscTokenFind(token,&value);CHKERRQ(ierr); 25572d747510SLisandro Dalcin while (value && n < *nmax) { 25582d747510SLisandro Dalcin ierr = PetscOptionsStringToBool(value,dvalue);CHKERRQ(ierr); 25592d747510SLisandro Dalcin ierr = PetscTokenFind(token,&value);CHKERRQ(ierr); 25602d747510SLisandro Dalcin dvalue++; 25612d747510SLisandro Dalcin n++; 25622d747510SLisandro Dalcin } 25632d747510SLisandro Dalcin ierr = PetscTokenDestroy(&token);CHKERRQ(ierr); 25642d747510SLisandro Dalcin *nmax = n; 25652d747510SLisandro Dalcin PetscFunctionReturn(0); 25662d747510SLisandro Dalcin } 25672d747510SLisandro Dalcin 25682d747510SLisandro Dalcin /*@C 25692d747510SLisandro Dalcin PetscOptionsGetEnumArray - Gets an array of enum values for a particular option in the database. 25702d747510SLisandro Dalcin 25712d747510SLisandro Dalcin Not Collective 25722d747510SLisandro Dalcin 25732d747510SLisandro Dalcin Input Parameters: 25742d747510SLisandro Dalcin + options - options database, use NULL for default global database 25752d747510SLisandro Dalcin . pre - option prefix or NULL 25762d747510SLisandro Dalcin . name - option name 25772d747510SLisandro Dalcin . list - array containing the list of choices, followed by the enum name, followed by the enum prefix, followed by a null 25782d747510SLisandro Dalcin - nmax - maximum number of values to retrieve 25792d747510SLisandro Dalcin 25802d747510SLisandro Dalcin Output Parameters: 25812d747510SLisandro Dalcin + ivalue - the enum values to return 25822d747510SLisandro Dalcin . nmax - actual number of values retreived 25832d747510SLisandro Dalcin - set - PETSC_TRUE if found, else PETSC_FALSE 25842d747510SLisandro Dalcin 25852d747510SLisandro Dalcin Level: beginner 25862d747510SLisandro Dalcin 25872d747510SLisandro Dalcin Notes: 25882d747510SLisandro Dalcin The array must be passed as a comma separated list. 25892d747510SLisandro Dalcin 25902d747510SLisandro Dalcin There must be no intervening spaces between the values. 25912d747510SLisandro Dalcin 25922d747510SLisandro Dalcin list is usually something like PCASMTypes or some other predefined list of enum names. 25932d747510SLisandro Dalcin 25942d747510SLisandro Dalcin .seealso: PetscOptionsGetReal(), PetscOptionsHasName(), PetscOptionsGetString(), PetscOptionsGetInt(), 25952d747510SLisandro Dalcin PetscOptionsGetEnum(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool() 25962d747510SLisandro Dalcin PetscOptionsInt(), PetscOptionsString(), PetscOptionsReal(), PetscOptionsBool(), PetscOptionsName(), 25972d747510SLisandro Dalcin PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), PetscOptionsStringArray(),PetscOptionsRealArray(), 25982d747510SLisandro Dalcin PetscOptionsScalar(), PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 25992d747510SLisandro Dalcin PetscOptionsFList(), PetscOptionsEList(), PetscOptionsGetEList(), PetscOptionsEnum() 26002d747510SLisandro Dalcin @*/ 26012d747510SLisandro Dalcin PetscErrorCode PetscOptionsGetEnumArray(PetscOptions options,const char pre[],const char name[],const char *const *list,PetscEnum ivalue[],PetscInt *nmax,PetscBool *set) 26022d747510SLisandro Dalcin { 26032d747510SLisandro Dalcin const char *svalue; 26042d747510SLisandro Dalcin char *value; 26052d747510SLisandro Dalcin PetscInt n = 0; 26062d747510SLisandro Dalcin PetscEnum evalue; 26072d747510SLisandro Dalcin PetscBool flag; 26082d747510SLisandro Dalcin PetscToken token; 26092d747510SLisandro Dalcin PetscErrorCode ierr; 26102d747510SLisandro Dalcin 26112d747510SLisandro Dalcin PetscFunctionBegin; 26122d747510SLisandro Dalcin PetscValidCharPointer(name,3); 26132d747510SLisandro Dalcin PetscValidPointer(list,4); 26142d747510SLisandro Dalcin PetscValidPointer(ivalue,5); 26152d747510SLisandro Dalcin PetscValidIntPointer(nmax,6); 26162d747510SLisandro Dalcin 26172d747510SLisandro Dalcin ierr = PetscOptionsFindPair(options,pre,name,&svalue,&flag);CHKERRQ(ierr); 26182d747510SLisandro Dalcin if (!flag || !svalue) { if (set) *set = PETSC_FALSE; *nmax = 0; PetscFunctionReturn(0);} 26192d747510SLisandro Dalcin if (set) *set = PETSC_TRUE; 26202d747510SLisandro Dalcin ierr = PetscTokenCreate(svalue,',',&token);CHKERRQ(ierr); 26212d747510SLisandro Dalcin ierr = PetscTokenFind(token,&value);CHKERRQ(ierr); 26222d747510SLisandro Dalcin while (value && n < *nmax) { 26232d747510SLisandro Dalcin ierr = PetscEnumFind(list,value,&evalue,&flag);CHKERRQ(ierr); 26242d747510SLisandro Dalcin if (!flag) SETERRQ3(PETSC_COMM_SELF,PETSC_ERR_USER,"Unknown enum value '%s' for -%s%s",svalue,pre ? pre : "",name+1); 26252d747510SLisandro Dalcin ivalue[n++] = evalue; 26262d747510SLisandro Dalcin ierr = PetscTokenFind(token,&value);CHKERRQ(ierr); 26272d747510SLisandro Dalcin } 26282d747510SLisandro Dalcin ierr = PetscTokenDestroy(&token);CHKERRQ(ierr); 26292d747510SLisandro Dalcin *nmax = n; 26302d747510SLisandro Dalcin PetscFunctionReturn(0); 26312d747510SLisandro Dalcin } 26322d747510SLisandro Dalcin 26332d747510SLisandro Dalcin /*@C 26342d747510SLisandro Dalcin PetscOptionsGetIntArray - Gets an array of integer values for a particular 26352d747510SLisandro Dalcin option in the database. 26362d747510SLisandro Dalcin 26372d747510SLisandro Dalcin Not Collective 26382d747510SLisandro Dalcin 26392d747510SLisandro Dalcin Input Parameters: 26402d747510SLisandro Dalcin + options - options database, use NULL for default global database 26412d747510SLisandro Dalcin . pre - string to prepend to each name or NULL 26422d747510SLisandro Dalcin . name - the option one is seeking 26432d747510SLisandro Dalcin - nmax - maximum number of values to retrieve 26442d747510SLisandro Dalcin 26452d747510SLisandro Dalcin Output Parameter: 26462d747510SLisandro Dalcin + ivalue - the integer values to return 26472d747510SLisandro Dalcin . nmax - actual number of values retreived 26482d747510SLisandro Dalcin - set - PETSC_TRUE if found, else PETSC_FALSE 26492d747510SLisandro Dalcin 26502d747510SLisandro Dalcin Level: beginner 26512d747510SLisandro Dalcin 26522d747510SLisandro Dalcin Notes: 26532d747510SLisandro Dalcin The array can be passed as 26542d747510SLisandro Dalcin a comma separated list: 0,1,2,3,4,5,6,7 26552d747510SLisandro Dalcin a range (start-end+1): 0-8 26562d747510SLisandro Dalcin a range with given increment (start-end+1:inc): 0-7:2 26572d747510SLisandro Dalcin a combination of values and ranges separated by commas: 0,1-8,8-15:2 26582d747510SLisandro Dalcin 26592d747510SLisandro Dalcin There must be no intervening spaces between the values. 26602d747510SLisandro Dalcin 26612d747510SLisandro Dalcin .seealso: PetscOptionsGetInt(), PetscOptionsHasName(), 26622d747510SLisandro Dalcin PetscOptionsGetString(), PetscOptionsGetRealArray(), PetscOptionsBool(), 26632d747510SLisandro Dalcin PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 26642d747510SLisandro Dalcin PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 26652d747510SLisandro Dalcin PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 26662d747510SLisandro Dalcin PetscOptionsFList(), PetscOptionsEList() 26672d747510SLisandro Dalcin @*/ 26682d747510SLisandro Dalcin PetscErrorCode PetscOptionsGetIntArray(PetscOptions options,const char pre[],const char name[],PetscInt ivalue[],PetscInt *nmax,PetscBool *set) 26692d747510SLisandro Dalcin { 26702d747510SLisandro Dalcin const char *svalue; 26712d747510SLisandro Dalcin char *value; 26722d747510SLisandro Dalcin PetscErrorCode ierr; 26732d747510SLisandro Dalcin PetscInt n = 0,i,j,start,end,inc,nvalues; 26742d747510SLisandro Dalcin size_t len; 26752d747510SLisandro Dalcin PetscBool flag,foundrange; 26762d747510SLisandro Dalcin PetscToken token; 26772d747510SLisandro Dalcin 26782d747510SLisandro Dalcin PetscFunctionBegin; 26792d747510SLisandro Dalcin PetscValidCharPointer(name,3); 26802d747510SLisandro Dalcin PetscValidIntPointer(ivalue,4); 26812d747510SLisandro Dalcin PetscValidIntPointer(nmax,5); 26822d747510SLisandro Dalcin 26832d747510SLisandro Dalcin ierr = PetscOptionsFindPair(options,pre,name,&svalue,&flag);CHKERRQ(ierr); 26842d747510SLisandro Dalcin if (!flag || !svalue) { if (set) *set = PETSC_FALSE; *nmax = 0; PetscFunctionReturn(0);} 26852d747510SLisandro Dalcin if (set) *set = PETSC_TRUE; 26862d747510SLisandro Dalcin ierr = PetscTokenCreate(svalue,',',&token);CHKERRQ(ierr); 26872d747510SLisandro Dalcin ierr = PetscTokenFind(token,&value);CHKERRQ(ierr); 26882d747510SLisandro Dalcin while (value && n < *nmax) { 26892d747510SLisandro Dalcin /* look for form d-D where d and D are integers */ 26902d747510SLisandro Dalcin foundrange = PETSC_FALSE; 26912d747510SLisandro Dalcin ierr = PetscStrlen(value,&len);CHKERRQ(ierr); 26922d747510SLisandro Dalcin if (value[0] == '-') i=2; 26932d747510SLisandro Dalcin else i=1; 26942d747510SLisandro Dalcin for (;i<(int)len; i++) { 26952d747510SLisandro Dalcin if (value[i] == '-') { 26962d747510SLisandro Dalcin if (i == (int)len-1) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_USER,"Error in %D-th array entry %s\n",n,value); 26972d747510SLisandro Dalcin value[i] = 0; 26982d747510SLisandro Dalcin 26992d747510SLisandro Dalcin ierr = PetscOptionsStringToInt(value,&start);CHKERRQ(ierr); 27002d747510SLisandro Dalcin inc = 1; 27012d747510SLisandro Dalcin j = i+1; 27022d747510SLisandro Dalcin for (;j<(int)len; j++) { 27032d747510SLisandro Dalcin if (value[j] == ':') { 27042d747510SLisandro Dalcin value[j] = 0; 27052d747510SLisandro Dalcin 27062d747510SLisandro Dalcin ierr = PetscOptionsStringToInt(value+j+1,&inc);CHKERRQ(ierr); 27072d747510SLisandro 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); 27082d747510SLisandro Dalcin break; 27092d747510SLisandro Dalcin } 27102d747510SLisandro Dalcin } 27112d747510SLisandro Dalcin ierr = PetscOptionsStringToInt(value+i+1,&end);CHKERRQ(ierr); 27122d747510SLisandro 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); 27132d747510SLisandro Dalcin nvalues = (end-start)/inc + (end-start)%inc; 27142d747510SLisandro 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); 27152d747510SLisandro Dalcin for (;start<end; start+=inc) { 27162d747510SLisandro Dalcin *ivalue = start; ivalue++;n++; 27172d747510SLisandro Dalcin } 27182d747510SLisandro Dalcin foundrange = PETSC_TRUE; 27192d747510SLisandro Dalcin break; 27202d747510SLisandro Dalcin } 27212d747510SLisandro Dalcin } 27222d747510SLisandro Dalcin if (!foundrange) { 27232d747510SLisandro Dalcin ierr = PetscOptionsStringToInt(value,ivalue);CHKERRQ(ierr); 27242d747510SLisandro Dalcin ivalue++; 27252d747510SLisandro Dalcin n++; 27262d747510SLisandro Dalcin } 27272d747510SLisandro Dalcin ierr = PetscTokenFind(token,&value);CHKERRQ(ierr); 27282d747510SLisandro Dalcin } 27292d747510SLisandro Dalcin ierr = PetscTokenDestroy(&token);CHKERRQ(ierr); 27302d747510SLisandro Dalcin *nmax = n; 27312d747510SLisandro Dalcin PetscFunctionReturn(0); 27322d747510SLisandro Dalcin } 27332d747510SLisandro Dalcin 27342d747510SLisandro Dalcin /*@C 27352d747510SLisandro Dalcin PetscOptionsGetRealArray - Gets an array of double precision values for a 27362d747510SLisandro Dalcin particular option in the database. The values must be separated with 27372d747510SLisandro Dalcin commas with no intervening spaces. 27382d747510SLisandro Dalcin 27392d747510SLisandro Dalcin Not Collective 27402d747510SLisandro Dalcin 27412d747510SLisandro Dalcin Input Parameters: 27422d747510SLisandro Dalcin + options - options database, use NULL for default global database 27432d747510SLisandro Dalcin . pre - string to prepend to each name or NULL 27442d747510SLisandro Dalcin . name - the option one is seeking 27452d747510SLisandro Dalcin - nmax - maximum number of values to retrieve 27462d747510SLisandro Dalcin 27472d747510SLisandro Dalcin Output Parameters: 27482d747510SLisandro Dalcin + dvalue - the double values to return 27492d747510SLisandro Dalcin . nmax - actual number of values retreived 27502d747510SLisandro Dalcin - set - PETSC_TRUE if found, else PETSC_FALSE 27512d747510SLisandro Dalcin 27522d747510SLisandro Dalcin Level: beginner 27532d747510SLisandro Dalcin 27542d747510SLisandro Dalcin .seealso: PetscOptionsGetInt(), PetscOptionsHasName(), 27552d747510SLisandro Dalcin PetscOptionsGetString(), PetscOptionsGetIntArray(), PetscOptionsBool(), 27562d747510SLisandro Dalcin PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 27572d747510SLisandro Dalcin PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 27582d747510SLisandro Dalcin PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 27592d747510SLisandro Dalcin PetscOptionsFList(), PetscOptionsEList() 27602d747510SLisandro Dalcin @*/ 27612d747510SLisandro Dalcin PetscErrorCode PetscOptionsGetRealArray(PetscOptions options,const char pre[],const char name[],PetscReal dvalue[],PetscInt *nmax,PetscBool *set) 27622d747510SLisandro Dalcin { 27632d747510SLisandro Dalcin const char *svalue; 27642d747510SLisandro Dalcin char *value; 27652d747510SLisandro Dalcin PetscErrorCode ierr; 27662d747510SLisandro Dalcin PetscInt n = 0; 27672d747510SLisandro Dalcin PetscBool flag; 27682d747510SLisandro Dalcin PetscToken token; 27692d747510SLisandro Dalcin 27702d747510SLisandro Dalcin PetscFunctionBegin; 27712d747510SLisandro Dalcin PetscValidCharPointer(name,3); 27722d747510SLisandro Dalcin PetscValidRealPointer(dvalue,4); 27732d747510SLisandro Dalcin PetscValidIntPointer(nmax,5); 27742d747510SLisandro Dalcin 27752d747510SLisandro Dalcin ierr = PetscOptionsFindPair(options,pre,name,&svalue,&flag);CHKERRQ(ierr); 27762d747510SLisandro Dalcin if (!flag || !svalue) { if (set) *set = PETSC_FALSE; *nmax = 0; PetscFunctionReturn(0);} 27772d747510SLisandro Dalcin if (set) *set = PETSC_TRUE; 27782d747510SLisandro Dalcin ierr = PetscTokenCreate(svalue,',',&token);CHKERRQ(ierr); 27792d747510SLisandro Dalcin ierr = PetscTokenFind(token,&value);CHKERRQ(ierr); 27802d747510SLisandro Dalcin while (value && n < *nmax) { 27812d747510SLisandro Dalcin ierr = PetscOptionsStringToReal(value,dvalue++);CHKERRQ(ierr); 27822d747510SLisandro Dalcin ierr = PetscTokenFind(token,&value);CHKERRQ(ierr); 27832d747510SLisandro Dalcin n++; 27842d747510SLisandro Dalcin } 27852d747510SLisandro Dalcin ierr = PetscTokenDestroy(&token);CHKERRQ(ierr); 27862d747510SLisandro Dalcin *nmax = n; 27872d747510SLisandro Dalcin PetscFunctionReturn(0); 27882d747510SLisandro Dalcin } 27892d747510SLisandro Dalcin 27902d747510SLisandro Dalcin /*@C 27912d747510SLisandro Dalcin PetscOptionsGetScalarArray - Gets an array of scalars for a 27922d747510SLisandro Dalcin particular option in the database. The values must be separated with 27932d747510SLisandro Dalcin commas with no intervening spaces. 27942d747510SLisandro Dalcin 27952d747510SLisandro Dalcin Not Collective 27962d747510SLisandro Dalcin 27972d747510SLisandro Dalcin Input Parameters: 27982d747510SLisandro Dalcin + options - options database, use NULL for default global database 27992d747510SLisandro Dalcin . pre - string to prepend to each name or NULL 28002d747510SLisandro Dalcin . name - the option one is seeking 28012d747510SLisandro Dalcin - nmax - maximum number of values to retrieve 28022d747510SLisandro Dalcin 28032d747510SLisandro Dalcin Output Parameters: 28042d747510SLisandro Dalcin + dvalue - the scalar values to return 28052d747510SLisandro Dalcin . nmax - actual number of values retreived 28062d747510SLisandro Dalcin - set - PETSC_TRUE if found, else PETSC_FALSE 28072d747510SLisandro Dalcin 28082d747510SLisandro Dalcin Level: beginner 28092d747510SLisandro Dalcin 28102d747510SLisandro Dalcin .seealso: PetscOptionsGetInt(), PetscOptionsHasName(), 28112d747510SLisandro Dalcin PetscOptionsGetString(), PetscOptionsGetIntArray(), PetscOptionsBool(), 28122d747510SLisandro Dalcin PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 28132d747510SLisandro Dalcin PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 28142d747510SLisandro Dalcin PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 28152d747510SLisandro Dalcin PetscOptionsFList(), PetscOptionsEList() 28162d747510SLisandro Dalcin @*/ 28172d747510SLisandro Dalcin PetscErrorCode PetscOptionsGetScalarArray(PetscOptions options,const char pre[],const char name[],PetscScalar dvalue[],PetscInt *nmax,PetscBool *set) 28182d747510SLisandro Dalcin { 28192d747510SLisandro Dalcin const char *svalue; 28202d747510SLisandro Dalcin char *value; 28212d747510SLisandro Dalcin PetscErrorCode ierr; 28222d747510SLisandro Dalcin PetscInt n = 0; 28232d747510SLisandro Dalcin PetscBool flag; 28242d747510SLisandro Dalcin PetscToken token; 28252d747510SLisandro Dalcin 28262d747510SLisandro Dalcin PetscFunctionBegin; 28272d747510SLisandro Dalcin PetscValidCharPointer(name,3); 28282d747510SLisandro Dalcin PetscValidRealPointer(dvalue,4); 28292d747510SLisandro Dalcin PetscValidIntPointer(nmax,5); 28302d747510SLisandro Dalcin 28312d747510SLisandro Dalcin ierr = PetscOptionsFindPair(options,pre,name,&svalue,&flag);CHKERRQ(ierr); 28322d747510SLisandro Dalcin if (!flag || !svalue) { if (set) *set = PETSC_FALSE; *nmax = 0; PetscFunctionReturn(0);} 28332d747510SLisandro Dalcin if (set) *set = PETSC_TRUE; 28342d747510SLisandro Dalcin ierr = PetscTokenCreate(svalue,',',&token);CHKERRQ(ierr); 28352d747510SLisandro Dalcin ierr = PetscTokenFind(token,&value);CHKERRQ(ierr); 28362d747510SLisandro Dalcin while (value && n < *nmax) { 28372d747510SLisandro Dalcin ierr = PetscOptionsStringToScalar(value,dvalue++);CHKERRQ(ierr); 28382d747510SLisandro Dalcin ierr = PetscTokenFind(token,&value);CHKERRQ(ierr); 28392d747510SLisandro Dalcin n++; 28402d747510SLisandro Dalcin } 28412d747510SLisandro Dalcin ierr = PetscTokenDestroy(&token);CHKERRQ(ierr); 28422d747510SLisandro Dalcin *nmax = n; 28432d747510SLisandro Dalcin PetscFunctionReturn(0); 28442d747510SLisandro Dalcin } 284514ce751eSBarry Smith 2846e5c89e4eSSatish Balay /*@C 2847e5c89e4eSSatish Balay PetscOptionsGetStringArray - Gets an array of string values for a particular 2848e5c89e4eSSatish Balay option in the database. The values must be separated with commas with 2849e5c89e4eSSatish Balay no intervening spaces. 2850e5c89e4eSSatish Balay 2851e5c89e4eSSatish Balay Not Collective 2852e5c89e4eSSatish Balay 2853e5c89e4eSSatish Balay Input Parameters: 28545c9cc608SHong Zhang + options - options database, use NULL for default global database 2855c5929fdfSBarry Smith . pre - string to prepend to name or NULL 2856e5c89e4eSSatish Balay . name - the option one is seeking 2857e5c89e4eSSatish Balay - nmax - maximum number of strings 2858e5c89e4eSSatish Balay 2859e5c89e4eSSatish Balay Output Parameter: 2860e5c89e4eSSatish Balay + strings - location to copy strings 286196ef3cdfSSatish Balay - set - PETSC_TRUE if found, else PETSC_FALSE 2862e5c89e4eSSatish Balay 2863e5c89e4eSSatish Balay Level: beginner 2864e5c89e4eSSatish Balay 2865e5c89e4eSSatish Balay Notes: 2866e5c89e4eSSatish Balay The user should pass in an array of pointers to char, to hold all the 2867e5c89e4eSSatish Balay strings returned by this function. 2868e5c89e4eSSatish Balay 2869e5c89e4eSSatish Balay The user is responsible for deallocating the strings that are 2870e5c89e4eSSatish Balay returned. The Fortran interface for this routine is not supported. 2871e5c89e4eSSatish Balay 2872e5c89e4eSSatish Balay .seealso: PetscOptionsGetInt(), PetscOptionsGetReal(), 2873acfcf0e5SJed Brown PetscOptionsHasName(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool(), 2874e5c89e4eSSatish Balay PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 2875e5c89e4eSSatish Balay PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 2876acfcf0e5SJed Brown PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 2877a264d7a6SBarry Smith PetscOptionsFList(), PetscOptionsEList() 2878e5c89e4eSSatish Balay @*/ 2879c5929fdfSBarry Smith PetscErrorCode PetscOptionsGetStringArray(PetscOptions options,const char pre[],const char name[],char *strings[],PetscInt *nmax,PetscBool *set) 2880e5c89e4eSSatish Balay { 28812d747510SLisandro Dalcin const char *svalue; 2882e5c89e4eSSatish Balay char *value; 2883e5c89e4eSSatish Balay PetscErrorCode ierr; 28842d747510SLisandro Dalcin PetscInt n = 0; 2885ace3abfcSBarry Smith PetscBool flag; 28869c9d3cfdSBarry Smith PetscToken token; 2887e5c89e4eSSatish Balay 2888e5c89e4eSSatish Balay PetscFunctionBegin; 28892d747510SLisandro Dalcin PetscValidCharPointer(name,3); 28902d747510SLisandro Dalcin PetscValidPointer(strings,4); 28912d747510SLisandro Dalcin PetscValidIntPointer(nmax,5); 2892e5c89e4eSSatish Balay 28932d747510SLisandro Dalcin ierr = PetscOptionsFindPair(options,pre,name,&svalue,&flag);CHKERRQ(ierr); 28942d747510SLisandro Dalcin if (!flag || !svalue) { if (set) *set = PETSC_FALSE; *nmax = 0; PetscFunctionReturn(0);} 28952d747510SLisandro Dalcin if (set) *set = PETSC_TRUE; 28962d747510SLisandro Dalcin ierr = PetscTokenCreate(svalue,',',&token);CHKERRQ(ierr); 2897e5c89e4eSSatish Balay ierr = PetscTokenFind(token,&value);CHKERRQ(ierr); 28982d747510SLisandro Dalcin while (value && n < *nmax) { 2899e5c89e4eSSatish Balay ierr = PetscStrallocpy(value,&strings[n]);CHKERRQ(ierr); 2900e5c89e4eSSatish Balay ierr = PetscTokenFind(token,&value);CHKERRQ(ierr); 2901e5c89e4eSSatish Balay n++; 2902e5c89e4eSSatish Balay } 29038c74ee41SBarry Smith ierr = PetscTokenDestroy(&token);CHKERRQ(ierr); 2904e5c89e4eSSatish Balay *nmax = n; 2905e5c89e4eSSatish Balay PetscFunctionReturn(0); 2906e5c89e4eSSatish Balay } 290706824ed3SPatrick Sanan 290806824ed3SPatrick Sanan /*@C 290906824ed3SPatrick Sanan PetscOptionsDeprecated - mark an option as deprecated, optionally replacing it with a new one 291006824ed3SPatrick Sanan 291106824ed3SPatrick Sanan Prints a deprecation warning, unless an option is supplied to suppress. 291206824ed3SPatrick Sanan 29131c9f3c13SBarry Smith Logically Collective 291406824ed3SPatrick Sanan 291506824ed3SPatrick Sanan Input Parameters: 29169503aa97SPatrick Sanan + pre - string to prepend to name or NULL 291706824ed3SPatrick Sanan . oldname - the old, deprecated option 291806824ed3SPatrick Sanan . newname - the new option, or NULL if option is purely removed 29199f3a6782SPatrick Sanan . version - a string describing the version of first deprecation, e.g. "3.9" 29209f3a6782SPatrick Sanan - info - additional information string, or NULL. 292106824ed3SPatrick Sanan 292206824ed3SPatrick Sanan Options Database Keys: 292306824ed3SPatrick Sanan . -options_suppress_deprecated_warnings - do not print deprecation warnings 292406824ed3SPatrick Sanan 292506824ed3SPatrick Sanan Notes: 29261c9f3c13SBarry Smith Must be called between PetscOptionsBegin() (or PetscObjectOptionsBegin()) and PetscOptionsEnd(). 29271c9f3c13SBarry Smith Only the proces of rank zero that owns the PetscOptionsItems are argument (managed by PetscOptionsBegin() or 29281c9f3c13SBarry Smith PetscObjectOptionsBegin() prints the information 2929b40114eaSPatrick Sanan If newname is provided, the old option is replaced. Otherwise, it remains 2930b40114eaSPatrick Sanan in the options database. 29319f3a6782SPatrick Sanan If an option is not replaced, the info argument should be used to advise the user 29329f3a6782SPatrick Sanan on how to proceed. 29339f3a6782SPatrick Sanan There is a limit on the length of the warning printed, so very long strings 29349f3a6782SPatrick Sanan provided as info may be truncated. 293506824ed3SPatrick Sanan 293606824ed3SPatrick Sanan Level: developer 293706824ed3SPatrick Sanan 293806824ed3SPatrick Sanan .seealso: PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsScalar(), PetscOptionsBool(), PetscOptionsString(), PetscOptionsSetValue() 293906824ed3SPatrick Sanan 294006824ed3SPatrick Sanan @*/ 29419f3a6782SPatrick Sanan PetscErrorCode PetscOptionsDeprecated_Private(PetscOptionItems *PetscOptionsObject,const char oldname[],const char newname[],const char version[],const char info[]) 294206824ed3SPatrick Sanan { 294306824ed3SPatrick Sanan PetscErrorCode ierr; 294406824ed3SPatrick Sanan PetscBool found,quiet; 294506824ed3SPatrick Sanan const char *value; 294606824ed3SPatrick Sanan const char * const quietopt="-options_suppress_deprecated_warnings"; 29479f3a6782SPatrick Sanan char msg[4096]; 2948b0bdc838SStefano Zampini char *prefix = NULL; 2949b0bdc838SStefano Zampini PetscOptions options = NULL; 2950b0bdc838SStefano Zampini MPI_Comm comm = PETSC_COMM_SELF; 295106824ed3SPatrick Sanan 295206824ed3SPatrick Sanan PetscFunctionBegin; 295306824ed3SPatrick Sanan PetscValidCharPointer(oldname,2); 295406824ed3SPatrick Sanan PetscValidCharPointer(version,4); 2955b0bdc838SStefano Zampini if (PetscOptionsObject) { 2956b0bdc838SStefano Zampini prefix = PetscOptionsObject->prefix; 2957b0bdc838SStefano Zampini options = PetscOptionsObject->options; 2958b0bdc838SStefano Zampini comm = PetscOptionsObject->comm; 2959b0bdc838SStefano Zampini } 2960b0bdc838SStefano Zampini ierr = PetscOptionsFindPair(options,prefix,oldname,&value,&found);CHKERRQ(ierr); 296106824ed3SPatrick Sanan if (found) { 296206824ed3SPatrick Sanan if (newname) { 2963b0bdc838SStefano Zampini if (prefix) { 2964b0bdc838SStefano Zampini ierr = PetscOptionsPrefixPush(options,prefix);CHKERRQ(ierr); 2965d255429eSPatrick Sanan } 2966b0bdc838SStefano Zampini ierr = PetscOptionsSetValue(options,newname,value);CHKERRQ(ierr); 2967b0bdc838SStefano Zampini if (prefix) { 2968b0bdc838SStefano Zampini ierr = PetscOptionsPrefixPop(options);CHKERRQ(ierr); 2969d255429eSPatrick Sanan } 2970b0bdc838SStefano Zampini ierr = PetscOptionsClearValue(options,oldname);CHKERRQ(ierr); 2971b40114eaSPatrick Sanan } 297206824ed3SPatrick Sanan quiet = PETSC_FALSE; 2973b0bdc838SStefano Zampini ierr = PetscOptionsGetBool(options,NULL,quietopt,&quiet,NULL);CHKERRQ(ierr); 297406824ed3SPatrick Sanan if (!quiet) { 29759f3a6782SPatrick Sanan ierr = PetscStrcpy(msg,"** PETSc DEPRECATION WARNING ** : the option ");CHKERRQ(ierr); 29761fa95f81SSatish Balay ierr = PetscStrcat(msg,oldname);CHKERRQ(ierr); 2977928bb9adSStefano Zampini ierr = PetscStrcat(msg," is deprecated as of version ");CHKERRQ(ierr); 29789f3a6782SPatrick Sanan ierr = PetscStrcat(msg,version);CHKERRQ(ierr); 29799f3a6782SPatrick Sanan ierr = PetscStrcat(msg," and will be removed in a future release.");CHKERRQ(ierr); 298006824ed3SPatrick Sanan if (newname) { 29819f3a6782SPatrick Sanan ierr = PetscStrcat(msg," Please use the option ");CHKERRQ(ierr); 29829f3a6782SPatrick Sanan ierr = PetscStrcat(msg,newname);CHKERRQ(ierr); 29839f3a6782SPatrick Sanan ierr = PetscStrcat(msg," instead.");CHKERRQ(ierr); 298406824ed3SPatrick Sanan } 29859f3a6782SPatrick Sanan if (info) { 29869f3a6782SPatrick Sanan ierr = PetscStrcat(msg," ");CHKERRQ(ierr); 29879f3a6782SPatrick Sanan ierr = PetscStrcat(msg,info);CHKERRQ(ierr); 29889f3a6782SPatrick Sanan } 29899f3a6782SPatrick Sanan ierr = PetscStrcat(msg," (Silence this warning with ");CHKERRQ(ierr); 29909f3a6782SPatrick Sanan ierr = PetscStrcat(msg,quietopt);CHKERRQ(ierr); 29919f3a6782SPatrick Sanan ierr = PetscStrcat(msg,")\n");CHKERRQ(ierr); 2992b0bdc838SStefano Zampini ierr = PetscPrintf(comm,msg);CHKERRQ(ierr); 299306824ed3SPatrick Sanan } 299406824ed3SPatrick Sanan } 299506824ed3SPatrick Sanan PetscFunctionReturn(0); 299606824ed3SPatrick Sanan } 2997