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; 4237c43ebc8SBarry Smith char cmt[1]={'#'},*cmatch; 4243a018368SJed Brown PetscMPIInt rank,cnt=0,acnt=0,counts[2]; 425ad38b122SPatrick Sanan PetscBool isdir; 426e5c89e4eSSatish Balay 427e5c89e4eSSatish Balay PetscFunctionBegin; 42805c7dedfSBarry Smith ierr = MPI_Comm_rank(comm,&rank);CHKERRQ(ierr); 42905c7dedfSBarry Smith if (!rank) { 43066af5158SSatish Balay cnt = 0; 43166af5158SSatish Balay acnt = 0; 43205c7dedfSBarry Smith 433e5c89e4eSSatish Balay ierr = PetscFixFilename(file,fname);CHKERRQ(ierr); 434e5c89e4eSSatish Balay fd = fopen(fname,"r"); 435ad38b122SPatrick Sanan ierr = PetscTestDirectory(fname,'r',&isdir);CHKERRQ(ierr); 436ad38b122SPatrick Sanan if (isdir && require) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_USER,"Specified options file %s is a directory",fname); 437ad38b122SPatrick Sanan if (fd && !isdir) { 4383a018368SJed Brown PetscSegBuffer vseg,aseg; 4393a018368SJed Brown ierr = PetscSegBufferCreate(1,4000,&vseg);CHKERRQ(ierr); 4403a018368SJed Brown ierr = PetscSegBufferCreate(1,2000,&aseg);CHKERRQ(ierr); 4413a018368SJed Brown 4429b754dc9SBarry Smith /* the following line will not work when opening initial files (like .petscrc) since info is not yet set */ 44302c9f0b5SLisandro Dalcin ierr = PetscInfo1(NULL,"Opened options file %s\n",file);CHKERRQ(ierr); 444e24ecc5dSJed Brown 4455fa91da5SBarry Smith while ((string = Petscgetline(fd))) { 4464704e885SBarry Smith /* eliminate comments from each line */ 4477c43ebc8SBarry Smith for (i=0; i<1; i++) { 448a2ea699eSBarry Smith ierr = PetscStrchr(string,cmt[i],&cmatch);CHKERRQ(ierr); 44990f79514SSatish Balay if (cmatch) *cmatch = 0; 45090f79514SSatish Balay } 451e5c89e4eSSatish Balay ierr = PetscStrlen(string,&len);CHKERRQ(ierr); 4525981331cSSatish Balay /* replace tabs, ^M, \n with " " */ 453e5c89e4eSSatish Balay for (i=0; i<len; i++) { 4545981331cSSatish Balay if (string[i] == '\t' || string[i] == '\r' || string[i] == '\n') { 455e5c89e4eSSatish Balay string[i] = ' '; 456e5c89e4eSSatish Balay } 457e5c89e4eSSatish Balay } 45890f79514SSatish Balay ierr = PetscTokenCreate(string,' ',&token);CHKERRQ(ierr); 459e5c89e4eSSatish Balay ierr = PetscTokenFind(token,&first);CHKERRQ(ierr); 46090f79514SSatish Balay if (!first) { 46102b0d46eSSatish Balay goto destroy; 46290f79514SSatish Balay } else if (!first[0]) { /* if first token is empty spaces, redo first token */ 46390f79514SSatish Balay ierr = PetscTokenFind(token,&first);CHKERRQ(ierr); 46490f79514SSatish Balay } 465e5c89e4eSSatish Balay ierr = PetscTokenFind(token,&second);CHKERRQ(ierr); 4662662f744SSatish Balay if (!first) { 4672662f744SSatish Balay goto destroy; 4682662f744SSatish Balay } else if (first[0] == '-') { 469e24ecc5dSJed Brown ierr = PetscStrlen(first,&len);CHKERRQ(ierr); 47013e3f751SJed Brown ierr = PetscSegBufferGet(vseg,len+1,&vstring);CHKERRQ(ierr); 471580bdb30SBarry Smith ierr = PetscArraycpy(vstring,first,len);CHKERRQ(ierr); 472e24ecc5dSJed Brown vstring[len] = ' '; 47309192fe3SBarry Smith if (second) { 474e24ecc5dSJed Brown ierr = PetscStrlen(second,&len);CHKERRQ(ierr); 47513e3f751SJed Brown ierr = PetscSegBufferGet(vseg,len+3,&vstring);CHKERRQ(ierr); 476e24ecc5dSJed Brown vstring[0] = '"'; 477580bdb30SBarry Smith ierr = PetscArraycpy(vstring+1,second,len);CHKERRQ(ierr); 478e24ecc5dSJed Brown vstring[len+1] = '"'; 479e24ecc5dSJed Brown vstring[len+2] = ' '; 48009192fe3SBarry Smith } 48190f79514SSatish Balay } else { 482ace3abfcSBarry Smith PetscBool match; 483e5c89e4eSSatish Balay 484e5c89e4eSSatish Balay ierr = PetscStrcasecmp(first,"alias",&match);CHKERRQ(ierr); 485e5c89e4eSSatish Balay if (match) { 486e5c89e4eSSatish Balay ierr = PetscTokenFind(token,&third);CHKERRQ(ierr); 487e32f2f54SBarry Smith if (!third) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Error in options file:alias missing (%s)",second); 488e24ecc5dSJed Brown ierr = PetscStrlen(second,&len);CHKERRQ(ierr); 48913e3f751SJed Brown ierr = PetscSegBufferGet(aseg,len+1,&astring);CHKERRQ(ierr); 490580bdb30SBarry Smith ierr = PetscArraycpy(astring,second,len);CHKERRQ(ierr); 491e24ecc5dSJed Brown astring[len] = ' '; 492e24ecc5dSJed Brown 493e24ecc5dSJed Brown ierr = PetscStrlen(third,&len);CHKERRQ(ierr); 49413e3f751SJed Brown ierr = PetscSegBufferGet(aseg,len+1,&astring);CHKERRQ(ierr); 495580bdb30SBarry Smith ierr = PetscArraycpy(astring,third,len);CHKERRQ(ierr); 496e24ecc5dSJed Brown astring[len] = ' '; 497f23aa3ddSBarry Smith } else SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Unknown statement in options file: (%s)",string); 498e5c89e4eSSatish Balay } 49902b0d46eSSatish Balay destroy: 5004b40f50bSBarry Smith free(string); 5018c74ee41SBarry Smith ierr = PetscTokenDestroy(&token);CHKERRQ(ierr); 502e5c89e4eSSatish Balay } 503ed9cf6e9SBarry Smith err = fclose(fd); 504e32f2f54SBarry Smith if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fclose() failed on file"); 505e24ecc5dSJed Brown ierr = PetscSegBufferGetSize(aseg,&bytes);CHKERRQ(ierr); /* size without null termination */ 506e24ecc5dSJed Brown ierr = PetscMPIIntCast(bytes,&acnt);CHKERRQ(ierr); 507e24ecc5dSJed Brown ierr = PetscSegBufferGet(aseg,1,&astring);CHKERRQ(ierr); 508e24ecc5dSJed Brown astring[0] = 0; 509e24ecc5dSJed Brown ierr = PetscSegBufferGetSize(vseg,&bytes);CHKERRQ(ierr); /* size without null termination */ 510e24ecc5dSJed Brown ierr = PetscMPIIntCast(bytes,&cnt);CHKERRQ(ierr); 511e24ecc5dSJed Brown ierr = PetscSegBufferGet(vseg,1,&vstring);CHKERRQ(ierr); 512e24ecc5dSJed Brown vstring[0] = 0; 513854ce69bSBarry Smith ierr = PetscMalloc1(2+acnt+cnt,&packed);CHKERRQ(ierr); 5143a018368SJed Brown ierr = PetscSegBufferExtractTo(aseg,packed);CHKERRQ(ierr); 5153a018368SJed Brown ierr = PetscSegBufferExtractTo(vseg,packed+acnt+1);CHKERRQ(ierr); 5163a018368SJed Brown ierr = PetscSegBufferDestroy(&aseg);CHKERRQ(ierr); 5173a018368SJed Brown ierr = PetscSegBufferDestroy(&vseg);CHKERRQ(ierr); 518f23aa3ddSBarry Smith } else if (require) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_USER,"Unable to open Options File %s",fname); 5199b754dc9SBarry Smith } 52005c7dedfSBarry Smith 5213a018368SJed Brown counts[0] = acnt; 5223a018368SJed Brown counts[1] = cnt; 5233a018368SJed Brown ierr = MPI_Bcast(counts,2,MPI_INT,0,comm);CHKERRQ(ierr); 5243a018368SJed Brown acnt = counts[0]; 5253a018368SJed Brown cnt = counts[1]; 5263a018368SJed Brown if (rank) { 527854ce69bSBarry Smith ierr = PetscMalloc1(2+acnt+cnt,&packed);CHKERRQ(ierr); 5283a018368SJed Brown } 5293a018368SJed Brown if (acnt || cnt) { 5303a018368SJed Brown ierr = MPI_Bcast(packed,2+acnt+cnt,MPI_CHAR,0,comm);CHKERRQ(ierr); 5313a018368SJed Brown astring = packed; 5323a018368SJed Brown vstring = packed + acnt + 1; 5333a018368SJed Brown } 5343a018368SJed Brown 5359b754dc9SBarry Smith if (acnt) { 5369b754dc9SBarry Smith PetscToken token; 5379b754dc9SBarry Smith char *first,*second; 5389b754dc9SBarry Smith 5399b754dc9SBarry Smith ierr = PetscTokenCreate(astring,' ',&token);CHKERRQ(ierr); 5409b754dc9SBarry Smith ierr = PetscTokenFind(token,&first);CHKERRQ(ierr); 5419b754dc9SBarry Smith while (first) { 5429b754dc9SBarry Smith ierr = PetscTokenFind(token,&second);CHKERRQ(ierr); 543c5929fdfSBarry Smith ierr = PetscOptionsSetAlias(options,first,second);CHKERRQ(ierr); 5449b754dc9SBarry Smith ierr = PetscTokenFind(token,&first);CHKERRQ(ierr); 5459b754dc9SBarry Smith } 5468c74ee41SBarry Smith ierr = PetscTokenDestroy(&token);CHKERRQ(ierr); 5479b754dc9SBarry Smith } 5489b754dc9SBarry Smith 5499b754dc9SBarry Smith if (cnt) { 550c5929fdfSBarry Smith ierr = PetscOptionsInsertString(options,vstring);CHKERRQ(ierr); 551e5c89e4eSSatish Balay } 5523a018368SJed Brown ierr = PetscFree(packed);CHKERRQ(ierr); 553e5c89e4eSSatish Balay PetscFunctionReturn(0); 554e5c89e4eSSatish Balay } 555e5c89e4eSSatish Balay 5562d747510SLisandro Dalcin static PetscErrorCode PetscOptionsInsertArgs(PetscOptions options,int argc,char *args[]) 55785079163SJed Brown { 55885079163SJed Brown PetscErrorCode ierr; 55985079163SJed Brown int left = argc - 1; 56085079163SJed Brown char **eargs = args + 1; 56185079163SJed Brown 56285079163SJed Brown PetscFunctionBegin; 56385079163SJed Brown while (left) { 564093de6efSBarry Smith PetscBool isoptions_file,isprefixpush,isprefixpop,isp4,tisp4,isp4yourname,isp4rmrank,key; 56585079163SJed Brown ierr = PetscStrcasecmp(eargs[0],"-options_file",&isoptions_file);CHKERRQ(ierr); 5669db968c8SJed Brown ierr = PetscStrcasecmp(eargs[0],"-prefix_push",&isprefixpush);CHKERRQ(ierr); 5679db968c8SJed Brown ierr = PetscStrcasecmp(eargs[0],"-prefix_pop",&isprefixpop);CHKERRQ(ierr); 56885079163SJed Brown ierr = PetscStrcasecmp(eargs[0],"-p4pg",&isp4);CHKERRQ(ierr); 56985079163SJed Brown ierr = PetscStrcasecmp(eargs[0],"-p4yourname",&isp4yourname);CHKERRQ(ierr); 57085079163SJed Brown ierr = PetscStrcasecmp(eargs[0],"-p4rmrank",&isp4rmrank);CHKERRQ(ierr); 57185079163SJed Brown ierr = PetscStrcasecmp(eargs[0],"-p4wd",&tisp4);CHKERRQ(ierr); 572ace3abfcSBarry Smith isp4 = (PetscBool) (isp4 || tisp4); 57385079163SJed Brown ierr = PetscStrcasecmp(eargs[0],"-np",&tisp4);CHKERRQ(ierr); 574ace3abfcSBarry Smith isp4 = (PetscBool) (isp4 || tisp4); 57585079163SJed Brown ierr = PetscStrcasecmp(eargs[0],"-p4amslave",&tisp4);CHKERRQ(ierr); 576093de6efSBarry Smith ierr = PetscOptionsValidKey(eargs[0],&key);CHKERRQ(ierr); 57785079163SJed Brown 578093de6efSBarry Smith if (!key) { 57985079163SJed Brown eargs++; left--; 58085079163SJed Brown } else if (isoptions_file) { 58185079163SJed Brown if (left <= 1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_USER,"Missing filename for -options_file filename option"); 58285079163SJed Brown if (eargs[1][0] == '-') SETERRQ(PETSC_COMM_SELF,PETSC_ERR_USER,"Missing filename for -options_file filename option"); 583c5929fdfSBarry Smith ierr = PetscOptionsInsertFile(PETSC_COMM_WORLD,options,eargs[1],PETSC_TRUE);CHKERRQ(ierr); 58485079163SJed Brown eargs += 2; left -= 2; 5859db968c8SJed Brown } else if (isprefixpush) { 5869db968c8SJed Brown if (left <= 1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_USER,"Missing prefix for -prefix_push option"); 5879db968c8SJed Brown if (eargs[1][0] == '-') SETERRQ(PETSC_COMM_SELF,PETSC_ERR_USER,"Missing prefix for -prefix_push option (prefixes cannot start with '-')"); 588c5929fdfSBarry Smith ierr = PetscOptionsPrefixPush(options,eargs[1]);CHKERRQ(ierr); 5899db968c8SJed Brown eargs += 2; left -= 2; 5909db968c8SJed Brown } else if (isprefixpop) { 591c5929fdfSBarry Smith ierr = PetscOptionsPrefixPop(options);CHKERRQ(ierr); 5929db968c8SJed Brown eargs++; left--; 59385079163SJed Brown 59485079163SJed Brown /* 59585079163SJed Brown These are "bad" options that MPICH, etc put on the command line 59685079163SJed Brown we strip them out here. 59785079163SJed Brown */ 59885079163SJed Brown } else if (tisp4 || isp4rmrank) { 59985079163SJed Brown eargs += 1; left -= 1; 60085079163SJed Brown } else if (isp4 || isp4yourname) { 60185079163SJed Brown eargs += 2; left -= 2; 6027935c3d8SJed Brown } else { 6037935c3d8SJed Brown PetscBool nextiskey = PETSC_FALSE; 6047935c3d8SJed Brown if (left >= 2) {ierr = PetscOptionsValidKey(eargs[1],&nextiskey);CHKERRQ(ierr);} 60598b6bf53SJed Brown if (left < 2 || nextiskey) { 606c5929fdfSBarry Smith ierr = PetscOptionsSetValue(options,eargs[0],NULL);CHKERRQ(ierr); 60785079163SJed Brown eargs++; left--; 60885079163SJed Brown } else { 609c5929fdfSBarry Smith ierr = PetscOptionsSetValue(options,eargs[0],eargs[1]);CHKERRQ(ierr); 61085079163SJed Brown eargs += 2; left -= 2; 61185079163SJed Brown } 61285079163SJed Brown } 6137935c3d8SJed Brown } 61485079163SJed Brown PetscFunctionReturn(0); 61585079163SJed Brown } 61685079163SJed Brown 61785079163SJed Brown 618e5c89e4eSSatish Balay /*@C 619e5c89e4eSSatish Balay PetscOptionsInsert - Inserts into the options database from the command line, 620e5c89e4eSSatish Balay the environmental variable and a file. 621e5c89e4eSSatish Balay 6221c9f3c13SBarry Smith Collective on PETSC_COMM_WORLD 6231c9f3c13SBarry Smith 624e5c89e4eSSatish Balay Input Parameters: 625c5929fdfSBarry Smith + options - options database or NULL for the default global database 626c5929fdfSBarry Smith . argc - count of number of command line arguments 627e5c89e4eSSatish Balay . args - the command line arguments 628e5c89e4eSSatish Balay - file - optional filename, defaults to ~username/.petscrc 629e5c89e4eSSatish Balay 630e5c89e4eSSatish Balay Note: 631e5c89e4eSSatish Balay Since PetscOptionsInsert() is automatically called by PetscInitialize(), 632e5c89e4eSSatish Balay the user does not typically need to call this routine. PetscOptionsInsert() 633e5c89e4eSSatish Balay can be called several times, adding additional entries into the database. 634e5c89e4eSSatish Balay 635081c24baSBoyana Norris Options Database Keys: 636081c24baSBoyana Norris + -options_monitor <optional filename> - print options names and values as they are set 637a2b725a8SWilliam Gropp - -options_file <filename> - read options from a file 638081c24baSBoyana Norris 639e5c89e4eSSatish Balay Level: advanced 640e5c89e4eSSatish Balay 6412d747510SLisandro Dalcin .seealso: PetscOptionsDestroy(), PetscOptionsView(), PetscOptionsInsertString(), PetscOptionsInsertFile(), 64296fc60bcSBarry Smith PetscInitialize() 643e5c89e4eSSatish Balay @*/ 644c5929fdfSBarry Smith PetscErrorCode PetscOptionsInsert(PetscOptions options,int *argc,char ***args,const char file[]) 645e5c89e4eSSatish Balay { 646e5c89e4eSSatish Balay PetscErrorCode ierr; 647e5c89e4eSSatish Balay PetscMPIInt rank; 6482d747510SLisandro Dalcin char filename[PETSC_MAX_PATH_LEN]; 649ace3abfcSBarry Smith PetscBool flag = PETSC_FALSE; 650e5c89e4eSSatish Balay 6518dea33a6SBarry Smith 652e5c89e4eSSatish Balay PetscFunctionBegin; 653e5c89e4eSSatish Balay ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr); 654e5c89e4eSSatish Balay 6554b09e917SBarry Smith if (file && file[0]) { 6562d747510SLisandro Dalcin ierr = PetscStrreplace(PETSC_COMM_WORLD,file,filename,PETSC_MAX_PATH_LEN);CHKERRQ(ierr); 6572d747510SLisandro Dalcin ierr = PetscOptionsInsertFile(PETSC_COMM_WORLD,options,filename,PETSC_TRUE);CHKERRQ(ierr); 658321366bcSBarry Smith } 65985079163SJed Brown /* 66085079163SJed Brown We want to be able to give -skip_petscrc on the command line, but need to parse it first. Since the command line 66185079163SJed Brown should take precedence, we insert it twice. It would be sufficient to just scan for -skip_petscrc. 66285079163SJed Brown */ 6632d747510SLisandro Dalcin if (argc && args && *argc) {ierr = PetscOptionsInsertArgs(options,*argc,*args);CHKERRQ(ierr);} 664c5929fdfSBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-skip_petscrc",&flag,NULL);CHKERRQ(ierr); 665321366bcSBarry Smith if (!flag) { 6662d747510SLisandro Dalcin ierr = PetscGetHomeDirectory(filename,PETSC_MAX_PATH_LEN-16);CHKERRQ(ierr); 6671ea3218fSSatish Balay /* PetscOptionsInsertFile() does a fopen() on rank0 only - so only rank0 HomeDir value is relavent */ 6682d747510SLisandro Dalcin if (filename[0]) { ierr = PetscStrcat(filename,"/.petscrc");CHKERRQ(ierr); } 6692d747510SLisandro Dalcin ierr = PetscOptionsInsertFile(PETSC_COMM_WORLD,options,filename,PETSC_FALSE);CHKERRQ(ierr); 670c5929fdfSBarry Smith ierr = PetscOptionsInsertFile(PETSC_COMM_WORLD,options,".petscrc",PETSC_FALSE);CHKERRQ(ierr); 671c5929fdfSBarry Smith ierr = PetscOptionsInsertFile(PETSC_COMM_WORLD,options,"petscrc",PETSC_FALSE);CHKERRQ(ierr); 672e5c89e4eSSatish Balay } 673e5c89e4eSSatish Balay 6742d747510SLisandro Dalcin /* insert environment options */ 675e5c89e4eSSatish Balay { 6762d747510SLisandro Dalcin char *eoptions = NULL; 677e5c89e4eSSatish Balay size_t len = 0; 678e5c89e4eSSatish Balay if (!rank) { 679e5c89e4eSSatish Balay eoptions = (char*)getenv("PETSC_OPTIONS"); 680e5c89e4eSSatish Balay ierr = PetscStrlen(eoptions,&len);CHKERRQ(ierr); 68176434e50SSatish Balay ierr = MPI_Bcast(&len,1,MPIU_SIZE_T,0,PETSC_COMM_WORLD);CHKERRQ(ierr); 682e5c89e4eSSatish Balay } else { 68376434e50SSatish Balay ierr = MPI_Bcast(&len,1,MPIU_SIZE_T,0,PETSC_COMM_WORLD);CHKERRQ(ierr); 684e5c89e4eSSatish Balay if (len) { 685854ce69bSBarry Smith ierr = PetscMalloc1(len+1,&eoptions);CHKERRQ(ierr); 686e5c89e4eSSatish Balay } 687e5c89e4eSSatish Balay } 688e5c89e4eSSatish Balay if (len) { 689e5c89e4eSSatish Balay ierr = MPI_Bcast(eoptions,len,MPI_CHAR,0,PETSC_COMM_WORLD);CHKERRQ(ierr); 69096fc60bcSBarry Smith if (rank) eoptions[len] = 0; 691c5929fdfSBarry Smith ierr = PetscOptionsInsertString(options,eoptions);CHKERRQ(ierr); 692e5c89e4eSSatish Balay if (rank) {ierr = PetscFree(eoptions);CHKERRQ(ierr);} 693e5c89e4eSSatish Balay } 694e5c89e4eSSatish Balay } 695e5c89e4eSSatish Balay 6963bcbd388SSean Farley #if defined(PETSC_HAVE_YAML) 69756a31166SBarry Smith { 6989fc438c3SToby Isaac char *eoptions = NULL; 6999fc438c3SToby Isaac size_t len = 0; 7009fc438c3SToby Isaac if (!rank) { 7019fc438c3SToby Isaac eoptions = (char*)getenv("PETSC_OPTIONS_YAML"); 7029fc438c3SToby Isaac ierr = PetscStrlen(eoptions,&len);CHKERRQ(ierr); 7039fc438c3SToby Isaac ierr = MPI_Bcast(&len,1,MPIU_SIZE_T,0,PETSC_COMM_WORLD);CHKERRQ(ierr); 7049fc438c3SToby Isaac } else { 7059fc438c3SToby Isaac ierr = MPI_Bcast(&len,1,MPIU_SIZE_T,0,PETSC_COMM_WORLD);CHKERRQ(ierr); 7069fc438c3SToby Isaac if (len) { 7079fc438c3SToby Isaac ierr = PetscMalloc1(len+1,&eoptions);CHKERRQ(ierr); 7089fc438c3SToby Isaac } 7099fc438c3SToby Isaac } 7109fc438c3SToby Isaac if (len) { 7119fc438c3SToby Isaac ierr = MPI_Bcast(eoptions,len,MPI_CHAR,0,PETSC_COMM_WORLD);CHKERRQ(ierr); 7129fc438c3SToby Isaac if (rank) eoptions[len] = 0; 7139fc438c3SToby Isaac ierr = PetscOptionsInsertStringYAML(options,eoptions);CHKERRQ(ierr); 7149fc438c3SToby Isaac if (rank) {ierr = PetscFree(eoptions);CHKERRQ(ierr);} 7159fc438c3SToby Isaac } 7169fc438c3SToby Isaac } 7179fc438c3SToby Isaac { 7183bcbd388SSean Farley char yaml_file[PETSC_MAX_PATH_LEN]; 719080f0011SToby Isaac char yaml_string[BUFSIZ]; 72056a31166SBarry Smith PetscBool yaml_flg; 721c5929fdfSBarry Smith ierr = PetscOptionsGetString(NULL,NULL,"-options_file_yaml",yaml_file,PETSC_MAX_PATH_LEN,&yaml_flg);CHKERRQ(ierr); 72256a31166SBarry Smith if (yaml_flg) { 72356a31166SBarry Smith ierr = PetscOptionsInsertFileYAML(PETSC_COMM_WORLD,yaml_file,PETSC_TRUE);CHKERRQ(ierr); 72456a31166SBarry Smith } 725080f0011SToby Isaac ierr = PetscOptionsGetString(NULL,NULL,"-options_string_yaml",yaml_string,BUFSIZ,&yaml_flg);CHKERRQ(ierr); 726080f0011SToby Isaac if (yaml_flg) { 727080f0011SToby Isaac ierr = PetscOptionsInsertStringYAML(NULL,yaml_string);CHKERRQ(ierr); 728080f0011SToby Isaac } 72956a31166SBarry Smith } 7303bcbd388SSean Farley #endif 7313bcbd388SSean Farley 73285079163SJed Brown /* insert command line options again because they take precedence over arguments in petscrc/environment */ 7332d747510SLisandro Dalcin if (argc && args && *argc) {ierr = PetscOptionsInsertArgs(options,*argc,*args);CHKERRQ(ierr);} 734e5c89e4eSSatish Balay PetscFunctionReturn(0); 735e5c89e4eSSatish Balay } 736e5c89e4eSSatish Balay 737e5c89e4eSSatish Balay /*@C 73888c29154SBarry Smith PetscOptionsView - Prints the options that have been loaded. This is 739e5c89e4eSSatish Balay useful for debugging purposes. 740e5c89e4eSSatish Balay 741c139c21fSBarry Smith Logically Collective on PetscViewer 742e5c89e4eSSatish Balay 743e5c89e4eSSatish Balay Input Parameter: 744a2b725a8SWilliam Gropp + options - options database, use NULL for default global database 745a2b725a8SWilliam Gropp - viewer - must be an PETSCVIEWERASCII viewer 746e5c89e4eSSatish Balay 747e5c89e4eSSatish Balay Options Database Key: 74826a7e8d4SBarry Smith . -options_view - Activates PetscOptionsView() within PetscFinalize() 749e5c89e4eSSatish Balay 7509666a313SBarry Smith Notes: 7519666a313SBarry Smith Only the rank zero process of MPI_Comm used to create view prints the option values. Other processes 7521c9f3c13SBarry Smith may have different values but they are not printed. 7531c9f3c13SBarry Smith 754e5c89e4eSSatish Balay Level: advanced 755e5c89e4eSSatish Balay 756e5c89e4eSSatish Balay .seealso: PetscOptionsAllUsed() 757e5c89e4eSSatish Balay @*/ 758c5929fdfSBarry Smith PetscErrorCode PetscOptionsView(PetscOptions options,PetscViewer viewer) 759e5c89e4eSSatish Balay { 760e5c89e4eSSatish Balay PetscErrorCode ierr; 761431c96f7SBarry Smith PetscInt i; 76288c29154SBarry Smith PetscBool isascii; 763e5c89e4eSSatish Balay 764e5c89e4eSSatish Balay PetscFunctionBegin; 7652d747510SLisandro Dalcin if (viewer) PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2); 766c5929fdfSBarry Smith options = options ? options : defaultoptions; 76788c29154SBarry Smith if (!viewer) viewer = PETSC_VIEWER_STDOUT_WORLD; 768251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&isascii);CHKERRQ(ierr); 769ce94432eSBarry Smith if (!isascii) SETERRQ(PetscObjectComm((PetscObject)viewer),PETSC_ERR_SUP,"Only supports ASCII viewer"); 77088c29154SBarry Smith 7712d747510SLisandro Dalcin if (!options->N) { 77288c29154SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"#No PETSc Option Table entries\n");CHKERRQ(ierr); 7732d747510SLisandro Dalcin PetscFunctionReturn(0); 77430694fe9SBarry Smith } 7752d747510SLisandro Dalcin 7762d747510SLisandro Dalcin ierr = PetscViewerASCIIPrintf(viewer,"#PETSc Option Table entries:\n");CHKERRQ(ierr); 777e5c89e4eSSatish Balay for (i=0; i<options->N; i++) { 778e5c89e4eSSatish Balay if (options->values[i]) { 77988c29154SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"-%s %s\n",options->names[i],options->values[i]);CHKERRQ(ierr); 780e5c89e4eSSatish Balay } else { 78188c29154SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"-%s\n",options->names[i]);CHKERRQ(ierr); 782e5c89e4eSSatish Balay } 783e5c89e4eSSatish Balay } 78488c29154SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"#End of PETSc Option Table entries\n");CHKERRQ(ierr); 785e5c89e4eSSatish Balay PetscFunctionReturn(0); 786e5c89e4eSSatish Balay } 787e5c89e4eSSatish Balay 788e11779c2SBarry Smith /* 789e11779c2SBarry Smith Called by error handlers to print options used in run 790e11779c2SBarry Smith */ 79195c0884eSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscOptionsViewError(void) 792e11779c2SBarry Smith { 793e11779c2SBarry Smith PetscInt i; 7944416b707SBarry Smith PetscOptions options = defaultoptions; 795e11779c2SBarry Smith 796e11779c2SBarry Smith PetscFunctionBegin; 797e11779c2SBarry Smith if (options->N) { 798e11779c2SBarry Smith (*PetscErrorPrintf)("PETSc Option Table entries:\n"); 799e11779c2SBarry Smith } else { 800e11779c2SBarry Smith (*PetscErrorPrintf)("No PETSc Option Table entries\n"); 801e11779c2SBarry Smith } 802e11779c2SBarry Smith for (i=0; i<options->N; i++) { 803e11779c2SBarry Smith if (options->values[i]) { 804e11779c2SBarry Smith (*PetscErrorPrintf)("-%s %s\n",options->names[i],options->values[i]); 805e11779c2SBarry Smith } else { 806e11779c2SBarry Smith (*PetscErrorPrintf)("-%s\n",options->names[i]); 807e11779c2SBarry Smith } 808e11779c2SBarry Smith } 809e11779c2SBarry Smith PetscFunctionReturn(0); 810e11779c2SBarry Smith } 811e11779c2SBarry Smith 812e5c89e4eSSatish Balay /*@C 81374e0666dSJed Brown PetscOptionsPrefixPush - Designate a prefix to be used by all options insertions to follow. 81474e0666dSJed Brown 8151c9f3c13SBarry Smith Logically Collective 81674e0666dSJed Brown 8179db968c8SJed Brown Input Parameter: 818c5929fdfSBarry Smith + options - options database, or NULL for the default global database 819c5929fdfSBarry Smith - prefix - The string to append to the existing prefix 8209db968c8SJed Brown 8219db968c8SJed Brown Options Database Keys: 8229db968c8SJed Brown + -prefix_push <some_prefix_> - push the given prefix 8239db968c8SJed Brown - -prefix_pop - pop the last prefix 8249db968c8SJed Brown 8259db968c8SJed Brown Notes: 8269db968c8SJed Brown It is common to use this in conjunction with -options_file as in 8279db968c8SJed Brown 8289db968c8SJed Brown $ -prefix_push system1_ -options_file system1rc -prefix_pop -prefix_push system2_ -options_file system2rc -prefix_pop 8299db968c8SJed Brown 8309db968c8SJed Brown where the files no longer require all options to be prefixed with -system2_. 83174e0666dSJed Brown 8329666a313SBarry Smith The collectivity of this routine is complex; only the MPI processes that call this routine will 8331c9f3c13SBarry Smith have the affect of these options. If some processes that create objects call this routine and others do 8341c9f3c13SBarry Smith not the code may fail in complicated ways because the same parallel solvers may incorrectly use different options 8351c9f3c13SBarry Smith on different ranks. 8361c9f3c13SBarry Smith 83774e0666dSJed Brown Level: advanced 83874e0666dSJed Brown 8391c9f3c13SBarry Smith .seealso: PetscOptionsPrefixPop(), PetscOptionsPush(), PetscOptionsPop(), PetscOptionsCreate(), PetscOptionsSetValue() 84074e0666dSJed Brown @*/ 841c5929fdfSBarry Smith PetscErrorCode PetscOptionsPrefixPush(PetscOptions options,const char prefix[]) 84274e0666dSJed Brown { 84374e0666dSJed Brown PetscErrorCode ierr; 84474e0666dSJed Brown size_t n; 84574e0666dSJed Brown PetscInt start; 8462d747510SLisandro Dalcin char key[MAXOPTNAME+1]; 8472d747510SLisandro Dalcin PetscBool valid; 84874e0666dSJed Brown 84974e0666dSJed Brown PetscFunctionBegin; 8509db968c8SJed Brown PetscValidCharPointer(prefix,1); 851c5929fdfSBarry Smith options = options ? options : defaultoptions; 85274e0666dSJed 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); 8532d747510SLisandro Dalcin key[0] = '-'; /* keys must start with '-' */ 8542d747510SLisandro Dalcin ierr = PetscStrncpy(key+1,prefix,sizeof(key)-1);CHKERRQ(ierr); 8552d747510SLisandro Dalcin ierr = PetscOptionsValidKey(key,&valid);CHKERRQ(ierr); 8562d747510SLisandro 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); 85774e0666dSJed Brown start = options->prefixind ? options->prefixstack[options->prefixind-1] : 0; 85874e0666dSJed Brown ierr = PetscStrlen(prefix,&n);CHKERRQ(ierr); 85974e0666dSJed Brown if (n+1 > sizeof(options->prefix)-start) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Maximum prefix length %d exceeded",sizeof(options->prefix)); 860580bdb30SBarry Smith ierr = PetscArraycpy(options->prefix+start,prefix,n+1);CHKERRQ(ierr); 86174e0666dSJed Brown options->prefixstack[options->prefixind++] = start+n; 86274e0666dSJed Brown PetscFunctionReturn(0); 86374e0666dSJed Brown } 86474e0666dSJed Brown 865c5929fdfSBarry Smith /*@C 86674e0666dSJed Brown PetscOptionsPrefixPop - Remove the latest options prefix, see PetscOptionsPrefixPush() for details 86774e0666dSJed Brown 8681c9f3c13SBarry Smith Logically Collective on the MPI_Comm that called PetscOptionsPrefixPush() 86974e0666dSJed Brown 870c5929fdfSBarry Smith Input Parameters: 871c5929fdfSBarry Smith . options - options database, or NULL for the default global database 872c5929fdfSBarry Smith 87374e0666dSJed Brown Level: advanced 87474e0666dSJed Brown 8751c9f3c13SBarry Smith .seealso: PetscOptionsPrefixPush(), PetscOptionsPush(), PetscOptionsPop(), PetscOptionsCreate(), PetscOptionsSetValue() 87674e0666dSJed Brown @*/ 877c5929fdfSBarry Smith PetscErrorCode PetscOptionsPrefixPop(PetscOptions options) 87874e0666dSJed Brown { 87974e0666dSJed Brown PetscInt offset; 88074e0666dSJed Brown 88174e0666dSJed Brown PetscFunctionBegin; 882c5929fdfSBarry Smith options = options ? options : defaultoptions; 88374e0666dSJed Brown if (options->prefixind < 1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"More prefixes popped than pushed"); 88474e0666dSJed Brown options->prefixind--; 88574e0666dSJed Brown offset = options->prefixind ? options->prefixstack[options->prefixind-1] : 0; 88674e0666dSJed Brown options->prefix[offset] = 0; 88774e0666dSJed Brown PetscFunctionReturn(0); 88874e0666dSJed Brown } 88974e0666dSJed Brown 890a542b6e8SBarry Smith /*@C 891a542b6e8SBarry Smith PetscOptionsClear - Removes all options form the database leaving it empty. 892a542b6e8SBarry Smith 8931c9f3c13SBarry Smith Logically Collective 8941c9f3c13SBarry Smith 895c5929fdfSBarry Smith Input Parameters: 896c5929fdfSBarry Smith . options - options database, use NULL for the default global database 897c5929fdfSBarry Smith 8989666a313SBarry Smith The collectivity of this routine is complex; only the MPI processes that call this routine will 8991c9f3c13SBarry Smith have the affect of these options. If some processes that create objects call this routine and others do 9001c9f3c13SBarry Smith not the code may fail in complicated ways because the same parallel solvers may incorrectly use different options 9011c9f3c13SBarry Smith on different ranks. 9021c9f3c13SBarry Smith 903a542b6e8SBarry Smith Level: developer 904a542b6e8SBarry Smith 905a542b6e8SBarry Smith .seealso: PetscOptionsInsert() 906a542b6e8SBarry Smith @*/ 907c5929fdfSBarry Smith PetscErrorCode PetscOptionsClear(PetscOptions options) 908a542b6e8SBarry Smith { 909a542b6e8SBarry Smith PetscInt i; 910a542b6e8SBarry Smith 911c5929fdfSBarry Smith options = options ? options : defaultoptions; 9122d747510SLisandro Dalcin if (!options) return 0; 9132d747510SLisandro Dalcin 914a542b6e8SBarry Smith for (i=0; i<options->N; i++) { 915a542b6e8SBarry Smith if (options->names[i]) free(options->names[i]); 916a542b6e8SBarry Smith if (options->values[i]) free(options->values[i]); 917a542b6e8SBarry Smith } 9182d747510SLisandro Dalcin options->N = 0; 9192d747510SLisandro Dalcin 920a542b6e8SBarry Smith for (i=0; i<options->Naliases; i++) { 921a542b6e8SBarry Smith free(options->aliases1[i]); 922a542b6e8SBarry Smith free(options->aliases2[i]); 923a542b6e8SBarry Smith } 924a542b6e8SBarry Smith options->Naliases = 0; 925a542b6e8SBarry Smith 9262d747510SLisandro Dalcin /* destroy hash table */ 9272d747510SLisandro Dalcin kh_destroy(HO,options->ht); 9282d747510SLisandro Dalcin options->ht = NULL; 9290eb63584SBarry Smith 9302d747510SLisandro Dalcin options->prefixind = 0; 9312d747510SLisandro Dalcin options->prefix[0] = 0; 9322d747510SLisandro Dalcin options->help = PETSC_FALSE; 9334416b707SBarry Smith return 0; 9344416b707SBarry Smith } 9354416b707SBarry Smith 9362d747510SLisandro Dalcin /*@C 9372d747510SLisandro Dalcin PetscOptionsSetAlias - Makes a key and alias for another key 9382d747510SLisandro Dalcin 9391c9f3c13SBarry Smith Logically Collective 9402d747510SLisandro Dalcin 9412d747510SLisandro Dalcin Input Parameters: 9422d747510SLisandro Dalcin + options - options database, or NULL for default global database 9432d747510SLisandro Dalcin . newname - the alias 9442d747510SLisandro Dalcin - oldname - the name that alias will refer to 9452d747510SLisandro Dalcin 9462d747510SLisandro Dalcin Level: advanced 9472d747510SLisandro Dalcin 9489666a313SBarry Smith The collectivity of this routine is complex; only the MPI processes that call this routine will 9491c9f3c13SBarry Smith have the affect of these options. If some processes that create objects call this routine and others do 9501c9f3c13SBarry Smith not the code may fail in complicated ways because the same parallel solvers may incorrectly use different options 9511c9f3c13SBarry Smith on different ranks. 9521c9f3c13SBarry Smith 9532d747510SLisandro Dalcin .seealso: PetscOptionsGetInt(), PetscOptionsGetReal(),OptionsHasName(), 9542d747510SLisandro Dalcin PetscOptionsGetString(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(),PetscOptionsBool(), 9552d747510SLisandro Dalcin PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 9562d747510SLisandro Dalcin PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 9572d747510SLisandro Dalcin PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 9582d747510SLisandro Dalcin PetscOptionsFList(), PetscOptionsEList() 9592d747510SLisandro Dalcin @*/ 9602d747510SLisandro Dalcin PetscErrorCode PetscOptionsSetAlias(PetscOptions options,const char newname[],const char oldname[]) 9612d747510SLisandro Dalcin { 9622d747510SLisandro Dalcin PetscInt n; 9632d747510SLisandro Dalcin size_t len; 9642d747510SLisandro Dalcin PetscErrorCode ierr; 9652d747510SLisandro Dalcin 9662d747510SLisandro Dalcin PetscFunctionBegin; 9672d747510SLisandro Dalcin PetscValidCharPointer(newname,2); 9682d747510SLisandro Dalcin PetscValidCharPointer(oldname,3); 9692d747510SLisandro Dalcin options = options ? options : defaultoptions; 9702d747510SLisandro Dalcin if (newname[0] != '-') SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"aliased must start with '-': Instead %s",newname); 9712d747510SLisandro Dalcin if (oldname[0] != '-') SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"aliasee must start with '-': Instead %s",oldname); 9722d747510SLisandro Dalcin 9732d747510SLisandro Dalcin n = options->Naliases; 9742d747510SLisandro 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); 9752d747510SLisandro Dalcin 9762d747510SLisandro Dalcin newname++; oldname++; 9772d747510SLisandro Dalcin ierr = PetscStrlen(newname,&len);CHKERRQ(ierr); 9782d747510SLisandro Dalcin options->aliases1[n] = (char*)malloc((len+1)*sizeof(char)); 9792d747510SLisandro Dalcin ierr = PetscStrcpy(options->aliases1[n],newname);CHKERRQ(ierr); 9802d747510SLisandro Dalcin ierr = PetscStrlen(oldname,&len);CHKERRQ(ierr); 9812d747510SLisandro Dalcin options->aliases2[n] = (char*)malloc((len+1)*sizeof(char)); 9822d747510SLisandro Dalcin ierr = PetscStrcpy(options->aliases2[n],oldname);CHKERRQ(ierr); 9832d747510SLisandro Dalcin options->Naliases++; 9842d747510SLisandro Dalcin PetscFunctionReturn(0); 9852d747510SLisandro Dalcin } 9864416b707SBarry Smith 987e5c89e4eSSatish Balay /*@C 988e5c89e4eSSatish Balay PetscOptionsSetValue - Sets an option name-value pair in the options 989e5c89e4eSSatish Balay database, overriding whatever is already present. 990e5c89e4eSSatish Balay 9911c9f3c13SBarry Smith Logically Collective 992e5c89e4eSSatish Balay 993e5c89e4eSSatish Balay Input Parameters: 994c5929fdfSBarry Smith + options - options database, use NULL for the default global database 995c5929fdfSBarry Smith . name - name of option, this SHOULD have the - prepended 9962d747510SLisandro Dalcin - value - the option value (not used for all options, so can be NULL) 997e5c89e4eSSatish Balay 998e5c89e4eSSatish Balay Level: intermediate 999e5c89e4eSSatish Balay 1000e5c89e4eSSatish Balay Note: 1001d49172ceSBarry Smith This function can be called BEFORE PetscInitialize() 1002d49172ceSBarry Smith 10039666a313SBarry Smith The collectivity of this routine is complex; only the MPI processes that call this routine will 10041c9f3c13SBarry Smith have the affect of these options. If some processes that create objects call this routine and others do 10051c9f3c13SBarry Smith not the code may fail in complicated ways because the same parallel solvers may incorrectly use different options 10061c9f3c13SBarry Smith on different ranks. 10071c9f3c13SBarry Smith 10082d747510SLisandro Dalcin Developers Note: Uses malloc() directly because PETSc may not be initialized yet. 1009b0250c70SBarry Smith 10102d747510SLisandro Dalcin .seealso: PetscOptionsInsert(), PetscOptionsClearValue() 1011e5c89e4eSSatish Balay @*/ 10122d747510SLisandro Dalcin PetscErrorCode PetscOptionsSetValue(PetscOptions options,const char name[],const char value[]) 1013e5c89e4eSSatish Balay { 1014e5c89e4eSSatish Balay size_t len; 10152d747510SLisandro Dalcin int N,n,i; 1016e5c89e4eSSatish Balay char **names; 10172d747510SLisandro Dalcin char fullname[MAXOPTNAME] = ""; 10182d747510SLisandro Dalcin PetscErrorCode ierr; 1019e5c89e4eSSatish Balay 1020*7272c0d2SVaclav Hapla if (!options) { 10212d747510SLisandro Dalcin ierr = PetscOptionsCreateDefault();if (ierr) return ierr; 1022*7272c0d2SVaclav Hapla options = defaultoptions; 1023c5929fdfSBarry Smith } 10242d747510SLisandro Dalcin 10252d747510SLisandro Dalcin if (name[0] != '-') return PETSC_ERR_ARG_OUTOFRANGE; 1026e5c89e4eSSatish Balay 1027d49172ceSBarry Smith /* this is so that -h and -help are equivalent (p4 does not like -help)*/ 1028*7272c0d2SVaclav Hapla if (!PetscOptNameCmp(name,"-h")) name = "-help"; 10292d747510SLisandro Dalcin if (!PetscOptNameCmp(name,"-help")) options->help = PETSC_TRUE; 1030e5c89e4eSSatish Balay 10312d747510SLisandro Dalcin name++; /* skip starting dash */ 10322d747510SLisandro Dalcin 103374e0666dSJed Brown if (options->prefixind > 0) { 1034d49172ceSBarry Smith strncpy(fullname,options->prefix,sizeof(fullname)); 10352d747510SLisandro Dalcin fullname[sizeof(fullname)-1] = 0; 103689ae1891SBarry Smith strncat(fullname,name,sizeof(fullname)-strlen(fullname)-1); 10372d747510SLisandro Dalcin fullname[sizeof(fullname)-1] = 0; 103874e0666dSJed Brown name = fullname; 103974e0666dSJed Brown } 104074e0666dSJed Brown 104174e0666dSJed Brown /* check against aliases */ 1042e5c89e4eSSatish Balay N = options->Naliases; 1043e5c89e4eSSatish Balay for (i=0; i<N; i++) { 10442d747510SLisandro Dalcin int result = PetscOptNameCmp(options->aliases1[i],name); 10452d747510SLisandro Dalcin if (!result) { name = options->aliases2[i]; break; } 1046e5c89e4eSSatish Balay } 1047e5c89e4eSSatish Balay 10482d747510SLisandro Dalcin /* slow search */ 10492d747510SLisandro Dalcin N = n = options->N; 1050e5c89e4eSSatish Balay names = options->names; 1051e5c89e4eSSatish Balay for (i=0; i<N; i++) { 10522d747510SLisandro Dalcin int result = PetscOptNameCmp(names[i],name); 10532d747510SLisandro Dalcin if (!result) { 10542d747510SLisandro Dalcin n = i; goto setvalue; 10552d747510SLisandro Dalcin } else if (result > 0) { 10562d747510SLisandro Dalcin n = i; break; 1057e5c89e4eSSatish Balay } 1058e5c89e4eSSatish Balay } 10592d747510SLisandro Dalcin if (N >= MAXOPTIONS) return PETSC_ERR_MEM; 10602d747510SLisandro Dalcin /* shift remaining values up 1 */ 1061e5c89e4eSSatish Balay for (i=N; i>n; i--) { 10625e8c5e88SLisandro Dalcin options->names[i] = options->names[i-1]; 1063e5c89e4eSSatish Balay options->values[i] = options->values[i-1]; 1064e5c89e4eSSatish Balay options->used[i] = options->used[i-1]; 1065e5c89e4eSSatish Balay } 10662d747510SLisandro Dalcin options->names[n] = NULL; 10672d747510SLisandro Dalcin options->values[n] = NULL; 10682d747510SLisandro Dalcin options->used[n] = PETSC_FALSE; 10692d747510SLisandro Dalcin options->N++; 10702d747510SLisandro Dalcin 10712d747510SLisandro Dalcin /* destroy hash table */ 10722d747510SLisandro Dalcin kh_destroy(HO,options->ht); 10732d747510SLisandro Dalcin options->ht = NULL; 10742d747510SLisandro Dalcin 10752d747510SLisandro Dalcin /* set new name */ 107670d8d27cSBarry Smith len = strlen(name); 10775e8c5e88SLisandro Dalcin options->names[n] = (char*)malloc((len+1)*sizeof(char)); 1078d49172ceSBarry Smith if (!options->names[n]) return PETSC_ERR_MEM; 1079d49172ceSBarry Smith strcpy(options->names[n],name); 10802d747510SLisandro Dalcin 10812d747510SLisandro Dalcin setvalue: 10822d747510SLisandro Dalcin /* set new value */ 10832d747510SLisandro Dalcin if (options->values[n]) free(options->values[n]); 1084d49172ceSBarry Smith len = value ? strlen(value) : 0; 10855e8c5e88SLisandro Dalcin if (len) { 1086e5c89e4eSSatish Balay options->values[n] = (char*)malloc((len+1)*sizeof(char)); 1087d49172ceSBarry Smith if (!options->values[n]) return PETSC_ERR_MEM; 1088d49172ceSBarry Smith strcpy(options->values[n],value); 10892d747510SLisandro Dalcin } else { 10902d747510SLisandro Dalcin options->values[n] = NULL; 10912d747510SLisandro Dalcin } 10922d747510SLisandro Dalcin 10932d747510SLisandro Dalcin ierr = PetscOptionsMonitor(options,name,value?value:"");if (ierr) return ierr; 1094d49172ceSBarry Smith return 0; 1095e5c89e4eSSatish Balay } 1096e5c89e4eSSatish Balay 1097e5c89e4eSSatish Balay /*@C 1098e5c89e4eSSatish Balay PetscOptionsClearValue - Clears an option name-value pair in the options 1099e5c89e4eSSatish Balay database, overriding whatever is already present. 1100e5c89e4eSSatish Balay 11011c9f3c13SBarry Smith Logically Collective 1102e5c89e4eSSatish Balay 1103e5c89e4eSSatish Balay Input Parameter: 1104c5929fdfSBarry Smith + options - options database, use NULL for the default global database 1105a2b725a8SWilliam Gropp - name - name of option, this SHOULD have the - prepended 1106e5c89e4eSSatish Balay 1107e5c89e4eSSatish Balay Level: intermediate 1108e5c89e4eSSatish Balay 11099666a313SBarry Smith The collectivity of this routine is complex; only the MPI processes that call this routine will 11101c9f3c13SBarry Smith have the affect of these options. If some processes that create objects call this routine and others do 11111c9f3c13SBarry Smith not the code may fail in complicated ways because the same parallel solvers may incorrectly use different options 11121c9f3c13SBarry Smith on different ranks. 11131c9f3c13SBarry Smith 1114e5c89e4eSSatish Balay .seealso: PetscOptionsInsert() 1115e5c89e4eSSatish Balay @*/ 11162d747510SLisandro Dalcin PetscErrorCode PetscOptionsClearValue(PetscOptions options,const char name[]) 1117e5c89e4eSSatish Balay { 11182d747510SLisandro Dalcin int N,n,i; 11192d747510SLisandro Dalcin char **names; 1120e5c89e4eSSatish Balay PetscErrorCode ierr; 1121e5c89e4eSSatish Balay 1122e5c89e4eSSatish Balay PetscFunctionBegin; 1123c5929fdfSBarry Smith options = options ? options : defaultoptions; 11242d747510SLisandro Dalcin if (name[0] != '-') SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Name must begin with '-': Instead %s",name); 1125e5c89e4eSSatish Balay 11262d747510SLisandro Dalcin /* this is so that -h and -help are equivalent (p4 does not like -help)*/ 11272d747510SLisandro Dalcin if (!strcmp(name,"-h")) name = "-help"; 11282d747510SLisandro Dalcin if (!PetscOptNameCmp(name,"-help")) options->help = PETSC_FALSE; 11292d747510SLisandro Dalcin 11302d747510SLisandro Dalcin name++; /* skip starting dash */ 11312d747510SLisandro Dalcin 11322d747510SLisandro Dalcin /* slow search */ 11332d747510SLisandro Dalcin N = n = options->N; 1134e5c89e4eSSatish Balay names = options->names; 1135e5c89e4eSSatish Balay for (i=0; i<N; i++) { 11362d747510SLisandro Dalcin int result = PetscOptNameCmp(names[i],name); 11372d747510SLisandro Dalcin if (!result) { 11382d747510SLisandro Dalcin n = i; break; 11392d747510SLisandro Dalcin } else if (result > 0) { 11402d747510SLisandro Dalcin n = N; break; 1141e5c89e4eSSatish Balay } 11422d747510SLisandro Dalcin } 11432d747510SLisandro Dalcin if (n == N) PetscFunctionReturn(0); /* it was not present */ 1144e5c89e4eSSatish Balay 11452d747510SLisandro Dalcin /* remove name and value */ 11462d747510SLisandro Dalcin if (options->names[n]) free(options->names[n]); 11472d747510SLisandro Dalcin if (options->values[n]) free(options->values[n]); 1148e5c89e4eSSatish Balay /* shift remaining values down 1 */ 1149e5c89e4eSSatish Balay for (i=n; i<N-1; i++) { 11505e8c5e88SLisandro Dalcin options->names[i] = options->names[i+1]; 1151e5c89e4eSSatish Balay options->values[i] = options->values[i+1]; 1152e5c89e4eSSatish Balay options->used[i] = options->used[i+1]; 1153e5c89e4eSSatish Balay } 1154e5c89e4eSSatish Balay options->N--; 11552d747510SLisandro Dalcin 11562d747510SLisandro Dalcin /* destroy hash table */ 11572d747510SLisandro Dalcin kh_destroy(HO,options->ht); 11582d747510SLisandro Dalcin options->ht = NULL; 11592d747510SLisandro Dalcin 11602d747510SLisandro Dalcin ierr = PetscOptionsMonitor(options,name,NULL);CHKERRQ(ierr); 1161e5c89e4eSSatish Balay PetscFunctionReturn(0); 1162e5c89e4eSSatish Balay } 1163e5c89e4eSSatish Balay 1164e5c89e4eSSatish Balay /*@C 11652d747510SLisandro Dalcin PetscOptionsFindPair - Gets an option name-value pair from the options database. 1166e5c89e4eSSatish Balay 11672d747510SLisandro Dalcin Not Collective 1168e5c89e4eSSatish Balay 1169e5c89e4eSSatish Balay Input Parameters: 11702d747510SLisandro Dalcin + options - options database, use NULL for the default global database 11712d747510SLisandro Dalcin . pre - the string to prepend to the name or NULL, this SHOULD NOT have the "-" prepended 11722d747510SLisandro Dalcin - name - name of option, this SHOULD have the "-" prepended 1173e5c89e4eSSatish Balay 11742d747510SLisandro Dalcin Output Parameters: 11752d747510SLisandro Dalcin + value - the option value (optional, not used for all options) 11762d747510SLisandro Dalcin - set - whether the option is set (optional) 1177e5c89e4eSSatish Balay 11789666a313SBarry Smith Notes: 11799666a313SBarry Smith Each process may find different values or no value depending on how options were inserted into the database 11801c9f3c13SBarry Smith 11812d747510SLisandro Dalcin Level: developer 11822d747510SLisandro Dalcin 11832d747510SLisandro Dalcin .seealso: PetscOptionsSetValue(), PetscOptionsClearValue() 1184e5c89e4eSSatish Balay @*/ 11852d747510SLisandro Dalcin PetscErrorCode PetscOptionsFindPair(PetscOptions options,const char pre[],const char name[],const char *value[],PetscBool *set) 1186e5c89e4eSSatish Balay { 11872d747510SLisandro Dalcin char buf[MAXOPTNAME]; 1188daabea38SBarry Smith PetscBool usehashtable = PETSC_TRUE; 11892d747510SLisandro Dalcin PetscBool matchnumbers = PETSC_TRUE; 1190e5c89e4eSSatish Balay PetscErrorCode ierr; 1191e5c89e4eSSatish Balay 1192e5c89e4eSSatish Balay PetscFunctionBegin; 1193c5929fdfSBarry Smith options = options ? options : defaultoptions; 11942d747510SLisandro Dalcin if (pre && PetscUnlikely(pre[0] == '-')) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Prefix cannot begin with '-': Instead %s",pre); 11952d747510SLisandro Dalcin if (PetscUnlikely(name[0] != '-')) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Name must begin with '-': Instead %s",name); 1196e5c89e4eSSatish Balay 11972d747510SLisandro Dalcin name++; /* skip starting dash */ 1198e5c89e4eSSatish Balay 11997cd08cecSJed Brown /* append prefix to name, if prefix="foo_" and option='--bar", prefixed option is --foo_bar */ 12002d747510SLisandro Dalcin if (pre && pre[0]) { 12012d747510SLisandro Dalcin char *ptr = buf; 12022d747510SLisandro Dalcin if (name[0] == '-') { *ptr++ = '-'; name++; } 12032d747510SLisandro Dalcin ierr = PetscStrncpy(ptr,pre,buf+sizeof(buf)-ptr);CHKERRQ(ierr); 12042d747510SLisandro Dalcin ierr = PetscStrlcat(buf,name,sizeof(buf));CHKERRQ(ierr); 12052d747510SLisandro Dalcin name = buf; 12067cd08cecSJed Brown } 12072d747510SLisandro Dalcin 120876bd3646SJed Brown if (PetscDefined(USE_DEBUG)) { 12092f828895SJed Brown PetscBool valid; 12102d747510SLisandro Dalcin char key[MAXOPTNAME+1] = "-"; 12112d747510SLisandro Dalcin ierr = PetscStrncpy(key+1,name,sizeof(key)-1);CHKERRQ(ierr); 12122f828895SJed Brown ierr = PetscOptionsValidKey(key,&valid);CHKERRQ(ierr); 12132f828895SJed 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); 12142f828895SJed Brown } 1215e5c89e4eSSatish Balay 12162d747510SLisandro Dalcin if (!options->ht && usehashtable) { 12172d747510SLisandro Dalcin int i,ret; 12182d747510SLisandro Dalcin khiter_t it; 12192d747510SLisandro Dalcin khash_t(HO) *ht; 12202d747510SLisandro Dalcin ht = kh_init(HO); 12212d747510SLisandro Dalcin if (PetscUnlikely(!ht)) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_MEM,"Hash table allocation failed"); 12222d747510SLisandro Dalcin ret = kh_resize(HO,ht,options->N*2); /* twice the required size to reduce risk of collisions */ 12232d747510SLisandro Dalcin if (PetscUnlikely(ret)) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_MEM,"Hash table allocation failed"); 12242d747510SLisandro Dalcin for (i=0; i<options->N; i++) { 12252d747510SLisandro Dalcin it = kh_put(HO,ht,options->names[i],&ret); 12262d747510SLisandro Dalcin if (PetscUnlikely(ret != 1)) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_MEM,"Hash table allocation failed"); 12272d747510SLisandro Dalcin kh_val(ht,it) = i; 12282d747510SLisandro Dalcin } 12292d747510SLisandro Dalcin options->ht = ht; 12302d747510SLisandro Dalcin } 12312d747510SLisandro Dalcin 12322d747510SLisandro Dalcin if (usehashtable) 12332d747510SLisandro Dalcin { /* fast search */ 12342d747510SLisandro Dalcin khash_t(HO) *ht = options->ht; 12352d747510SLisandro Dalcin khiter_t it = kh_get(HO,ht,name); 12362d747510SLisandro Dalcin if (it != kh_end(ht)) { 12372d747510SLisandro Dalcin int i = kh_val(ht,it); 1238e5c89e4eSSatish Balay options->used[i] = PETSC_TRUE; 12392d747510SLisandro Dalcin if (value) *value = options->values[i]; 12402d747510SLisandro Dalcin if (set) *set = PETSC_TRUE; 12412d747510SLisandro Dalcin PetscFunctionReturn(0); 12422d747510SLisandro Dalcin } 12432d747510SLisandro Dalcin } else 12442d747510SLisandro Dalcin { /* slow search */ 12452d747510SLisandro Dalcin int i, N = options->N; 12462d747510SLisandro Dalcin for (i=0; i<N; i++) { 1247daabea38SBarry Smith int result = PetscOptNameCmp(options->names[i],name); 12482d747510SLisandro Dalcin if (!result) { 12492d747510SLisandro Dalcin options->used[i] = PETSC_TRUE; 12502d747510SLisandro Dalcin if (value) *value = options->values[i]; 12512d747510SLisandro Dalcin if (set) *set = PETSC_TRUE; 12522d747510SLisandro Dalcin PetscFunctionReturn(0); 12532d747510SLisandro Dalcin } else if (result > 0) { 1254e5c89e4eSSatish Balay break; 1255e5c89e4eSSatish Balay } 1256e5c89e4eSSatish Balay } 12572d747510SLisandro Dalcin } 12582d747510SLisandro Dalcin 12592d747510SLisandro Dalcin /* 12602d747510SLisandro Dalcin The following block slows down all lookups in the most frequent path (most lookups are unsuccessful). 12612d747510SLisandro Dalcin Maybe this special lookup mode should be enabled on request with a push/pop API. 12622d747510SLisandro Dalcin The feature of matching _%d_ used sparingly in the codebase. 12632d747510SLisandro Dalcin */ 12642d747510SLisandro Dalcin if (matchnumbers) { 12652d747510SLisandro Dalcin int i,j,cnt = 0,locs[16],loce[16]; 1266e5c89e4eSSatish Balay /* determine the location and number of all _%d_ in the key */ 12672d747510SLisandro Dalcin for (i=0; name[i]; i++) { 12682d747510SLisandro Dalcin if (name[i] == '_') { 12692d747510SLisandro Dalcin for (j=i+1; name[j]; j++) { 12702d747510SLisandro Dalcin if (name[j] >= '0' && name[j] <= '9') continue; 12712d747510SLisandro Dalcin if (name[j] == '_' && j > i+1) { /* found a number */ 1272e5c89e4eSSatish Balay locs[cnt] = i+1; 1273e5c89e4eSSatish Balay loce[cnt++] = j+1; 1274e5c89e4eSSatish Balay } 12752d747510SLisandro Dalcin i = j-1; 1276e5c89e4eSSatish Balay break; 1277e5c89e4eSSatish Balay } 1278e5c89e4eSSatish Balay } 1279e5c89e4eSSatish Balay } 1280e5c89e4eSSatish Balay for (i=0; i<cnt; i++) { 12812d747510SLisandro Dalcin PetscBool found; 12822d747510SLisandro Dalcin char opt[MAXOPTNAME+1] = "-", tmp[MAXOPTNAME]; 12832d747510SLisandro Dalcin ierr = PetscStrncpy(tmp,name,PetscMin((size_t)(locs[i]+1),sizeof(tmp)));CHKERRQ(ierr); 12842d747510SLisandro Dalcin ierr = PetscStrlcat(opt,tmp,sizeof(opt));CHKERRQ(ierr); 12852d747510SLisandro Dalcin ierr = PetscStrlcat(opt,name+loce[i],sizeof(opt));CHKERRQ(ierr); 12862d747510SLisandro Dalcin ierr = PetscOptionsFindPair(options,NULL,opt,value,&found);CHKERRQ(ierr); 12872d747510SLisandro Dalcin if (found) {if (set) *set = PETSC_TRUE; PetscFunctionReturn(0);} 1288e5c89e4eSSatish Balay } 1289e5c89e4eSSatish Balay } 12902d747510SLisandro Dalcin 12912d747510SLisandro Dalcin if (set) *set = PETSC_FALSE; 1292e5c89e4eSSatish Balay PetscFunctionReturn(0); 1293e5c89e4eSSatish Balay } 1294e5c89e4eSSatish Balay 1295d6ced9c0SMatthew G. Knepley /* Check whether any option begins with pre+name */ 12962d747510SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscOptionsFindPairPrefix_Private(PetscOptions options,const char pre[], const char name[],const char *value[],PetscBool *set) 1297514bf10dSMatthew G Knepley { 12982d747510SLisandro Dalcin char buf[MAXOPTNAME]; 1299d6ced9c0SMatthew G. Knepley int numCnt = 0, locs[16],loce[16]; 1300514bf10dSMatthew G Knepley PetscErrorCode ierr; 1301514bf10dSMatthew G Knepley 1302514bf10dSMatthew G Knepley PetscFunctionBegin; 1303c5929fdfSBarry Smith options = options ? options : defaultoptions; 13042d747510SLisandro Dalcin if (pre && pre[0] == '-') SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Prefix cannot begin with '-': Instead %s",pre); 13052d747510SLisandro Dalcin if (name[0] != '-') SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Name must begin with '-': Instead %s",name); 1306514bf10dSMatthew G Knepley 13072d747510SLisandro Dalcin name++; /* skip starting dash */ 1308514bf10dSMatthew G Knepley 1309514bf10dSMatthew G Knepley /* append prefix to name, if prefix="foo_" and option='--bar", prefixed option is --foo_bar */ 13102d747510SLisandro Dalcin if (pre && pre[0]) { 13112d747510SLisandro Dalcin char *ptr = buf; 13122d747510SLisandro Dalcin if (name[0] == '-') { *ptr++ = '-'; name++; } 13132d747510SLisandro Dalcin ierr = PetscStrncpy(ptr,pre,sizeof(buf)+(size_t)(ptr-buf));CHKERRQ(ierr); 13142d747510SLisandro Dalcin ierr = PetscStrlcat(buf,name,sizeof(buf));CHKERRQ(ierr); 13152d747510SLisandro Dalcin name = buf; 1316514bf10dSMatthew G Knepley } 13172d747510SLisandro Dalcin 131876bd3646SJed Brown if (PetscDefined(USE_DEBUG)) { 1319514bf10dSMatthew G Knepley PetscBool valid; 13202d747510SLisandro Dalcin char key[MAXOPTNAME+1] = "-"; 13212d747510SLisandro Dalcin ierr = PetscStrncpy(key+1,name,sizeof(key)-1);CHKERRQ(ierr); 1322514bf10dSMatthew G Knepley ierr = PetscOptionsValidKey(key,&valid);CHKERRQ(ierr); 1323514bf10dSMatthew 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); 1324514bf10dSMatthew G Knepley } 1325514bf10dSMatthew G Knepley 1326d6ced9c0SMatthew G. Knepley /* determine the location and number of all _%d_ in the key */ 1327d6ced9c0SMatthew G. Knepley { 1328d6ced9c0SMatthew G. Knepley int i,j; 1329d6ced9c0SMatthew G. Knepley for (i=0; name[i]; i++) { 1330d6ced9c0SMatthew G. Knepley if (name[i] == '_') { 1331d6ced9c0SMatthew G. Knepley for (j=i+1; name[j]; j++) { 1332d6ced9c0SMatthew G. Knepley if (name[j] >= '0' && name[j] <= '9') continue; 1333d6ced9c0SMatthew G. Knepley if (name[j] == '_' && j > i+1) { /* found a number */ 1334d6ced9c0SMatthew G. Knepley locs[numCnt] = i+1; 1335d6ced9c0SMatthew G. Knepley loce[numCnt++] = j+1; 1336d6ced9c0SMatthew G. Knepley } 1337d6ced9c0SMatthew G. Knepley i = j-1; 1338d6ced9c0SMatthew G. Knepley break; 1339d6ced9c0SMatthew G. Knepley } 1340d6ced9c0SMatthew G. Knepley } 1341d6ced9c0SMatthew G. Knepley } 1342d6ced9c0SMatthew G. Knepley } 1343d6ced9c0SMatthew G. Knepley 13442d747510SLisandro Dalcin { /* slow search */ 1345d6ced9c0SMatthew G. Knepley int c, i; 13462d747510SLisandro Dalcin size_t len; 13472d747510SLisandro Dalcin PetscBool match; 1348d6ced9c0SMatthew G. Knepley 1349d6ced9c0SMatthew G. Knepley for (c = -1; c < numCnt; ++c) { 1350d6ced9c0SMatthew G. Knepley char opt[MAXOPTNAME+1] = "", tmp[MAXOPTNAME]; 1351d6ced9c0SMatthew G. Knepley 1352d6ced9c0SMatthew G. Knepley if (c < 0) { 1353d6ced9c0SMatthew G. Knepley ierr = PetscStrcpy(opt,name);CHKERRQ(ierr); 1354d6ced9c0SMatthew G. Knepley } else { 1355d6ced9c0SMatthew G. Knepley ierr = PetscStrncpy(tmp,name,PetscMin((size_t)(locs[c]+1),sizeof(tmp)));CHKERRQ(ierr); 1356d6ced9c0SMatthew G. Knepley ierr = PetscStrlcat(opt,tmp,sizeof(opt));CHKERRQ(ierr); 1357d6ced9c0SMatthew G. Knepley ierr = PetscStrlcat(opt,name+loce[c],sizeof(opt));CHKERRQ(ierr); 1358d6ced9c0SMatthew G. Knepley } 1359d6ced9c0SMatthew G. Knepley ierr = PetscStrlen(opt,&len);CHKERRQ(ierr); 13602d747510SLisandro Dalcin for (i=0; i<options->N; i++) { 1361d6ced9c0SMatthew G. Knepley ierr = PetscStrncmp(options->names[i],opt,len,&match);CHKERRQ(ierr); 1362514bf10dSMatthew G Knepley if (match) { 1363514bf10dSMatthew G Knepley options->used[i] = PETSC_TRUE; 13642d747510SLisandro Dalcin if (value) *value = options->values[i]; 13652d747510SLisandro Dalcin if (set) *set = PETSC_TRUE; 13662d747510SLisandro Dalcin PetscFunctionReturn(0); 1367514bf10dSMatthew G Knepley } 1368514bf10dSMatthew G Knepley } 13692d747510SLisandro Dalcin } 1370d6ced9c0SMatthew G. Knepley } 13712d747510SLisandro Dalcin 13722d747510SLisandro Dalcin if (set) *set = PETSC_FALSE; 1373514bf10dSMatthew G Knepley PetscFunctionReturn(0); 1374514bf10dSMatthew G Knepley } 1375514bf10dSMatthew G Knepley 1376e5c89e4eSSatish Balay /*@C 1377e5c89e4eSSatish Balay PetscOptionsReject - Generates an error if a certain option is given. 1378e5c89e4eSSatish Balay 13791c9f3c13SBarry Smith Not Collective 1380e5c89e4eSSatish Balay 1381e5c89e4eSSatish Balay Input Parameters: 13825c9cc608SHong Zhang + options - options database, use NULL for default global database 13832d747510SLisandro Dalcin . pre - the option prefix (may be NULL) 13842d747510SLisandro Dalcin . name - the option name one is seeking 13850298fd71SBarry Smith - mess - error message (may be NULL) 1386e5c89e4eSSatish Balay 1387e5c89e4eSSatish Balay Level: advanced 1388e5c89e4eSSatish Balay 1389e5c89e4eSSatish Balay .seealso: PetscOptionsGetInt(), PetscOptionsGetReal(),OptionsHasName(), 1390acfcf0e5SJed Brown PetscOptionsGetString(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool(), 1391e5c89e4eSSatish Balay PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 1392e5c89e4eSSatish Balay PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 1393acfcf0e5SJed Brown PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 1394a264d7a6SBarry Smith PetscOptionsFList(), PetscOptionsEList() 1395e5c89e4eSSatish Balay @*/ 13962d747510SLisandro Dalcin PetscErrorCode PetscOptionsReject(PetscOptions options,const char pre[],const char name[],const char mess[]) 1397e5c89e4eSSatish Balay { 1398e5c89e4eSSatish Balay PetscErrorCode ierr; 1399ace3abfcSBarry Smith PetscBool flag = PETSC_FALSE; 1400e5c89e4eSSatish Balay 1401e5c89e4eSSatish Balay PetscFunctionBegin; 14022d747510SLisandro Dalcin ierr = PetscOptionsHasName(options,pre,name,&flag);CHKERRQ(ierr); 1403e5c89e4eSSatish Balay if (flag) { 14042d747510SLisandro 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); 14052d747510SLisandro Dalcin else SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Program has disabled option: -%s%s",pre?pre:"",name+1); 1406e5c89e4eSSatish Balay } 1407e5c89e4eSSatish Balay PetscFunctionReturn(0); 1408e5c89e4eSSatish Balay } 1409e5c89e4eSSatish Balay 1410e5c89e4eSSatish Balay /*@C 14112d747510SLisandro Dalcin PetscOptionsHasHelp - Determines whether the "-help" option is in the database. 14122d747510SLisandro Dalcin 14132d747510SLisandro Dalcin Not Collective 14142d747510SLisandro Dalcin 14152d747510SLisandro Dalcin Input Parameters: 14162d747510SLisandro Dalcin . options - options database, use NULL for default global database 14172d747510SLisandro Dalcin 14182d747510SLisandro Dalcin Output Parameters: 14192d747510SLisandro Dalcin . set - PETSC_TRUE if found else PETSC_FALSE. 14202d747510SLisandro Dalcin 14212d747510SLisandro Dalcin Level: advanced 14222d747510SLisandro Dalcin 14232d747510SLisandro Dalcin .seealso: PetscOptionsHasName() 14242d747510SLisandro Dalcin @*/ 14252d747510SLisandro Dalcin PetscErrorCode PetscOptionsHasHelp(PetscOptions options,PetscBool *set) 14262d747510SLisandro Dalcin { 14272d747510SLisandro Dalcin PetscFunctionBegin; 14282d747510SLisandro Dalcin PetscValidPointer(set,2); 14292d747510SLisandro Dalcin options = options ? options : defaultoptions; 14302d747510SLisandro Dalcin *set = options->help; 14312d747510SLisandro Dalcin PetscFunctionReturn(0); 14322d747510SLisandro Dalcin } 14332d747510SLisandro Dalcin 14342d747510SLisandro Dalcin /*@C 143590d69ab7SBarry 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 143690d69ab7SBarry Smith its value is set to false. 1437e5c89e4eSSatish Balay 1438e5c89e4eSSatish Balay Not Collective 1439e5c89e4eSSatish Balay 1440e5c89e4eSSatish Balay Input Parameters: 14415c9cc608SHong Zhang + options - options database, use NULL for default global database 14423de71b31SHong Zhang . pre - string to prepend to the name or NULL 14433de71b31SHong Zhang - name - the option one is seeking 1444e5c89e4eSSatish Balay 1445e5c89e4eSSatish Balay Output Parameters: 144696ef3cdfSSatish Balay . set - PETSC_TRUE if found else PETSC_FALSE. 1447e5c89e4eSSatish Balay 1448e5c89e4eSSatish Balay Level: beginner 1449e5c89e4eSSatish Balay 145095452b02SPatrick Sanan Notes: 14512d747510SLisandro Dalcin Name cannot be simply "-h". 1452431c96f7SBarry Smith 1453acfcf0e5SJed Brown In many cases you probably want to use PetscOptionsGetBool() instead of calling this, to allowing toggling values. 145490d69ab7SBarry Smith 1455e5c89e4eSSatish Balay .seealso: PetscOptionsGetInt(), PetscOptionsGetReal(), 1456f3e3d7dfSBarry Smith PetscOptionsGetString(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool(), 1457e5c89e4eSSatish Balay PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 1458e5c89e4eSSatish Balay PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 1459acfcf0e5SJed Brown PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 1460a264d7a6SBarry Smith PetscOptionsFList(), PetscOptionsEList() 1461e5c89e4eSSatish Balay @*/ 1462c5929fdfSBarry Smith PetscErrorCode PetscOptionsHasName(PetscOptions options,const char pre[],const char name[],PetscBool *set) 1463e5c89e4eSSatish Balay { 14642d747510SLisandro Dalcin const char *value; 1465e5c89e4eSSatish Balay PetscErrorCode ierr; 1466ace3abfcSBarry Smith PetscBool flag; 1467e5c89e4eSSatish Balay 1468e5c89e4eSSatish Balay PetscFunctionBegin; 14692d747510SLisandro Dalcin ierr = PetscOptionsFindPair(options,pre,name,&value,&flag);CHKERRQ(ierr); 147096ef3cdfSSatish Balay if (set) *set = flag; 1471e5c89e4eSSatish Balay PetscFunctionReturn(0); 1472e5c89e4eSSatish Balay } 1473e5c89e4eSSatish Balay 1474e5c89e4eSSatish Balay /*@C 14752d747510SLisandro Dalcin PetscOptionsGetAll - Lists all the options the program was run with in a single string. 14762d747510SLisandro Dalcin 14772d747510SLisandro Dalcin Not Collective 14782d747510SLisandro Dalcin 1479fd292e60Sprj- Input Parameter: 14802d747510SLisandro Dalcin . options - the options database, use NULL for the default global database 14812d747510SLisandro Dalcin 14822d747510SLisandro Dalcin Output Parameter: 14832d747510SLisandro Dalcin . copts - pointer where string pointer is stored 14842d747510SLisandro Dalcin 14852d747510SLisandro Dalcin Notes: 14861c9f3c13SBarry Smith The array and each entry in the array should be freed with PetscFree() 14871c9f3c13SBarry Smith Each process may have different values depending on how the options were inserted into the database 14882d747510SLisandro Dalcin 14892d747510SLisandro Dalcin Level: advanced 14902d747510SLisandro Dalcin 14911c9f3c13SBarry Smith .seealso: PetscOptionsAllUsed(), PetscOptionsView(), PetscOptionsPush(), PetscOptionsPop() 14922d747510SLisandro Dalcin @*/ 14932d747510SLisandro Dalcin PetscErrorCode PetscOptionsGetAll(PetscOptions options,char *copts[]) 14942d747510SLisandro Dalcin { 14952d747510SLisandro Dalcin PetscErrorCode ierr; 14962d747510SLisandro Dalcin PetscInt i; 14972d747510SLisandro Dalcin size_t len = 1,lent = 0; 14982d747510SLisandro Dalcin char *coptions = NULL; 14992d747510SLisandro Dalcin 15002d747510SLisandro Dalcin PetscFunctionBegin; 15012d747510SLisandro Dalcin PetscValidPointer(copts,2); 15022d747510SLisandro Dalcin options = options ? options : defaultoptions; 15032d747510SLisandro Dalcin /* count the length of the required string */ 15042d747510SLisandro Dalcin for (i=0; i<options->N; i++) { 15052d747510SLisandro Dalcin ierr = PetscStrlen(options->names[i],&lent);CHKERRQ(ierr); 15062d747510SLisandro Dalcin len += 2 + lent; 15072d747510SLisandro Dalcin if (options->values[i]) { 15082d747510SLisandro Dalcin ierr = PetscStrlen(options->values[i],&lent);CHKERRQ(ierr); 15092d747510SLisandro Dalcin len += 1 + lent; 15102d747510SLisandro Dalcin } 15112d747510SLisandro Dalcin } 15122d747510SLisandro Dalcin ierr = PetscMalloc1(len,&coptions);CHKERRQ(ierr); 15132d747510SLisandro Dalcin coptions[0] = 0; 15142d747510SLisandro Dalcin for (i=0; i<options->N; i++) { 15152d747510SLisandro Dalcin ierr = PetscStrcat(coptions,"-");CHKERRQ(ierr); 15162d747510SLisandro Dalcin ierr = PetscStrcat(coptions,options->names[i]);CHKERRQ(ierr); 15172d747510SLisandro Dalcin ierr = PetscStrcat(coptions," ");CHKERRQ(ierr); 15182d747510SLisandro Dalcin if (options->values[i]) { 15192d747510SLisandro Dalcin ierr = PetscStrcat(coptions,options->values[i]);CHKERRQ(ierr); 15202d747510SLisandro Dalcin ierr = PetscStrcat(coptions," ");CHKERRQ(ierr); 15212d747510SLisandro Dalcin } 15222d747510SLisandro Dalcin } 15232d747510SLisandro Dalcin *copts = coptions; 15242d747510SLisandro Dalcin PetscFunctionReturn(0); 15252d747510SLisandro Dalcin } 15262d747510SLisandro Dalcin 15272d747510SLisandro Dalcin /*@C 15282d747510SLisandro Dalcin PetscOptionsUsed - Indicates if PETSc has used a particular option set in the database 15292d747510SLisandro Dalcin 15302d747510SLisandro Dalcin Not Collective 15312d747510SLisandro Dalcin 15322d747510SLisandro Dalcin Input Parameter: 15332d747510SLisandro Dalcin + options - options database, use NULL for default global database 15342d747510SLisandro Dalcin - name - string name of option 15352d747510SLisandro Dalcin 15362d747510SLisandro Dalcin Output Parameter: 15372d747510SLisandro Dalcin . used - PETSC_TRUE if the option was used, otherwise false, including if option was not found in options database 15382d747510SLisandro Dalcin 15392d747510SLisandro Dalcin Level: advanced 15402d747510SLisandro Dalcin 15419666a313SBarry Smith Notes: 15429666a313SBarry Smith The value returned may be different on each process and depends on which options have been processed 15431c9f3c13SBarry Smith on the given process 15441c9f3c13SBarry Smith 15452d747510SLisandro Dalcin .seealso: PetscOptionsView(), PetscOptionsLeft(), PetscOptionsAllUsed() 15462d747510SLisandro Dalcin @*/ 15472d747510SLisandro Dalcin PetscErrorCode PetscOptionsUsed(PetscOptions options,const char *name,PetscBool *used) 15482d747510SLisandro Dalcin { 15492d747510SLisandro Dalcin PetscInt i; 15502d747510SLisandro Dalcin PetscErrorCode ierr; 15512d747510SLisandro Dalcin 15522d747510SLisandro Dalcin PetscFunctionBegin; 15532d747510SLisandro Dalcin PetscValidCharPointer(name,2); 15542d747510SLisandro Dalcin PetscValidPointer(used,3); 15552d747510SLisandro Dalcin options = options ? options : defaultoptions; 15562d747510SLisandro Dalcin *used = PETSC_FALSE; 15572d747510SLisandro Dalcin for (i=0; i<options->N; i++) { 15582d747510SLisandro Dalcin ierr = PetscStrcmp(options->names[i],name,used);CHKERRQ(ierr); 15592d747510SLisandro Dalcin if (*used) { 15602d747510SLisandro Dalcin *used = options->used[i]; 15612d747510SLisandro Dalcin break; 15622d747510SLisandro Dalcin } 15632d747510SLisandro Dalcin } 15642d747510SLisandro Dalcin PetscFunctionReturn(0); 15652d747510SLisandro Dalcin } 15662d747510SLisandro Dalcin 1567487a658cSBarry Smith /*@ 15682d747510SLisandro Dalcin PetscOptionsAllUsed - Returns a count of the number of options in the 15692d747510SLisandro Dalcin database that have never been selected. 15702d747510SLisandro Dalcin 15712d747510SLisandro Dalcin Not Collective 15722d747510SLisandro Dalcin 15732d747510SLisandro Dalcin Input Parameter: 15742d747510SLisandro Dalcin . options - options database, use NULL for default global database 15752d747510SLisandro Dalcin 15762d747510SLisandro Dalcin Output Parameter: 15772d747510SLisandro Dalcin . N - count of options not used 15782d747510SLisandro Dalcin 15792d747510SLisandro Dalcin Level: advanced 15802d747510SLisandro Dalcin 15819666a313SBarry Smith Notes: 15829666a313SBarry Smith The value returned may be different on each process and depends on which options have been processed 15831c9f3c13SBarry Smith on the given process 15841c9f3c13SBarry Smith 15852d747510SLisandro Dalcin .seealso: PetscOptionsView() 15862d747510SLisandro Dalcin @*/ 15872d747510SLisandro Dalcin PetscErrorCode PetscOptionsAllUsed(PetscOptions options,PetscInt *N) 15882d747510SLisandro Dalcin { 15892d747510SLisandro Dalcin PetscInt i,n = 0; 15902d747510SLisandro Dalcin 15912d747510SLisandro Dalcin PetscFunctionBegin; 15922d747510SLisandro Dalcin PetscValidIntPointer(N,2); 15932d747510SLisandro Dalcin options = options ? options : defaultoptions; 15942d747510SLisandro Dalcin for (i=0; i<options->N; i++) { 15952d747510SLisandro Dalcin if (!options->used[i]) n++; 15962d747510SLisandro Dalcin } 15972d747510SLisandro Dalcin *N = n; 15982d747510SLisandro Dalcin PetscFunctionReturn(0); 15992d747510SLisandro Dalcin } 16002d747510SLisandro Dalcin 1601487a658cSBarry Smith /*@ 16022d747510SLisandro Dalcin PetscOptionsLeft - Prints to screen any options that were set and never used. 16032d747510SLisandro Dalcin 16042d747510SLisandro Dalcin Not Collective 16052d747510SLisandro Dalcin 16062d747510SLisandro Dalcin Input Parameter: 16072d747510SLisandro Dalcin . options - options database; use NULL for default global database 16082d747510SLisandro Dalcin 16092d747510SLisandro Dalcin Options Database Key: 16103c6db4c4SPierre Jolivet . -options_left - activates PetscOptionsAllUsed() within PetscFinalize() 16112d747510SLisandro Dalcin 16123de2bfdfSBarry Smith Notes: 16133de2bfdfSBarry Smith This is rarely used directly, it is called by PetscFinalize() in debug more or if -options_left 16141c9f3c13SBarry Smith is passed otherwise to help users determine possible mistakes in their usage of options. This 16151c9f3c13SBarry Smith only prints values on process zero of PETSC_COMM_WORLD. Other processes depending the objects 16161c9f3c13SBarry Smith used may have different options that are left unused. 16173de2bfdfSBarry Smith 16182d747510SLisandro Dalcin Level: advanced 16192d747510SLisandro Dalcin 16202d747510SLisandro Dalcin .seealso: PetscOptionsAllUsed() 16212d747510SLisandro Dalcin @*/ 16222d747510SLisandro Dalcin PetscErrorCode PetscOptionsLeft(PetscOptions options) 16232d747510SLisandro Dalcin { 16242d747510SLisandro Dalcin PetscErrorCode ierr; 16252d747510SLisandro Dalcin PetscInt i; 16263de2bfdfSBarry Smith PetscInt cnt = 0; 16273de2bfdfSBarry Smith PetscOptions toptions; 16282d747510SLisandro Dalcin 16292d747510SLisandro Dalcin PetscFunctionBegin; 16303de2bfdfSBarry Smith toptions = options ? options : defaultoptions; 16313de2bfdfSBarry Smith for (i=0; i<toptions->N; i++) { 16323de2bfdfSBarry Smith if (!toptions->used[i]) { 16333de2bfdfSBarry Smith if (toptions->values[i]) { 16343de2bfdfSBarry Smith ierr = PetscPrintf(PETSC_COMM_WORLD,"Option left: name:-%s value: %s\n",toptions->names[i],toptions->values[i]);CHKERRQ(ierr); 16352d747510SLisandro Dalcin } else { 16363de2bfdfSBarry Smith ierr = PetscPrintf(PETSC_COMM_WORLD,"Option left: name:-%s (no value)\n",toptions->names[i]);CHKERRQ(ierr); 16372d747510SLisandro Dalcin } 16382d747510SLisandro Dalcin } 16392d747510SLisandro Dalcin } 16403de2bfdfSBarry Smith if (!options) { 16413de2bfdfSBarry Smith toptions = defaultoptions; 16423de2bfdfSBarry Smith while (toptions->previous) { 16433de2bfdfSBarry Smith cnt++; 16443de2bfdfSBarry Smith toptions = toptions->previous; 16453de2bfdfSBarry Smith } 16463de2bfdfSBarry Smith if (cnt) { 16473de2bfdfSBarry 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); 16483de2bfdfSBarry Smith } 16493de2bfdfSBarry Smith } 16502d747510SLisandro Dalcin PetscFunctionReturn(0); 16512d747510SLisandro Dalcin } 16522d747510SLisandro Dalcin 16532d747510SLisandro Dalcin /*@C 16542d747510SLisandro Dalcin PetscOptionsLeftGet - Returns all options that were set and never used. 16552d747510SLisandro Dalcin 16562d747510SLisandro Dalcin Not Collective 16572d747510SLisandro Dalcin 16582d747510SLisandro Dalcin Input Parameter: 16592d747510SLisandro Dalcin . options - options database, use NULL for default global database 16602d747510SLisandro Dalcin 16612d747510SLisandro Dalcin Output Parameter: 1662a2b725a8SWilliam Gropp + N - count of options not used 16632d747510SLisandro Dalcin . names - names of options not used 1664a2b725a8SWilliam Gropp - values - values of options not used 16652d747510SLisandro Dalcin 16662d747510SLisandro Dalcin Level: advanced 16672d747510SLisandro Dalcin 16682d747510SLisandro Dalcin Notes: 16692d747510SLisandro Dalcin Users should call PetscOptionsLeftRestore() to free the memory allocated in this routine 16701c9f3c13SBarry Smith Notes: The value returned may be different on each process and depends on which options have been processed 16711c9f3c13SBarry Smith on the given process 16722d747510SLisandro Dalcin 16732d747510SLisandro Dalcin .seealso: PetscOptionsAllUsed(), PetscOptionsLeft() 16742d747510SLisandro Dalcin @*/ 16752d747510SLisandro Dalcin PetscErrorCode PetscOptionsLeftGet(PetscOptions options,PetscInt *N,char **names[],char **values[]) 16762d747510SLisandro Dalcin { 16772d747510SLisandro Dalcin PetscErrorCode ierr; 16782d747510SLisandro Dalcin PetscInt i,n; 16792d747510SLisandro Dalcin 16802d747510SLisandro Dalcin PetscFunctionBegin; 16812d747510SLisandro Dalcin if (N) PetscValidIntPointer(N,2); 16822d747510SLisandro Dalcin if (names) PetscValidPointer(names,3); 16832d747510SLisandro Dalcin if (values) PetscValidPointer(values,4); 16842d747510SLisandro Dalcin options = options ? options : defaultoptions; 16852d747510SLisandro Dalcin 16862d747510SLisandro Dalcin /* The number of unused PETSc options */ 16872d747510SLisandro Dalcin n = 0; 16882d747510SLisandro Dalcin for (i=0; i<options->N; i++) { 16892d747510SLisandro Dalcin if (!options->used[i]) n++; 16902d747510SLisandro Dalcin } 16912d747510SLisandro Dalcin if (N) { *N = n; } 16922d747510SLisandro Dalcin if (names) { ierr = PetscMalloc1(n,names);CHKERRQ(ierr); } 16932d747510SLisandro Dalcin if (values) { ierr = PetscMalloc1(n,values);CHKERRQ(ierr); } 16942d747510SLisandro Dalcin 16952d747510SLisandro Dalcin n = 0; 16962d747510SLisandro Dalcin if (names || values) { 16972d747510SLisandro Dalcin for (i=0; i<options->N; i++) { 16982d747510SLisandro Dalcin if (!options->used[i]) { 16992d747510SLisandro Dalcin if (names) (*names)[n] = options->names[i]; 17002d747510SLisandro Dalcin if (values) (*values)[n] = options->values[i]; 17012d747510SLisandro Dalcin n++; 17022d747510SLisandro Dalcin } 17032d747510SLisandro Dalcin } 17042d747510SLisandro Dalcin } 17052d747510SLisandro Dalcin PetscFunctionReturn(0); 17062d747510SLisandro Dalcin } 17072d747510SLisandro Dalcin 17082d747510SLisandro Dalcin /*@C 17092d747510SLisandro Dalcin PetscOptionsLeftRestore - Free memory for the unused PETSc options obtained using PetscOptionsLeftGet. 17102d747510SLisandro Dalcin 17112d747510SLisandro Dalcin Not Collective 17122d747510SLisandro Dalcin 17132d747510SLisandro Dalcin Input Parameter: 1714a2b725a8SWilliam Gropp + options - options database, use NULL for default global database 17152d747510SLisandro Dalcin . names - names of options not used 1716a2b725a8SWilliam Gropp - values - values of options not used 17172d747510SLisandro Dalcin 17182d747510SLisandro Dalcin Level: advanced 17192d747510SLisandro Dalcin 17202d747510SLisandro Dalcin .seealso: PetscOptionsAllUsed(), PetscOptionsLeft(), PetscOptionsLeftGet() 17212d747510SLisandro Dalcin @*/ 17222d747510SLisandro Dalcin PetscErrorCode PetscOptionsLeftRestore(PetscOptions options,PetscInt *N,char **names[],char **values[]) 17232d747510SLisandro Dalcin { 17242d747510SLisandro Dalcin PetscErrorCode ierr; 17252d747510SLisandro Dalcin 17262d747510SLisandro Dalcin PetscFunctionBegin; 17272d747510SLisandro Dalcin if (N) PetscValidIntPointer(N,2); 17282d747510SLisandro Dalcin if (names) PetscValidPointer(names,3); 17292d747510SLisandro Dalcin if (values) PetscValidPointer(values,4); 17302d747510SLisandro Dalcin if (N) { *N = 0; } 17312d747510SLisandro Dalcin if (names) { ierr = PetscFree(*names);CHKERRQ(ierr); } 17322d747510SLisandro Dalcin if (values) { ierr = PetscFree(*values);CHKERRQ(ierr); } 17332d747510SLisandro Dalcin PetscFunctionReturn(0); 17342d747510SLisandro Dalcin } 17352d747510SLisandro Dalcin 17362d747510SLisandro Dalcin /*@C 17372d747510SLisandro Dalcin PetscOptionsSetFromOptions - Sets options related to the handling of options in PETSc 17382d747510SLisandro Dalcin 17392d747510SLisandro Dalcin Collective on PETSC_COMM_WORLD 17402d747510SLisandro Dalcin 17412d747510SLisandro Dalcin Input Parameter: 17422d747510SLisandro Dalcin . options - options database, use NULL for default global database 17432d747510SLisandro Dalcin 17442d747510SLisandro Dalcin Options Database Keys: 17452d747510SLisandro Dalcin + -options_monitor <optional filename> - prints the names and values of all runtime options as they are set. The monitor functionality is not 17462d747510SLisandro Dalcin available for options set through a file, environment variable, or on 17472d747510SLisandro Dalcin the command line. Only options set after PetscInitialize() completes will 17482d747510SLisandro Dalcin be monitored. 1749a2b725a8SWilliam Gropp - -options_monitor_cancel - cancel all options database monitors 17502d747510SLisandro Dalcin 17512d747510SLisandro Dalcin Notes: 17521c9f3c13SBarry Smith To see all options, run your program with the -help option 17532d747510SLisandro Dalcin 17542d747510SLisandro Dalcin Level: intermediate 17552d747510SLisandro Dalcin 17562d747510SLisandro Dalcin @*/ 17572d747510SLisandro Dalcin PetscErrorCode PetscOptionsSetFromOptions(PetscOptions options) 17582d747510SLisandro Dalcin { 17592d747510SLisandro Dalcin PetscBool flgc = PETSC_FALSE,flgm; 17602d747510SLisandro Dalcin PetscErrorCode ierr; 17612d747510SLisandro Dalcin char monfilename[PETSC_MAX_PATH_LEN]; 17622d747510SLisandro Dalcin PetscViewer monviewer; 17632d747510SLisandro Dalcin 17642d747510SLisandro Dalcin PetscFunctionBegin; 17652d747510SLisandro Dalcin /* 17662d747510SLisandro Dalcin The options argument is currently ignored since we currently maintain only a single options database 17672d747510SLisandro Dalcin 17682d747510SLisandro Dalcin options = options ? options : defaultoptions; 17692d747510SLisandro Dalcin */ 17702d747510SLisandro Dalcin ierr = PetscOptionsBegin(PETSC_COMM_WORLD,NULL,"Options for handling options","PetscOptions");CHKERRQ(ierr); 17712d747510SLisandro Dalcin ierr = PetscOptionsString("-options_monitor","Monitor options database","PetscOptionsMonitorSet","stdout",monfilename,PETSC_MAX_PATH_LEN,&flgm);CHKERRQ(ierr); 17722d747510SLisandro Dalcin ierr = PetscOptionsBool("-options_monitor_cancel","Cancel all options database monitors","PetscOptionsMonitorCancel",flgc,&flgc,NULL);CHKERRQ(ierr); 17732d747510SLisandro Dalcin ierr = PetscOptionsEnd();CHKERRQ(ierr); 17742d747510SLisandro Dalcin if (flgm) { 17752d747510SLisandro Dalcin ierr = PetscViewerASCIIOpen(PETSC_COMM_WORLD,monfilename,&monviewer);CHKERRQ(ierr); 17762d747510SLisandro Dalcin ierr = PetscOptionsMonitorSet(PetscOptionsMonitorDefault,monviewer,(PetscErrorCode (*)(void**))PetscViewerDestroy);CHKERRQ(ierr); 17772d747510SLisandro Dalcin } 17782d747510SLisandro Dalcin if (flgc) { ierr = PetscOptionsMonitorCancel();CHKERRQ(ierr); } 17792d747510SLisandro Dalcin PetscFunctionReturn(0); 17802d747510SLisandro Dalcin } 17812d747510SLisandro Dalcin 17822d747510SLisandro Dalcin /*@C 17832d747510SLisandro Dalcin PetscOptionsMonitorDefault - Print all options set value events. 17842d747510SLisandro Dalcin 17851c9f3c13SBarry Smith Logically Collective on ctx 17862d747510SLisandro Dalcin 17872d747510SLisandro Dalcin Input Parameters: 17882d747510SLisandro Dalcin + name - option name string 17892d747510SLisandro Dalcin . value - option value string 17902d747510SLisandro Dalcin - ctx - an ASCII viewer 17912d747510SLisandro Dalcin 17922d747510SLisandro Dalcin Level: intermediate 17932d747510SLisandro Dalcin 17949666a313SBarry Smith Notes: 17959666a313SBarry Smith The first MPI rank in the PetscViewer viewer actually prints the values, other 17961c9f3c13SBarry Smith processes may have different values set 17971c9f3c13SBarry Smith 17982d747510SLisandro Dalcin .seealso: PetscOptionsMonitorSet() 17992d747510SLisandro Dalcin @*/ 18002d747510SLisandro Dalcin PetscErrorCode PetscOptionsMonitorDefault(const char name[],const char value[],void *ctx) 18012d747510SLisandro Dalcin { 18022d747510SLisandro Dalcin PetscErrorCode ierr; 18032d747510SLisandro Dalcin PetscViewer viewer = (PetscViewer)ctx; 18042d747510SLisandro Dalcin 18052d747510SLisandro Dalcin PetscFunctionBegin; 18062d747510SLisandro Dalcin if (!value) { 18072d747510SLisandro Dalcin ierr = PetscViewerASCIIPrintf(viewer,"Removing option: %s\n",name,value);CHKERRQ(ierr); 18082d747510SLisandro Dalcin } else if (!value[0]) { 18092d747510SLisandro Dalcin ierr = PetscViewerASCIIPrintf(viewer,"Setting option: %s (no value)\n",name);CHKERRQ(ierr); 18102d747510SLisandro Dalcin } else { 18112d747510SLisandro Dalcin ierr = PetscViewerASCIIPrintf(viewer,"Setting option: %s = %s\n",name,value);CHKERRQ(ierr); 18122d747510SLisandro Dalcin } 18132d747510SLisandro Dalcin PetscFunctionReturn(0); 18142d747510SLisandro Dalcin } 18152d747510SLisandro Dalcin 18162d747510SLisandro Dalcin /*@C 18172d747510SLisandro Dalcin PetscOptionsMonitorSet - Sets an ADDITIONAL function to be called at every method that 18182d747510SLisandro Dalcin modified the PETSc options database. 18192d747510SLisandro Dalcin 18202d747510SLisandro Dalcin Not Collective 18212d747510SLisandro Dalcin 18222d747510SLisandro Dalcin Input Parameters: 18232d747510SLisandro Dalcin + monitor - pointer to function (if this is NULL, it turns off monitoring 18242d747510SLisandro Dalcin . mctx - [optional] context for private data for the 18252d747510SLisandro Dalcin monitor routine (use NULL if no context is desired) 18262d747510SLisandro Dalcin - monitordestroy - [optional] routine that frees monitor context 18272d747510SLisandro Dalcin (may be NULL) 18282d747510SLisandro Dalcin 18292d747510SLisandro Dalcin Calling Sequence of monitor: 18302d747510SLisandro Dalcin $ monitor (const char name[], const char value[], void *mctx) 18312d747510SLisandro Dalcin 18322d747510SLisandro Dalcin + name - option name string 18332d747510SLisandro Dalcin . value - option value string 18342d747510SLisandro Dalcin - mctx - optional monitoring context, as set by PetscOptionsMonitorSet() 18352d747510SLisandro Dalcin 18362d747510SLisandro Dalcin Options Database Keys: 18372d747510SLisandro Dalcin + -options_monitor - sets PetscOptionsMonitorDefault() 18382d747510SLisandro Dalcin - -options_monitor_cancel - cancels all monitors that have 18392d747510SLisandro Dalcin been hardwired into a code by 18402d747510SLisandro Dalcin calls to PetscOptionsMonitorSet(), but 18412d747510SLisandro Dalcin does not cancel those set via 18422d747510SLisandro Dalcin the options database. 18432d747510SLisandro Dalcin 18442d747510SLisandro Dalcin Notes: 18452d747510SLisandro Dalcin The default is to do nothing. To print the name and value of options 18462d747510SLisandro Dalcin being inserted into the database, use PetscOptionsMonitorDefault() as the monitoring routine, 18472d747510SLisandro Dalcin with a null monitoring context. 18482d747510SLisandro Dalcin 18492d747510SLisandro Dalcin Several different monitoring routines may be set by calling 18502d747510SLisandro Dalcin PetscOptionsMonitorSet() multiple times; all will be called in the 18512d747510SLisandro Dalcin order in which they were set. 18522d747510SLisandro Dalcin 18532d747510SLisandro Dalcin Level: beginner 18542d747510SLisandro Dalcin 18552d747510SLisandro Dalcin .seealso: PetscOptionsMonitorDefault(), PetscOptionsMonitorCancel() 18562d747510SLisandro Dalcin @*/ 18572d747510SLisandro Dalcin PetscErrorCode PetscOptionsMonitorSet(PetscErrorCode (*monitor)(const char name[], const char value[], void*),void *mctx,PetscErrorCode (*monitordestroy)(void**)) 18582d747510SLisandro Dalcin { 18592d747510SLisandro Dalcin PetscOptions options = defaultoptions; 18602d747510SLisandro Dalcin 18612d747510SLisandro Dalcin PetscFunctionBegin; 18622d747510SLisandro Dalcin if (options->numbermonitors >= MAXOPTIONSMONITORS) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Too many PetscOptions monitors set"); 18632d747510SLisandro Dalcin options->monitor[options->numbermonitors] = monitor; 18642d747510SLisandro Dalcin options->monitordestroy[options->numbermonitors] = monitordestroy; 18652d747510SLisandro Dalcin options->monitorcontext[options->numbermonitors++] = (void*)mctx; 18662d747510SLisandro Dalcin PetscFunctionReturn(0); 18672d747510SLisandro Dalcin } 18682d747510SLisandro Dalcin 18692d747510SLisandro Dalcin /*@ 18702d747510SLisandro Dalcin PetscOptionsMonitorCancel - Clears all monitors for a PetscOptions object. 18712d747510SLisandro Dalcin 18722d747510SLisandro Dalcin Not Collective 18732d747510SLisandro Dalcin 18742d747510SLisandro Dalcin Options Database Key: 18752d747510SLisandro Dalcin . -options_monitor_cancel - Cancels all monitors that have 18762d747510SLisandro Dalcin been hardwired into a code by calls to PetscOptionsMonitorSet(), 18772d747510SLisandro Dalcin but does not cancel those set via the options database. 18782d747510SLisandro Dalcin 18792d747510SLisandro Dalcin Level: intermediate 18802d747510SLisandro Dalcin 18812d747510SLisandro Dalcin .seealso: PetscOptionsMonitorDefault(), PetscOptionsMonitorSet() 18822d747510SLisandro Dalcin @*/ 18832d747510SLisandro Dalcin PetscErrorCode PetscOptionsMonitorCancel(void) 18842d747510SLisandro Dalcin { 18852d747510SLisandro Dalcin PetscErrorCode ierr; 18862d747510SLisandro Dalcin PetscInt i; 18872d747510SLisandro Dalcin PetscOptions options = defaultoptions; 18882d747510SLisandro Dalcin 18892d747510SLisandro Dalcin PetscFunctionBegin; 18902d747510SLisandro Dalcin for (i=0; i<options->numbermonitors; i++) { 18912d747510SLisandro Dalcin if (options->monitordestroy[i]) { 18922d747510SLisandro Dalcin ierr = (*options->monitordestroy[i])(&options->monitorcontext[i]);CHKERRQ(ierr); 18932d747510SLisandro Dalcin } 18942d747510SLisandro Dalcin } 18952d747510SLisandro Dalcin options->numbermonitors = 0; 18962d747510SLisandro Dalcin PetscFunctionReturn(0); 18972d747510SLisandro Dalcin } 18982d747510SLisandro Dalcin 18992d747510SLisandro Dalcin /* 19002d747510SLisandro Dalcin PetscOptionsStringToBool - Converts string to PetscBool , handles cases like "yes", "no", "true", "false", "0", "1", "off", "on". 19012d747510SLisandro Dalcin */ 19022d747510SLisandro Dalcin PetscErrorCode PetscOptionsStringToBool(const char value[],PetscBool *a) 19032d747510SLisandro Dalcin { 19042d747510SLisandro Dalcin PetscBool istrue,isfalse; 19052d747510SLisandro Dalcin size_t len; 19062d747510SLisandro Dalcin PetscErrorCode ierr; 19072d747510SLisandro Dalcin 19082d747510SLisandro Dalcin PetscFunctionBegin; 19092d747510SLisandro Dalcin ierr = PetscStrlen(value,&len);CHKERRQ(ierr); 19102d747510SLisandro Dalcin if (!len) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Character string of length zero has no logical value"); 19112d747510SLisandro Dalcin ierr = PetscStrcasecmp(value,"TRUE",&istrue);CHKERRQ(ierr); 19122d747510SLisandro Dalcin if (istrue) {*a = PETSC_TRUE; PetscFunctionReturn(0);} 19132d747510SLisandro Dalcin ierr = PetscStrcasecmp(value,"YES",&istrue);CHKERRQ(ierr); 19142d747510SLisandro Dalcin if (istrue) {*a = PETSC_TRUE; PetscFunctionReturn(0);} 19152d747510SLisandro Dalcin ierr = PetscStrcasecmp(value,"1",&istrue);CHKERRQ(ierr); 19162d747510SLisandro Dalcin if (istrue) {*a = PETSC_TRUE; PetscFunctionReturn(0);} 19172d747510SLisandro Dalcin ierr = PetscStrcasecmp(value,"on",&istrue);CHKERRQ(ierr); 19182d747510SLisandro Dalcin if (istrue) {*a = PETSC_TRUE; PetscFunctionReturn(0);} 19192d747510SLisandro Dalcin ierr = PetscStrcasecmp(value,"FALSE",&isfalse);CHKERRQ(ierr); 19202d747510SLisandro Dalcin if (isfalse) {*a = PETSC_FALSE; PetscFunctionReturn(0);} 19212d747510SLisandro Dalcin ierr = PetscStrcasecmp(value,"NO",&isfalse);CHKERRQ(ierr); 19222d747510SLisandro Dalcin if (isfalse) {*a = PETSC_FALSE; PetscFunctionReturn(0);} 19232d747510SLisandro Dalcin ierr = PetscStrcasecmp(value,"0",&isfalse);CHKERRQ(ierr); 19242d747510SLisandro Dalcin if (isfalse) {*a = PETSC_FALSE; PetscFunctionReturn(0);} 19252d747510SLisandro Dalcin ierr = PetscStrcasecmp(value,"off",&isfalse);CHKERRQ(ierr); 19262d747510SLisandro Dalcin if (isfalse) {*a = PETSC_FALSE; PetscFunctionReturn(0);} 19272d747510SLisandro Dalcin SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Unknown logical value: %s",value); 19282d747510SLisandro Dalcin } 19292d747510SLisandro Dalcin 19302d747510SLisandro Dalcin /* 19312d747510SLisandro Dalcin PetscOptionsStringToInt - Converts a string to an integer value. Handles special cases such as "default" and "decide" 19322d747510SLisandro Dalcin */ 19332d747510SLisandro Dalcin PetscErrorCode PetscOptionsStringToInt(const char name[],PetscInt *a) 19342d747510SLisandro Dalcin { 19352d747510SLisandro Dalcin PetscErrorCode ierr; 19362d747510SLisandro Dalcin size_t len; 19372d747510SLisandro Dalcin PetscBool decide,tdefault,mouse; 19382d747510SLisandro Dalcin 19392d747510SLisandro Dalcin PetscFunctionBegin; 19402d747510SLisandro Dalcin ierr = PetscStrlen(name,&len);CHKERRQ(ierr); 19412d747510SLisandro Dalcin if (!len) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"character string of length zero has no numerical value"); 19422d747510SLisandro Dalcin 19432d747510SLisandro Dalcin ierr = PetscStrcasecmp(name,"PETSC_DEFAULT",&tdefault);CHKERRQ(ierr); 19442d747510SLisandro Dalcin if (!tdefault) { 19452d747510SLisandro Dalcin ierr = PetscStrcasecmp(name,"DEFAULT",&tdefault);CHKERRQ(ierr); 19462d747510SLisandro Dalcin } 19472d747510SLisandro Dalcin ierr = PetscStrcasecmp(name,"PETSC_DECIDE",&decide);CHKERRQ(ierr); 19482d747510SLisandro Dalcin if (!decide) { 19492d747510SLisandro Dalcin ierr = PetscStrcasecmp(name,"DECIDE",&decide);CHKERRQ(ierr); 19502d747510SLisandro Dalcin } 19512d747510SLisandro Dalcin ierr = PetscStrcasecmp(name,"mouse",&mouse);CHKERRQ(ierr); 19522d747510SLisandro Dalcin 19532d747510SLisandro Dalcin if (tdefault) *a = PETSC_DEFAULT; 19542d747510SLisandro Dalcin else if (decide) *a = PETSC_DECIDE; 19552d747510SLisandro Dalcin else if (mouse) *a = -1; 19562d747510SLisandro Dalcin else { 19572d747510SLisandro Dalcin char *endptr; 19582d747510SLisandro Dalcin long strtolval; 19592d747510SLisandro Dalcin 19602d747510SLisandro Dalcin strtolval = strtol(name,&endptr,10); 19612d747510SLisandro 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); 19622d747510SLisandro Dalcin 19632d747510SLisandro Dalcin #if defined(PETSC_USE_64BIT_INDICES) && defined(PETSC_HAVE_ATOLL) 19642d747510SLisandro Dalcin (void) strtolval; 19652d747510SLisandro Dalcin *a = atoll(name); 19662d747510SLisandro Dalcin #elif defined(PETSC_USE_64BIT_INDICES) && defined(PETSC_HAVE___INT64) 19672d747510SLisandro Dalcin (void) strtolval; 19682d747510SLisandro Dalcin *a = _atoi64(name); 19692d747510SLisandro Dalcin #else 19702d747510SLisandro Dalcin *a = (PetscInt)strtolval; 19712d747510SLisandro Dalcin #endif 19722d747510SLisandro Dalcin } 19732d747510SLisandro Dalcin PetscFunctionReturn(0); 19742d747510SLisandro Dalcin } 19752d747510SLisandro Dalcin 19762d747510SLisandro Dalcin #if defined(PETSC_USE_REAL___FLOAT128) 19772d747510SLisandro Dalcin #include <quadmath.h> 19782d747510SLisandro Dalcin #endif 19792d747510SLisandro Dalcin 19802d747510SLisandro Dalcin static PetscErrorCode PetscStrtod(const char name[],PetscReal *a,char **endptr) 19812d747510SLisandro Dalcin { 19822d747510SLisandro Dalcin PetscFunctionBegin; 19832d747510SLisandro Dalcin #if defined(PETSC_USE_REAL___FLOAT128) 19842d747510SLisandro Dalcin *a = strtoflt128(name,endptr); 19852d747510SLisandro Dalcin #else 19862d747510SLisandro Dalcin *a = (PetscReal)strtod(name,endptr); 19872d747510SLisandro Dalcin #endif 19882d747510SLisandro Dalcin PetscFunctionReturn(0); 19892d747510SLisandro Dalcin } 19902d747510SLisandro Dalcin 19912d747510SLisandro Dalcin static PetscErrorCode PetscStrtoz(const char name[],PetscScalar *a,char **endptr,PetscBool *isImaginary) 19922d747510SLisandro Dalcin { 19932d747510SLisandro Dalcin PetscBool hasi = PETSC_FALSE; 19942d747510SLisandro Dalcin char *ptr; 19952d747510SLisandro Dalcin PetscReal strtoval; 19962d747510SLisandro Dalcin PetscErrorCode ierr; 19972d747510SLisandro Dalcin 19982d747510SLisandro Dalcin PetscFunctionBegin; 19992d747510SLisandro Dalcin ierr = PetscStrtod(name,&strtoval,&ptr);CHKERRQ(ierr); 20002d747510SLisandro Dalcin if (ptr == name) { 20012d747510SLisandro Dalcin strtoval = 1.; 20022d747510SLisandro Dalcin hasi = PETSC_TRUE; 20032d747510SLisandro Dalcin if (name[0] == 'i') { 20042d747510SLisandro Dalcin ptr++; 20052d747510SLisandro Dalcin } else if (name[0] == '+' && name[1] == 'i') { 20062d747510SLisandro Dalcin ptr += 2; 20072d747510SLisandro Dalcin } else if (name[0] == '-' && name[1] == 'i') { 20082d747510SLisandro Dalcin strtoval = -1.; 20092d747510SLisandro Dalcin ptr += 2; 20102d747510SLisandro Dalcin } 20112d747510SLisandro Dalcin } else if (*ptr == 'i') { 20122d747510SLisandro Dalcin hasi = PETSC_TRUE; 20132d747510SLisandro Dalcin ptr++; 20142d747510SLisandro Dalcin } 20152d747510SLisandro Dalcin *endptr = ptr; 20162d747510SLisandro Dalcin *isImaginary = hasi; 20172d747510SLisandro Dalcin if (hasi) { 20182d747510SLisandro Dalcin #if !defined(PETSC_USE_COMPLEX) 20192d747510SLisandro Dalcin SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Input string %s contains imaginary but complex not supported ",name); 20202d747510SLisandro Dalcin #else 20212d747510SLisandro Dalcin *a = PetscCMPLX(0.,strtoval); 20222d747510SLisandro Dalcin #endif 20232d747510SLisandro Dalcin } else { 20242d747510SLisandro Dalcin *a = strtoval; 20252d747510SLisandro Dalcin } 20262d747510SLisandro Dalcin PetscFunctionReturn(0); 20272d747510SLisandro Dalcin } 20282d747510SLisandro Dalcin 20292d747510SLisandro Dalcin /* 20302d747510SLisandro Dalcin Converts a string to PetscReal value. Handles special cases like "default" and "decide" 20312d747510SLisandro Dalcin */ 20322d747510SLisandro Dalcin PetscErrorCode PetscOptionsStringToReal(const char name[],PetscReal *a) 20332d747510SLisandro Dalcin { 20342d747510SLisandro Dalcin size_t len; 20352d747510SLisandro Dalcin PetscBool match; 20362d747510SLisandro Dalcin char *endptr; 20372d747510SLisandro Dalcin PetscErrorCode ierr; 20382d747510SLisandro Dalcin 20392d747510SLisandro Dalcin PetscFunctionBegin; 20402d747510SLisandro Dalcin ierr = PetscStrlen(name,&len);CHKERRQ(ierr); 20412d747510SLisandro Dalcin if (!len) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"String of length zero has no numerical value"); 20422d747510SLisandro Dalcin 20432d747510SLisandro Dalcin ierr = PetscStrcasecmp(name,"PETSC_DEFAULT",&match);CHKERRQ(ierr); 20442d747510SLisandro Dalcin if (!match) { 20452d747510SLisandro Dalcin ierr = PetscStrcasecmp(name,"DEFAULT",&match);CHKERRQ(ierr); 20462d747510SLisandro Dalcin } 20472d747510SLisandro Dalcin if (match) {*a = PETSC_DEFAULT; PetscFunctionReturn(0);} 20482d747510SLisandro Dalcin 20492d747510SLisandro Dalcin ierr = PetscStrcasecmp(name,"PETSC_DECIDE",&match);CHKERRQ(ierr); 20502d747510SLisandro Dalcin if (!match) { 20512d747510SLisandro Dalcin ierr = PetscStrcasecmp(name,"DECIDE",&match);CHKERRQ(ierr); 20522d747510SLisandro Dalcin } 20532d747510SLisandro Dalcin if (match) {*a = PETSC_DECIDE; PetscFunctionReturn(0);} 20542d747510SLisandro Dalcin 20552d747510SLisandro Dalcin ierr = PetscStrtod(name,a,&endptr);CHKERRQ(ierr); 20562d747510SLisandro Dalcin if ((size_t) (endptr - name) != len) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Input string %s has no numeric value",name); 20572d747510SLisandro Dalcin PetscFunctionReturn(0); 20582d747510SLisandro Dalcin } 20592d747510SLisandro Dalcin 20602d747510SLisandro Dalcin PetscErrorCode PetscOptionsStringToScalar(const char name[],PetscScalar *a) 20612d747510SLisandro Dalcin { 20622d747510SLisandro Dalcin PetscBool imag1; 20632d747510SLisandro Dalcin size_t len; 20642d747510SLisandro Dalcin PetscScalar val = 0.; 20652d747510SLisandro Dalcin char *ptr = NULL; 20662d747510SLisandro Dalcin PetscErrorCode ierr; 20672d747510SLisandro Dalcin 20682d747510SLisandro Dalcin PetscFunctionBegin; 20692d747510SLisandro Dalcin ierr = PetscStrlen(name,&len);CHKERRQ(ierr); 20702d747510SLisandro Dalcin if (!len) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"character string of length zero has no numerical value"); 20712d747510SLisandro Dalcin ierr = PetscStrtoz(name,&val,&ptr,&imag1);CHKERRQ(ierr); 20722d747510SLisandro Dalcin #if defined(PETSC_USE_COMPLEX) 20732d747510SLisandro Dalcin if ((size_t) (ptr - name) < len) { 20742d747510SLisandro Dalcin PetscBool imag2; 20752d747510SLisandro Dalcin PetscScalar val2; 20762d747510SLisandro Dalcin 20772d747510SLisandro Dalcin ierr = PetscStrtoz(ptr,&val2,&ptr,&imag2);CHKERRQ(ierr); 20782d747510SLisandro Dalcin if (imag1 || !imag2) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Input string %s: must specify imaginary component second",name); 20792d747510SLisandro Dalcin val = PetscCMPLX(PetscRealPart(val),PetscImaginaryPart(val2)); 20802d747510SLisandro Dalcin } 20812d747510SLisandro Dalcin #endif 20822d747510SLisandro Dalcin if ((size_t) (ptr - name) != len) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Input string %s has no numeric value ",name); 20832d747510SLisandro Dalcin *a = val; 20842d747510SLisandro Dalcin PetscFunctionReturn(0); 20852d747510SLisandro Dalcin } 20862d747510SLisandro Dalcin 20872d747510SLisandro Dalcin /*@C 20882d747510SLisandro Dalcin PetscOptionsGetBool - Gets the Logical (true or false) value for a particular 20892d747510SLisandro Dalcin option in the database. 2090e5c89e4eSSatish Balay 2091e5c89e4eSSatish Balay Not Collective 2092e5c89e4eSSatish Balay 2093e5c89e4eSSatish Balay Input Parameters: 20945c9cc608SHong Zhang + options - options database, use NULL for default global database 2095c5929fdfSBarry Smith . pre - the string to prepend to the name or NULL 2096e5c89e4eSSatish Balay - name - the option one is seeking 2097e5c89e4eSSatish Balay 2098e5c89e4eSSatish Balay Output Parameter: 20992d747510SLisandro Dalcin + ivalue - the logical value to return 210096ef3cdfSSatish Balay - set - PETSC_TRUE if found, else PETSC_FALSE 2101e5c89e4eSSatish Balay 2102e5c89e4eSSatish Balay Level: beginner 2103e5c89e4eSSatish Balay 210495452b02SPatrick Sanan Notes: 21052d747510SLisandro Dalcin TRUE, true, YES, yes, nostring, and 1 all translate to PETSC_TRUE 21062d747510SLisandro Dalcin FALSE, false, NO, no, and 0 all translate to PETSC_FALSE 21072d747510SLisandro Dalcin 21082d747510SLisandro 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 21092d747510SLisandro Dalcin is equivalent to -requested_bool true 21102d747510SLisandro Dalcin 21112d747510SLisandro Dalcin If the user does not supply the option at all ivalue is NOT changed. Thus 21122efd9cb1SBarry Smith you should ALWAYS initialize the ivalue if you access it without first checking if the set flag is true. 21132efd9cb1SBarry Smith 2114e5c89e4eSSatish Balay .seealso: PetscOptionsGetReal(), PetscOptionsHasName(), PetscOptionsGetString(), 21152d747510SLisandro Dalcin PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsGetInt(), PetscOptionsBool(), 2116e5c89e4eSSatish Balay PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 2117e5c89e4eSSatish Balay PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 2118acfcf0e5SJed Brown PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 2119a264d7a6SBarry Smith PetscOptionsFList(), PetscOptionsEList() 2120e5c89e4eSSatish Balay @*/ 21212d747510SLisandro Dalcin PetscErrorCode PetscOptionsGetBool(PetscOptions options,const char pre[],const char name[],PetscBool *ivalue,PetscBool *set) 2122e5c89e4eSSatish Balay { 21232d747510SLisandro Dalcin const char *value; 2124ace3abfcSBarry Smith PetscBool flag; 21252d747510SLisandro Dalcin PetscErrorCode ierr; 2126e5c89e4eSSatish Balay 2127e5c89e4eSSatish Balay PetscFunctionBegin; 21282d747510SLisandro Dalcin PetscValidCharPointer(name,3); 21292d747510SLisandro Dalcin if (ivalue) PetscValidIntPointer(ivalue,4); 21302d747510SLisandro Dalcin ierr = PetscOptionsFindPair(options,pre,name,&value,&flag);CHKERRQ(ierr); 2131e5c89e4eSSatish Balay if (flag) { 213296ef3cdfSSatish Balay if (set) *set = PETSC_TRUE; 21332d747510SLisandro Dalcin if (!value) { 21342d747510SLisandro Dalcin if (ivalue) *ivalue = PETSC_TRUE; 21352d747510SLisandro Dalcin } else { 21362d747510SLisandro Dalcin ierr = PetscOptionsStringToBool(value, &flag);CHKERRQ(ierr); 21372d747510SLisandro Dalcin if (ivalue) *ivalue = flag; 2138e5c89e4eSSatish Balay } 2139e5c89e4eSSatish Balay } else { 214096ef3cdfSSatish Balay if (set) *set = PETSC_FALSE; 2141e5c89e4eSSatish Balay } 2142e5c89e4eSSatish Balay PetscFunctionReturn(0); 2143e5c89e4eSSatish Balay } 2144e5c89e4eSSatish Balay 2145e5c89e4eSSatish Balay /*@C 2146e5c89e4eSSatish Balay PetscOptionsGetEList - Puts a list of option values that a single one may be selected from 2147e5c89e4eSSatish Balay 2148e5c89e4eSSatish Balay Not Collective 2149e5c89e4eSSatish Balay 2150e5c89e4eSSatish Balay Input Parameters: 21515c9cc608SHong Zhang + options - options database, use NULL for default global database 2152c5929fdfSBarry Smith . pre - the string to prepend to the name or NULL 2153e5c89e4eSSatish Balay . opt - option name 2154a264d7a6SBarry Smith . list - the possible choices (one of these must be selected, anything else is invalid) 2155a2b725a8SWilliam Gropp - ntext - number of choices 2156e5c89e4eSSatish Balay 2157e5c89e4eSSatish Balay Output Parameter: 21582efd9cb1SBarry Smith + value - the index of the value to return (defaults to zero if the option name is given but no choice is listed) 2159e5c89e4eSSatish Balay - set - PETSC_TRUE if found, else PETSC_FALSE 2160e5c89e4eSSatish Balay 2161e5c89e4eSSatish Balay Level: intermediate 2162e5c89e4eSSatish Balay 216395452b02SPatrick Sanan Notes: 216495452b02SPatrick Sanan If the user does not supply the option value is NOT changed. Thus 21652efd9cb1SBarry Smith you should ALWAYS initialize the ivalue if you access it without first checking if the set flag is true. 21662efd9cb1SBarry Smith 2167a264d7a6SBarry Smith See PetscOptionsFList() for when the choices are given in a PetscFunctionList() 2168e5c89e4eSSatish Balay 2169e5c89e4eSSatish Balay .seealso: PetscOptionsGetInt(), PetscOptionsGetReal(), 2170acfcf0e5SJed Brown PetscOptionsHasName(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool(), 2171e5c89e4eSSatish Balay PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 2172e5c89e4eSSatish Balay PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 2173acfcf0e5SJed Brown PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 2174a264d7a6SBarry Smith PetscOptionsFList(), PetscOptionsEList() 2175e5c89e4eSSatish Balay @*/ 2176c5929fdfSBarry Smith PetscErrorCode PetscOptionsGetEList(PetscOptions options,const char pre[],const char opt[],const char * const *list,PetscInt ntext,PetscInt *value,PetscBool *set) 2177e5c89e4eSSatish Balay { 2178e5c89e4eSSatish Balay PetscErrorCode ierr; 217958b0ac4eSStefano Zampini size_t alen,len = 0, tlen = 0; 2180e5c89e4eSSatish Balay char *svalue; 2181ace3abfcSBarry Smith PetscBool aset,flg = PETSC_FALSE; 2182e5c89e4eSSatish Balay PetscInt i; 2183e5c89e4eSSatish Balay 2184e5c89e4eSSatish Balay PetscFunctionBegin; 21852d747510SLisandro Dalcin PetscValidCharPointer(opt,3); 2186e5c89e4eSSatish Balay for (i=0; i<ntext; i++) { 2187e5c89e4eSSatish Balay ierr = PetscStrlen(list[i],&alen);CHKERRQ(ierr); 2188e5c89e4eSSatish Balay if (alen > len) len = alen; 218958b0ac4eSStefano Zampini tlen += len + 1; 2190e5c89e4eSSatish Balay } 2191e5c89e4eSSatish Balay len += 5; /* a little extra space for user mistypes */ 2192785e854fSJed Brown ierr = PetscMalloc1(len,&svalue);CHKERRQ(ierr); 2193c5929fdfSBarry Smith ierr = PetscOptionsGetString(options,pre,opt,svalue,len,&aset);CHKERRQ(ierr); 2194e5c89e4eSSatish Balay if (aset) { 2195fbedd5e0SJed Brown ierr = PetscEListFind(ntext,list,svalue,value,&flg);CHKERRQ(ierr); 219658b0ac4eSStefano Zampini if (!flg) { 219758b0ac4eSStefano Zampini char *avail,*pavl; 219858b0ac4eSStefano Zampini 219958b0ac4eSStefano Zampini ierr = PetscMalloc1(tlen,&avail);CHKERRQ(ierr); 220058b0ac4eSStefano Zampini pavl = avail; 220158b0ac4eSStefano Zampini for (i=0; i<ntext; i++) { 220258b0ac4eSStefano Zampini ierr = PetscStrlen(list[i],&alen);CHKERRQ(ierr); 220358b0ac4eSStefano Zampini ierr = PetscStrcpy(pavl,list[i]);CHKERRQ(ierr); 220458b0ac4eSStefano Zampini pavl += alen; 220558b0ac4eSStefano Zampini ierr = PetscStrcpy(pavl," ");CHKERRQ(ierr); 220658b0ac4eSStefano Zampini pavl += 1; 220758b0ac4eSStefano Zampini } 220858b0ac4eSStefano Zampini ierr = PetscStrtolower(avail);CHKERRQ(ierr); 220958b0ac4eSStefano Zampini SETERRQ4(PETSC_COMM_SELF,PETSC_ERR_USER,"Unknown option %s for -%s%s. Available options: %s",svalue,pre ? pre : "",opt+1,avail); 221058b0ac4eSStefano Zampini } 2211fbedd5e0SJed Brown if (set) *set = PETSC_TRUE; 2212a297a907SKarl Rupp } else if (set) *set = PETSC_FALSE; 2213e5c89e4eSSatish Balay ierr = PetscFree(svalue);CHKERRQ(ierr); 2214e5c89e4eSSatish Balay PetscFunctionReturn(0); 2215e5c89e4eSSatish Balay } 2216e5c89e4eSSatish Balay 2217e5c89e4eSSatish Balay /*@C 2218e5c89e4eSSatish Balay PetscOptionsGetEnum - Gets the enum value for a particular option in the database. 2219e5c89e4eSSatish Balay 2220e5c89e4eSSatish Balay Not Collective 2221e5c89e4eSSatish Balay 2222e5c89e4eSSatish Balay Input Parameters: 22235c9cc608SHong Zhang + options - options database, use NULL for default global database 2224c5929fdfSBarry Smith . pre - option prefix or NULL 2225e5c89e4eSSatish Balay . opt - option name 2226e5c89e4eSSatish Balay . list - array containing the list of choices, followed by the enum name, followed by the enum prefix, followed by a null 2227e5c89e4eSSatish Balay - defaultv - the default (current) value 2228e5c89e4eSSatish Balay 2229e5c89e4eSSatish Balay Output Parameter: 2230e5c89e4eSSatish Balay + value - the value to return 223196ef3cdfSSatish Balay - set - PETSC_TRUE if found, else PETSC_FALSE 2232e5c89e4eSSatish Balay 2233e5c89e4eSSatish Balay Level: beginner 2234e5c89e4eSSatish Balay 223595452b02SPatrick Sanan Notes: 223695452b02SPatrick Sanan If the user does not supply the option value is NOT changed. Thus 22372efd9cb1SBarry Smith you should ALWAYS initialize the ivalue if you access it without first checking if the set flag is true. 2238e5c89e4eSSatish Balay 22392efd9cb1SBarry Smith List is usually something like PCASMTypes or some other predefined list of enum names 2240e5c89e4eSSatish Balay 2241e5c89e4eSSatish Balay .seealso: PetscOptionsGetReal(), PetscOptionsHasName(), PetscOptionsGetString(), PetscOptionsGetInt(), 2242acfcf0e5SJed Brown PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool() 2243acfcf0e5SJed Brown PetscOptionsInt(), PetscOptionsString(), PetscOptionsReal(), PetscOptionsBool(), 2244e5c89e4eSSatish Balay PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 2245e5c89e4eSSatish Balay PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 2246acfcf0e5SJed Brown PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 2247a264d7a6SBarry Smith PetscOptionsFList(), PetscOptionsEList(), PetscOptionsGetEList(), PetscOptionsEnum() 2248e5c89e4eSSatish Balay @*/ 2249c5929fdfSBarry Smith PetscErrorCode PetscOptionsGetEnum(PetscOptions options,const char pre[],const char opt[],const char * const *list,PetscEnum *value,PetscBool *set) 2250e5c89e4eSSatish Balay { 2251e5c89e4eSSatish Balay PetscErrorCode ierr; 225269a24498SJed Brown PetscInt ntext = 0,tval; 2253ace3abfcSBarry Smith PetscBool fset; 2254e5c89e4eSSatish Balay 2255e5c89e4eSSatish Balay PetscFunctionBegin; 22562d747510SLisandro Dalcin PetscValidCharPointer(opt,3); 2257e5c89e4eSSatish Balay while (list[ntext++]) { 2258e32f2f54SBarry Smith if (ntext > 50) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"List argument appears to be wrong or have more than 50 entries"); 2259e5c89e4eSSatish Balay } 2260e32f2f54SBarry Smith if (ntext < 3) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"List argument must have at least two entries: typename and type prefix"); 2261e5c89e4eSSatish Balay ntext -= 3; 2262c5929fdfSBarry Smith ierr = PetscOptionsGetEList(options,pre,opt,list,ntext,&tval,&fset);CHKERRQ(ierr); 226369a24498SJed Brown /* with PETSC_USE_64BIT_INDICES sizeof(PetscInt) != sizeof(PetscEnum) */ 2264809ceb46SBarry Smith if (fset) *value = (PetscEnum)tval; 2265809ceb46SBarry Smith if (set) *set = fset; 2266e5c89e4eSSatish Balay PetscFunctionReturn(0); 2267e5c89e4eSSatish Balay } 2268e5c89e4eSSatish Balay 2269e5c89e4eSSatish Balay /*@C 22702d747510SLisandro Dalcin PetscOptionsGetInt - Gets the integer value for a particular option in the database. 2271e5c89e4eSSatish Balay 2272e5c89e4eSSatish Balay Not Collective 2273e5c89e4eSSatish Balay 2274e5c89e4eSSatish Balay Input Parameters: 22755c9cc608SHong Zhang + options - options database, use NULL for default global database 2276c5929fdfSBarry Smith . pre - the string to prepend to the name or NULL 2277e5c89e4eSSatish Balay - name - the option one is seeking 2278e5c89e4eSSatish Balay 2279e5c89e4eSSatish Balay Output Parameter: 22802d747510SLisandro Dalcin + ivalue - the integer value to return 228196ef3cdfSSatish Balay - set - PETSC_TRUE if found, else PETSC_FALSE 2282e5c89e4eSSatish Balay 2283e5c89e4eSSatish Balay Level: beginner 2284e5c89e4eSSatish Balay 2285e5c89e4eSSatish Balay Notes: 22862d747510SLisandro Dalcin If the user does not supply the option ivalue is NOT changed. Thus 22872efd9cb1SBarry Smith you should ALWAYS initialize the ivalue if you access it without first checking if the set flag is true. 22885c07ccb8SBarry Smith 2289e5c89e4eSSatish Balay .seealso: PetscOptionsGetReal(), PetscOptionsHasName(), PetscOptionsGetString(), 22902d747510SLisandro Dalcin PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool() 22912d747510SLisandro Dalcin PetscOptionsInt(), PetscOptionsString(), PetscOptionsReal(), PetscOptionsBool(), 2292e5c89e4eSSatish Balay PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 2293e5c89e4eSSatish Balay PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 2294acfcf0e5SJed Brown PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 2295a264d7a6SBarry Smith PetscOptionsFList(), PetscOptionsEList() 2296e5c89e4eSSatish Balay @*/ 22972d747510SLisandro Dalcin PetscErrorCode PetscOptionsGetInt(PetscOptions options,const char pre[],const char name[],PetscInt *ivalue,PetscBool *set) 2298e5c89e4eSSatish Balay { 22992d747510SLisandro Dalcin const char *value; 2300e5c89e4eSSatish Balay PetscErrorCode ierr; 23012d747510SLisandro Dalcin PetscBool flag; 2302e5c89e4eSSatish Balay 2303e5c89e4eSSatish Balay PetscFunctionBegin; 23042d747510SLisandro Dalcin PetscValidCharPointer(name,3); 23052d747510SLisandro Dalcin PetscValidIntPointer(ivalue,4); 23062d747510SLisandro Dalcin ierr = PetscOptionsFindPair(options,pre,name,&value,&flag);CHKERRQ(ierr); 2307e5c89e4eSSatish Balay if (flag) { 230834a9cc2cSBarry Smith if (!value) { 23092d747510SLisandro Dalcin if (set) *set = PETSC_FALSE; 231034a9cc2cSBarry Smith } else { 23112d747510SLisandro Dalcin if (set) *set = PETSC_TRUE; 23122d747510SLisandro Dalcin ierr = PetscOptionsStringToInt(value,ivalue);CHKERRQ(ierr); 2313e5c89e4eSSatish Balay } 2314e5c89e4eSSatish Balay } else { 231596ef3cdfSSatish Balay if (set) *set = PETSC_FALSE; 2316e5c89e4eSSatish Balay } 2317e5c89e4eSSatish Balay PetscFunctionReturn(0); 2318e5c89e4eSSatish Balay } 2319e5c89e4eSSatish Balay 2320e2446a98SMatthew Knepley /*@C 2321e5c89e4eSSatish Balay PetscOptionsGetReal - Gets the double precision value for a particular 2322e5c89e4eSSatish Balay option in the database. 2323e5c89e4eSSatish Balay 2324e5c89e4eSSatish Balay Not Collective 2325e5c89e4eSSatish Balay 2326e5c89e4eSSatish Balay Input Parameters: 23275c9cc608SHong Zhang + options - options database, use NULL for default global database 2328c5929fdfSBarry Smith . pre - string to prepend to each name or NULL 2329e5c89e4eSSatish Balay - name - the option one is seeking 2330e5c89e4eSSatish Balay 2331e5c89e4eSSatish Balay Output Parameter: 2332e5c89e4eSSatish Balay + dvalue - the double value to return 233396ef3cdfSSatish Balay - set - PETSC_TRUE if found, PETSC_FALSE if not found 2334e5c89e4eSSatish Balay 233595452b02SPatrick Sanan Notes: 233695452b02SPatrick Sanan If the user does not supply the option dvalue is NOT changed. Thus 23372efd9cb1SBarry Smith you should ALWAYS initialize the ivalue if you access it without first checking if the set flag is true. 2338e4974155SBarry Smith 2339e5c89e4eSSatish Balay Level: beginner 2340e5c89e4eSSatish Balay 2341e5c89e4eSSatish Balay .seealso: PetscOptionsGetInt(), PetscOptionsHasName(), 2342acfcf0e5SJed Brown PetscOptionsGetString(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(),PetscOptionsBool(), 2343e5c89e4eSSatish Balay PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 2344e5c89e4eSSatish Balay PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 2345acfcf0e5SJed Brown PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 2346a264d7a6SBarry Smith PetscOptionsFList(), PetscOptionsEList() 2347e5c89e4eSSatish Balay @*/ 2348c5929fdfSBarry Smith PetscErrorCode PetscOptionsGetReal(PetscOptions options,const char pre[],const char name[],PetscReal *dvalue,PetscBool *set) 2349e5c89e4eSSatish Balay { 23502d747510SLisandro Dalcin const char *value; 2351ace3abfcSBarry Smith PetscBool flag; 23522d747510SLisandro Dalcin PetscErrorCode ierr; 2353e5c89e4eSSatish Balay 2354e5c89e4eSSatish Balay PetscFunctionBegin; 23552d747510SLisandro Dalcin PetscValidCharPointer(name,3); 23562d747510SLisandro Dalcin PetscValidRealPointer(dvalue,4); 23572d747510SLisandro Dalcin ierr = PetscOptionsFindPair(options,pre,name,&value,&flag);CHKERRQ(ierr); 2358e5c89e4eSSatish Balay if (flag) { 2359a297a907SKarl Rupp if (!value) { 2360a297a907SKarl Rupp if (set) *set = PETSC_FALSE; 2361a297a907SKarl Rupp } else { 2362a297a907SKarl Rupp if (set) *set = PETSC_TRUE; 2363a297a907SKarl Rupp ierr = PetscOptionsStringToReal(value,dvalue);CHKERRQ(ierr); 2364a297a907SKarl Rupp } 2365e5c89e4eSSatish Balay } else { 236696ef3cdfSSatish Balay if (set) *set = PETSC_FALSE; 2367e5c89e4eSSatish Balay } 2368e5c89e4eSSatish Balay PetscFunctionReturn(0); 2369e5c89e4eSSatish Balay } 2370e5c89e4eSSatish Balay 2371e5c89e4eSSatish Balay /*@C 2372e5c89e4eSSatish Balay PetscOptionsGetScalar - Gets the scalar value for a particular 2373e5c89e4eSSatish Balay option in the database. 2374e5c89e4eSSatish Balay 2375e5c89e4eSSatish Balay Not Collective 2376e5c89e4eSSatish Balay 2377e5c89e4eSSatish Balay Input Parameters: 23785c9cc608SHong Zhang + options - options database, use NULL for default global database 2379c5929fdfSBarry Smith . pre - string to prepend to each name or NULL 2380e5c89e4eSSatish Balay - name - the option one is seeking 2381e5c89e4eSSatish Balay 2382e5c89e4eSSatish Balay Output Parameter: 2383e5c89e4eSSatish Balay + dvalue - the double value to return 238496ef3cdfSSatish Balay - set - PETSC_TRUE if found, else PETSC_FALSE 2385e5c89e4eSSatish Balay 2386e5c89e4eSSatish Balay Level: beginner 2387e5c89e4eSSatish Balay 2388e5c89e4eSSatish Balay Usage: 2389eb4ae41dSBarry Smith A complex number 2+3i must be specified with NO spaces 2390e5c89e4eSSatish Balay 239195452b02SPatrick Sanan Notes: 239295452b02SPatrick Sanan If the user does not supply the option dvalue is NOT changed. Thus 23932efd9cb1SBarry Smith you should ALWAYS initialize the ivalue if you access it without first checking if the set flag is true. 2394e4974155SBarry Smith 2395e5c89e4eSSatish Balay .seealso: PetscOptionsGetInt(), PetscOptionsHasName(), 2396acfcf0e5SJed Brown PetscOptionsGetString(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool(), 2397e5c89e4eSSatish Balay PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 2398e5c89e4eSSatish Balay PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 2399acfcf0e5SJed Brown PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 2400a264d7a6SBarry Smith PetscOptionsFList(), PetscOptionsEList() 2401e5c89e4eSSatish Balay @*/ 2402c5929fdfSBarry Smith PetscErrorCode PetscOptionsGetScalar(PetscOptions options,const char pre[],const char name[],PetscScalar *dvalue,PetscBool *set) 2403e5c89e4eSSatish Balay { 24042d747510SLisandro Dalcin const char *value; 2405ace3abfcSBarry Smith PetscBool flag; 2406e5c89e4eSSatish Balay PetscErrorCode ierr; 2407e5c89e4eSSatish Balay 2408e5c89e4eSSatish Balay PetscFunctionBegin; 24092d747510SLisandro Dalcin PetscValidCharPointer(name,3); 24102d747510SLisandro Dalcin PetscValidScalarPointer(dvalue,4); 24112d747510SLisandro Dalcin ierr = PetscOptionsFindPair(options,pre,name,&value,&flag);CHKERRQ(ierr); 2412e5c89e4eSSatish Balay if (flag) { 2413e5c89e4eSSatish Balay if (!value) { 241496ef3cdfSSatish Balay if (set) *set = PETSC_FALSE; 2415e5c89e4eSSatish Balay } else { 2416e5c89e4eSSatish Balay #if !defined(PETSC_USE_COMPLEX) 2417cfbddea1SSatish Balay ierr = PetscOptionsStringToReal(value,dvalue);CHKERRQ(ierr); 2418e5c89e4eSSatish Balay #else 2419eb4ae41dSBarry Smith ierr = PetscOptionsStringToScalar(value,dvalue);CHKERRQ(ierr); 2420e5c89e4eSSatish Balay #endif 242196ef3cdfSSatish Balay if (set) *set = PETSC_TRUE; 2422e5c89e4eSSatish Balay } 2423e5c89e4eSSatish Balay } else { /* flag */ 242496ef3cdfSSatish Balay if (set) *set = PETSC_FALSE; 2425e5c89e4eSSatish Balay } 2426e5c89e4eSSatish Balay PetscFunctionReturn(0); 2427e5c89e4eSSatish Balay } 2428e5c89e4eSSatish Balay 2429e5c89e4eSSatish Balay /*@C 2430e5c89e4eSSatish Balay PetscOptionsGetString - Gets the string value for a particular option in 2431e5c89e4eSSatish Balay the database. 2432e5c89e4eSSatish Balay 2433e5c89e4eSSatish Balay Not Collective 2434e5c89e4eSSatish Balay 2435e5c89e4eSSatish Balay Input Parameters: 24365c9cc608SHong Zhang + options - options database, use NULL for default global database 2437c5929fdfSBarry Smith . pre - string to prepend to name or NULL 2438e5c89e4eSSatish Balay . name - the option one is seeking 2439bcbf2dc5SJed Brown - len - maximum length of the string including null termination 2440e5c89e4eSSatish Balay 2441e5c89e4eSSatish Balay Output Parameters: 2442e5c89e4eSSatish Balay + string - location to copy string 244396ef3cdfSSatish Balay - set - PETSC_TRUE if found, else PETSC_FALSE 2444e5c89e4eSSatish Balay 2445e5c89e4eSSatish Balay Level: beginner 2446e5c89e4eSSatish Balay 2447e5c89e4eSSatish Balay Fortran Note: 2448e5c89e4eSSatish Balay The Fortran interface is slightly different from the C/C++ 2449e5c89e4eSSatish Balay interface (len is not used). Sample usage in Fortran follows 2450e5c89e4eSSatish Balay .vb 2451e5c89e4eSSatish Balay character *20 string 245293e6ba5cSBarry Smith PetscErrorCode ierr 245393e6ba5cSBarry Smith PetscBool set 24541b266c99SBarry Smith call PetscOptionsGetString(PETSC_NULL_OPTIONS,PETSC_NULL_CHARACTER,'-s',string,set,ierr) 2455e5c89e4eSSatish Balay .ve 2456e5c89e4eSSatish Balay 245795452b02SPatrick Sanan Notes: 245895452b02SPatrick 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 2459e4974155SBarry Smith 24602efd9cb1SBarry Smith If the user does not use the option then the string is not changed. Thus 24612efd9cb1SBarry Smith you should ALWAYS initialize the string if you access it without first checking if the set flag is true. 24622efd9cb1SBarry Smith 2463f3dea69dSBarry Smith Note: 2464f3dea69dSBarry 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). 2465f3dea69dSBarry Smith 2466e5c89e4eSSatish Balay .seealso: PetscOptionsGetInt(), PetscOptionsGetReal(), 2467acfcf0e5SJed Brown PetscOptionsHasName(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool(), 2468e5c89e4eSSatish Balay PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 2469e5c89e4eSSatish Balay PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 2470acfcf0e5SJed Brown PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 2471a264d7a6SBarry Smith PetscOptionsFList(), PetscOptionsEList() 2472e5c89e4eSSatish Balay @*/ 2473c5929fdfSBarry Smith PetscErrorCode PetscOptionsGetString(PetscOptions options,const char pre[],const char name[],char string[],size_t len,PetscBool *set) 2474e5c89e4eSSatish Balay { 24752d747510SLisandro Dalcin const char *value; 2476ace3abfcSBarry Smith PetscBool flag; 24772d747510SLisandro Dalcin PetscErrorCode ierr; 2478e5c89e4eSSatish Balay 2479e5c89e4eSSatish Balay PetscFunctionBegin; 24802d747510SLisandro Dalcin PetscValidCharPointer(name,3); 24812d747510SLisandro Dalcin PetscValidCharPointer(string,4); 24822d747510SLisandro Dalcin ierr = PetscOptionsFindPair(options,pre,name,&value,&flag);CHKERRQ(ierr); 2483e5c89e4eSSatish Balay if (!flag) { 248496ef3cdfSSatish Balay if (set) *set = PETSC_FALSE; 2485e5c89e4eSSatish Balay } else { 248696ef3cdfSSatish Balay if (set) *set = PETSC_TRUE; 2487e5c89e4eSSatish Balay if (value) { 2488e5c89e4eSSatish Balay ierr = PetscStrncpy(string,value,len);CHKERRQ(ierr); 2489e5c89e4eSSatish Balay } else { 2490580bdb30SBarry Smith ierr = PetscArrayzero(string,len);CHKERRQ(ierr); 2491e5c89e4eSSatish Balay } 2492e5c89e4eSSatish Balay } 2493e5c89e4eSSatish Balay PetscFunctionReturn(0); 2494e5c89e4eSSatish Balay } 2495e5c89e4eSSatish Balay 2496c5929fdfSBarry Smith char *PetscOptionsGetStringMatlab(PetscOptions options,const char pre[],const char name[]) 249714ce751eSBarry Smith { 24982d747510SLisandro Dalcin const char *value; 249914ce751eSBarry Smith PetscBool flag; 25002d747510SLisandro Dalcin PetscErrorCode ierr; 250114ce751eSBarry Smith 250214ce751eSBarry Smith PetscFunctionBegin; 250302c9f0b5SLisandro Dalcin ierr = PetscOptionsFindPair(options,pre,name,&value,&flag);if (ierr) PetscFunctionReturn(NULL); 25042d747510SLisandro Dalcin if (flag) PetscFunctionReturn((char*)value); 250502c9f0b5SLisandro Dalcin else PetscFunctionReturn(NULL); 250614ce751eSBarry Smith } 250714ce751eSBarry Smith 25082d747510SLisandro Dalcin /*@C 25092d747510SLisandro Dalcin PetscOptionsGetBoolArray - Gets an array of Logical (true or false) values for a particular 25102d747510SLisandro Dalcin option in the database. The values must be separated with commas with 25112d747510SLisandro Dalcin no intervening spaces. 25122d747510SLisandro Dalcin 25132d747510SLisandro Dalcin Not Collective 25142d747510SLisandro Dalcin 25152d747510SLisandro Dalcin Input Parameters: 25162d747510SLisandro Dalcin + options - options database, use NULL for default global database 25172d747510SLisandro Dalcin . pre - string to prepend to each name or NULL 25182d747510SLisandro Dalcin . name - the option one is seeking 25192d747510SLisandro Dalcin - nmax - maximum number of values to retrieve 25202d747510SLisandro Dalcin 25212d747510SLisandro Dalcin Output Parameter: 25222d747510SLisandro Dalcin + dvalue - the integer values to return 25232d747510SLisandro Dalcin . nmax - actual number of values retreived 25242d747510SLisandro Dalcin - set - PETSC_TRUE if found, else PETSC_FALSE 25252d747510SLisandro Dalcin 25262d747510SLisandro Dalcin Level: beginner 25272d747510SLisandro Dalcin 25282d747510SLisandro Dalcin Notes: 25292d747510SLisandro Dalcin TRUE, true, YES, yes, nostring, and 1 all translate to PETSC_TRUE 25302d747510SLisandro Dalcin FALSE, false, NO, no, and 0 all translate to PETSC_FALSE 25312d747510SLisandro Dalcin 25322d747510SLisandro Dalcin .seealso: PetscOptionsGetInt(), PetscOptionsHasName(), 25332d747510SLisandro Dalcin PetscOptionsGetString(), PetscOptionsGetRealArray(), PetscOptionsBool(), 25342d747510SLisandro Dalcin PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 25352d747510SLisandro Dalcin PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 25362d747510SLisandro Dalcin PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 25372d747510SLisandro Dalcin PetscOptionsFList(), PetscOptionsEList() 25382d747510SLisandro Dalcin @*/ 25392d747510SLisandro Dalcin PetscErrorCode PetscOptionsGetBoolArray(PetscOptions options,const char pre[],const char name[],PetscBool dvalue[],PetscInt *nmax,PetscBool *set) 25402d747510SLisandro Dalcin { 25412d747510SLisandro Dalcin const char *svalue; 25422d747510SLisandro Dalcin char *value; 25432d747510SLisandro Dalcin PetscErrorCode ierr; 25442d747510SLisandro Dalcin PetscInt n = 0; 25452d747510SLisandro Dalcin PetscBool flag; 25462d747510SLisandro Dalcin PetscToken token; 25472d747510SLisandro Dalcin 25482d747510SLisandro Dalcin PetscFunctionBegin; 25492d747510SLisandro Dalcin PetscValidCharPointer(name,3); 25502d747510SLisandro Dalcin PetscValidIntPointer(dvalue,4); 25512d747510SLisandro Dalcin PetscValidIntPointer(nmax,5); 25522d747510SLisandro Dalcin 25532d747510SLisandro Dalcin ierr = PetscOptionsFindPair(options,pre,name,&svalue,&flag);CHKERRQ(ierr); 25542d747510SLisandro Dalcin if (!flag || !svalue) { if (set) *set = PETSC_FALSE; *nmax = 0; PetscFunctionReturn(0);} 25552d747510SLisandro Dalcin if (set) *set = PETSC_TRUE; 25562d747510SLisandro Dalcin ierr = PetscTokenCreate(svalue,',',&token);CHKERRQ(ierr); 25572d747510SLisandro Dalcin ierr = PetscTokenFind(token,&value);CHKERRQ(ierr); 25582d747510SLisandro Dalcin while (value && n < *nmax) { 25592d747510SLisandro Dalcin ierr = PetscOptionsStringToBool(value,dvalue);CHKERRQ(ierr); 25602d747510SLisandro Dalcin ierr = PetscTokenFind(token,&value);CHKERRQ(ierr); 25612d747510SLisandro Dalcin dvalue++; 25622d747510SLisandro Dalcin n++; 25632d747510SLisandro Dalcin } 25642d747510SLisandro Dalcin ierr = PetscTokenDestroy(&token);CHKERRQ(ierr); 25652d747510SLisandro Dalcin *nmax = n; 25662d747510SLisandro Dalcin PetscFunctionReturn(0); 25672d747510SLisandro Dalcin } 25682d747510SLisandro Dalcin 25692d747510SLisandro Dalcin /*@C 25702d747510SLisandro Dalcin PetscOptionsGetEnumArray - Gets an array of enum values for a particular option in the database. 25712d747510SLisandro Dalcin 25722d747510SLisandro Dalcin Not Collective 25732d747510SLisandro Dalcin 25742d747510SLisandro Dalcin Input Parameters: 25752d747510SLisandro Dalcin + options - options database, use NULL for default global database 25762d747510SLisandro Dalcin . pre - option prefix or NULL 25772d747510SLisandro Dalcin . name - option name 25782d747510SLisandro Dalcin . list - array containing the list of choices, followed by the enum name, followed by the enum prefix, followed by a null 25792d747510SLisandro Dalcin - nmax - maximum number of values to retrieve 25802d747510SLisandro Dalcin 25812d747510SLisandro Dalcin Output Parameters: 25822d747510SLisandro Dalcin + ivalue - the enum values to return 25832d747510SLisandro Dalcin . nmax - actual number of values retreived 25842d747510SLisandro Dalcin - set - PETSC_TRUE if found, else PETSC_FALSE 25852d747510SLisandro Dalcin 25862d747510SLisandro Dalcin Level: beginner 25872d747510SLisandro Dalcin 25882d747510SLisandro Dalcin Notes: 25892d747510SLisandro Dalcin The array must be passed as a comma separated list. 25902d747510SLisandro Dalcin 25912d747510SLisandro Dalcin There must be no intervening spaces between the values. 25922d747510SLisandro Dalcin 25932d747510SLisandro Dalcin list is usually something like PCASMTypes or some other predefined list of enum names. 25942d747510SLisandro Dalcin 25952d747510SLisandro Dalcin .seealso: PetscOptionsGetReal(), PetscOptionsHasName(), PetscOptionsGetString(), PetscOptionsGetInt(), 25962d747510SLisandro Dalcin PetscOptionsGetEnum(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool() 25972d747510SLisandro Dalcin PetscOptionsInt(), PetscOptionsString(), PetscOptionsReal(), PetscOptionsBool(), PetscOptionsName(), 25982d747510SLisandro Dalcin PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), PetscOptionsStringArray(),PetscOptionsRealArray(), 25992d747510SLisandro Dalcin PetscOptionsScalar(), PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 26002d747510SLisandro Dalcin PetscOptionsFList(), PetscOptionsEList(), PetscOptionsGetEList(), PetscOptionsEnum() 26012d747510SLisandro Dalcin @*/ 26022d747510SLisandro Dalcin PetscErrorCode PetscOptionsGetEnumArray(PetscOptions options,const char pre[],const char name[],const char *const *list,PetscEnum ivalue[],PetscInt *nmax,PetscBool *set) 26032d747510SLisandro Dalcin { 26042d747510SLisandro Dalcin const char *svalue; 26052d747510SLisandro Dalcin char *value; 26062d747510SLisandro Dalcin PetscInt n = 0; 26072d747510SLisandro Dalcin PetscEnum evalue; 26082d747510SLisandro Dalcin PetscBool flag; 26092d747510SLisandro Dalcin PetscToken token; 26102d747510SLisandro Dalcin PetscErrorCode ierr; 26112d747510SLisandro Dalcin 26122d747510SLisandro Dalcin PetscFunctionBegin; 26132d747510SLisandro Dalcin PetscValidCharPointer(name,3); 26142d747510SLisandro Dalcin PetscValidPointer(list,4); 26152d747510SLisandro Dalcin PetscValidPointer(ivalue,5); 26162d747510SLisandro Dalcin PetscValidIntPointer(nmax,6); 26172d747510SLisandro Dalcin 26182d747510SLisandro Dalcin ierr = PetscOptionsFindPair(options,pre,name,&svalue,&flag);CHKERRQ(ierr); 26192d747510SLisandro Dalcin if (!flag || !svalue) { if (set) *set = PETSC_FALSE; *nmax = 0; PetscFunctionReturn(0);} 26202d747510SLisandro Dalcin if (set) *set = PETSC_TRUE; 26212d747510SLisandro Dalcin ierr = PetscTokenCreate(svalue,',',&token);CHKERRQ(ierr); 26222d747510SLisandro Dalcin ierr = PetscTokenFind(token,&value);CHKERRQ(ierr); 26232d747510SLisandro Dalcin while (value && n < *nmax) { 26242d747510SLisandro Dalcin ierr = PetscEnumFind(list,value,&evalue,&flag);CHKERRQ(ierr); 26252d747510SLisandro Dalcin if (!flag) SETERRQ3(PETSC_COMM_SELF,PETSC_ERR_USER,"Unknown enum value '%s' for -%s%s",svalue,pre ? pre : "",name+1); 26262d747510SLisandro Dalcin ivalue[n++] = evalue; 26272d747510SLisandro Dalcin ierr = PetscTokenFind(token,&value);CHKERRQ(ierr); 26282d747510SLisandro Dalcin } 26292d747510SLisandro Dalcin ierr = PetscTokenDestroy(&token);CHKERRQ(ierr); 26302d747510SLisandro Dalcin *nmax = n; 26312d747510SLisandro Dalcin PetscFunctionReturn(0); 26322d747510SLisandro Dalcin } 26332d747510SLisandro Dalcin 26342d747510SLisandro Dalcin /*@C 26352d747510SLisandro Dalcin PetscOptionsGetIntArray - Gets an array of integer values for a particular 26362d747510SLisandro Dalcin option in the database. 26372d747510SLisandro Dalcin 26382d747510SLisandro Dalcin Not Collective 26392d747510SLisandro Dalcin 26402d747510SLisandro Dalcin Input Parameters: 26412d747510SLisandro Dalcin + options - options database, use NULL for default global database 26422d747510SLisandro Dalcin . pre - string to prepend to each name or NULL 26432d747510SLisandro Dalcin . name - the option one is seeking 26442d747510SLisandro Dalcin - nmax - maximum number of values to retrieve 26452d747510SLisandro Dalcin 26462d747510SLisandro Dalcin Output Parameter: 26472d747510SLisandro Dalcin + ivalue - the integer values to return 26482d747510SLisandro Dalcin . nmax - actual number of values retreived 26492d747510SLisandro Dalcin - set - PETSC_TRUE if found, else PETSC_FALSE 26502d747510SLisandro Dalcin 26512d747510SLisandro Dalcin Level: beginner 26522d747510SLisandro Dalcin 26532d747510SLisandro Dalcin Notes: 26542d747510SLisandro Dalcin The array can be passed as 26552d747510SLisandro Dalcin a comma separated list: 0,1,2,3,4,5,6,7 26562d747510SLisandro Dalcin a range (start-end+1): 0-8 26572d747510SLisandro Dalcin a range with given increment (start-end+1:inc): 0-7:2 26582d747510SLisandro Dalcin a combination of values and ranges separated by commas: 0,1-8,8-15:2 26592d747510SLisandro Dalcin 26602d747510SLisandro Dalcin There must be no intervening spaces between the values. 26612d747510SLisandro Dalcin 26622d747510SLisandro Dalcin .seealso: PetscOptionsGetInt(), PetscOptionsHasName(), 26632d747510SLisandro Dalcin PetscOptionsGetString(), PetscOptionsGetRealArray(), PetscOptionsBool(), 26642d747510SLisandro Dalcin PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 26652d747510SLisandro Dalcin PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 26662d747510SLisandro Dalcin PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 26672d747510SLisandro Dalcin PetscOptionsFList(), PetscOptionsEList() 26682d747510SLisandro Dalcin @*/ 26692d747510SLisandro Dalcin PetscErrorCode PetscOptionsGetIntArray(PetscOptions options,const char pre[],const char name[],PetscInt ivalue[],PetscInt *nmax,PetscBool *set) 26702d747510SLisandro Dalcin { 26712d747510SLisandro Dalcin const char *svalue; 26722d747510SLisandro Dalcin char *value; 26732d747510SLisandro Dalcin PetscErrorCode ierr; 26742d747510SLisandro Dalcin PetscInt n = 0,i,j,start,end,inc,nvalues; 26752d747510SLisandro Dalcin size_t len; 26762d747510SLisandro Dalcin PetscBool flag,foundrange; 26772d747510SLisandro Dalcin PetscToken token; 26782d747510SLisandro Dalcin 26792d747510SLisandro Dalcin PetscFunctionBegin; 26802d747510SLisandro Dalcin PetscValidCharPointer(name,3); 26812d747510SLisandro Dalcin PetscValidIntPointer(ivalue,4); 26822d747510SLisandro Dalcin PetscValidIntPointer(nmax,5); 26832d747510SLisandro Dalcin 26842d747510SLisandro Dalcin ierr = PetscOptionsFindPair(options,pre,name,&svalue,&flag);CHKERRQ(ierr); 26852d747510SLisandro Dalcin if (!flag || !svalue) { if (set) *set = PETSC_FALSE; *nmax = 0; PetscFunctionReturn(0);} 26862d747510SLisandro Dalcin if (set) *set = PETSC_TRUE; 26872d747510SLisandro Dalcin ierr = PetscTokenCreate(svalue,',',&token);CHKERRQ(ierr); 26882d747510SLisandro Dalcin ierr = PetscTokenFind(token,&value);CHKERRQ(ierr); 26892d747510SLisandro Dalcin while (value && n < *nmax) { 26902d747510SLisandro Dalcin /* look for form d-D where d and D are integers */ 26912d747510SLisandro Dalcin foundrange = PETSC_FALSE; 26922d747510SLisandro Dalcin ierr = PetscStrlen(value,&len);CHKERRQ(ierr); 26932d747510SLisandro Dalcin if (value[0] == '-') i=2; 26942d747510SLisandro Dalcin else i=1; 26952d747510SLisandro Dalcin for (;i<(int)len; i++) { 26962d747510SLisandro Dalcin if (value[i] == '-') { 26972d747510SLisandro Dalcin if (i == (int)len-1) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_USER,"Error in %D-th array entry %s\n",n,value); 26982d747510SLisandro Dalcin value[i] = 0; 26992d747510SLisandro Dalcin 27002d747510SLisandro Dalcin ierr = PetscOptionsStringToInt(value,&start);CHKERRQ(ierr); 27012d747510SLisandro Dalcin inc = 1; 27022d747510SLisandro Dalcin j = i+1; 27032d747510SLisandro Dalcin for (;j<(int)len; j++) { 27042d747510SLisandro Dalcin if (value[j] == ':') { 27052d747510SLisandro Dalcin value[j] = 0; 27062d747510SLisandro Dalcin 27072d747510SLisandro Dalcin ierr = PetscOptionsStringToInt(value+j+1,&inc);CHKERRQ(ierr); 27082d747510SLisandro 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); 27092d747510SLisandro Dalcin break; 27102d747510SLisandro Dalcin } 27112d747510SLisandro Dalcin } 27122d747510SLisandro Dalcin ierr = PetscOptionsStringToInt(value+i+1,&end);CHKERRQ(ierr); 27132d747510SLisandro 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); 27142d747510SLisandro Dalcin nvalues = (end-start)/inc + (end-start)%inc; 27152d747510SLisandro 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); 27162d747510SLisandro Dalcin for (;start<end; start+=inc) { 27172d747510SLisandro Dalcin *ivalue = start; ivalue++;n++; 27182d747510SLisandro Dalcin } 27192d747510SLisandro Dalcin foundrange = PETSC_TRUE; 27202d747510SLisandro Dalcin break; 27212d747510SLisandro Dalcin } 27222d747510SLisandro Dalcin } 27232d747510SLisandro Dalcin if (!foundrange) { 27242d747510SLisandro Dalcin ierr = PetscOptionsStringToInt(value,ivalue);CHKERRQ(ierr); 27252d747510SLisandro Dalcin ivalue++; 27262d747510SLisandro Dalcin n++; 27272d747510SLisandro Dalcin } 27282d747510SLisandro Dalcin ierr = PetscTokenFind(token,&value);CHKERRQ(ierr); 27292d747510SLisandro Dalcin } 27302d747510SLisandro Dalcin ierr = PetscTokenDestroy(&token);CHKERRQ(ierr); 27312d747510SLisandro Dalcin *nmax = n; 27322d747510SLisandro Dalcin PetscFunctionReturn(0); 27332d747510SLisandro Dalcin } 27342d747510SLisandro Dalcin 27352d747510SLisandro Dalcin /*@C 27362d747510SLisandro Dalcin PetscOptionsGetRealArray - Gets an array of double precision values for a 27372d747510SLisandro Dalcin particular option in the database. The values must be separated with 27382d747510SLisandro Dalcin commas with no intervening spaces. 27392d747510SLisandro Dalcin 27402d747510SLisandro Dalcin Not Collective 27412d747510SLisandro Dalcin 27422d747510SLisandro Dalcin Input Parameters: 27432d747510SLisandro Dalcin + options - options database, use NULL for default global database 27442d747510SLisandro Dalcin . pre - string to prepend to each name or NULL 27452d747510SLisandro Dalcin . name - the option one is seeking 27462d747510SLisandro Dalcin - nmax - maximum number of values to retrieve 27472d747510SLisandro Dalcin 27482d747510SLisandro Dalcin Output Parameters: 27492d747510SLisandro Dalcin + dvalue - the double values to return 27502d747510SLisandro Dalcin . nmax - actual number of values retreived 27512d747510SLisandro Dalcin - set - PETSC_TRUE if found, else PETSC_FALSE 27522d747510SLisandro Dalcin 27532d747510SLisandro Dalcin Level: beginner 27542d747510SLisandro Dalcin 27552d747510SLisandro Dalcin .seealso: PetscOptionsGetInt(), PetscOptionsHasName(), 27562d747510SLisandro Dalcin PetscOptionsGetString(), PetscOptionsGetIntArray(), PetscOptionsBool(), 27572d747510SLisandro Dalcin PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 27582d747510SLisandro Dalcin PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 27592d747510SLisandro Dalcin PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 27602d747510SLisandro Dalcin PetscOptionsFList(), PetscOptionsEList() 27612d747510SLisandro Dalcin @*/ 27622d747510SLisandro Dalcin PetscErrorCode PetscOptionsGetRealArray(PetscOptions options,const char pre[],const char name[],PetscReal dvalue[],PetscInt *nmax,PetscBool *set) 27632d747510SLisandro Dalcin { 27642d747510SLisandro Dalcin const char *svalue; 27652d747510SLisandro Dalcin char *value; 27662d747510SLisandro Dalcin PetscErrorCode ierr; 27672d747510SLisandro Dalcin PetscInt n = 0; 27682d747510SLisandro Dalcin PetscBool flag; 27692d747510SLisandro Dalcin PetscToken token; 27702d747510SLisandro Dalcin 27712d747510SLisandro Dalcin PetscFunctionBegin; 27722d747510SLisandro Dalcin PetscValidCharPointer(name,3); 27732d747510SLisandro Dalcin PetscValidRealPointer(dvalue,4); 27742d747510SLisandro Dalcin PetscValidIntPointer(nmax,5); 27752d747510SLisandro Dalcin 27762d747510SLisandro Dalcin ierr = PetscOptionsFindPair(options,pre,name,&svalue,&flag);CHKERRQ(ierr); 27772d747510SLisandro Dalcin if (!flag || !svalue) { if (set) *set = PETSC_FALSE; *nmax = 0; PetscFunctionReturn(0);} 27782d747510SLisandro Dalcin if (set) *set = PETSC_TRUE; 27792d747510SLisandro Dalcin ierr = PetscTokenCreate(svalue,',',&token);CHKERRQ(ierr); 27802d747510SLisandro Dalcin ierr = PetscTokenFind(token,&value);CHKERRQ(ierr); 27812d747510SLisandro Dalcin while (value && n < *nmax) { 27822d747510SLisandro Dalcin ierr = PetscOptionsStringToReal(value,dvalue++);CHKERRQ(ierr); 27832d747510SLisandro Dalcin ierr = PetscTokenFind(token,&value);CHKERRQ(ierr); 27842d747510SLisandro Dalcin n++; 27852d747510SLisandro Dalcin } 27862d747510SLisandro Dalcin ierr = PetscTokenDestroy(&token);CHKERRQ(ierr); 27872d747510SLisandro Dalcin *nmax = n; 27882d747510SLisandro Dalcin PetscFunctionReturn(0); 27892d747510SLisandro Dalcin } 27902d747510SLisandro Dalcin 27912d747510SLisandro Dalcin /*@C 27922d747510SLisandro Dalcin PetscOptionsGetScalarArray - Gets an array of scalars for a 27932d747510SLisandro Dalcin particular option in the database. The values must be separated with 27942d747510SLisandro Dalcin commas with no intervening spaces. 27952d747510SLisandro Dalcin 27962d747510SLisandro Dalcin Not Collective 27972d747510SLisandro Dalcin 27982d747510SLisandro Dalcin Input Parameters: 27992d747510SLisandro Dalcin + options - options database, use NULL for default global database 28002d747510SLisandro Dalcin . pre - string to prepend to each name or NULL 28012d747510SLisandro Dalcin . name - the option one is seeking 28022d747510SLisandro Dalcin - nmax - maximum number of values to retrieve 28032d747510SLisandro Dalcin 28042d747510SLisandro Dalcin Output Parameters: 28052d747510SLisandro Dalcin + dvalue - the scalar values to return 28062d747510SLisandro Dalcin . nmax - actual number of values retreived 28072d747510SLisandro Dalcin - set - PETSC_TRUE if found, else PETSC_FALSE 28082d747510SLisandro Dalcin 28092d747510SLisandro Dalcin Level: beginner 28102d747510SLisandro Dalcin 28112d747510SLisandro Dalcin .seealso: PetscOptionsGetInt(), PetscOptionsHasName(), 28122d747510SLisandro Dalcin PetscOptionsGetString(), PetscOptionsGetIntArray(), PetscOptionsBool(), 28132d747510SLisandro Dalcin PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 28142d747510SLisandro Dalcin PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 28152d747510SLisandro Dalcin PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 28162d747510SLisandro Dalcin PetscOptionsFList(), PetscOptionsEList() 28172d747510SLisandro Dalcin @*/ 28182d747510SLisandro Dalcin PetscErrorCode PetscOptionsGetScalarArray(PetscOptions options,const char pre[],const char name[],PetscScalar dvalue[],PetscInt *nmax,PetscBool *set) 28192d747510SLisandro Dalcin { 28202d747510SLisandro Dalcin const char *svalue; 28212d747510SLisandro Dalcin char *value; 28222d747510SLisandro Dalcin PetscErrorCode ierr; 28232d747510SLisandro Dalcin PetscInt n = 0; 28242d747510SLisandro Dalcin PetscBool flag; 28252d747510SLisandro Dalcin PetscToken token; 28262d747510SLisandro Dalcin 28272d747510SLisandro Dalcin PetscFunctionBegin; 28282d747510SLisandro Dalcin PetscValidCharPointer(name,3); 28292d747510SLisandro Dalcin PetscValidRealPointer(dvalue,4); 28302d747510SLisandro Dalcin PetscValidIntPointer(nmax,5); 28312d747510SLisandro Dalcin 28322d747510SLisandro Dalcin ierr = PetscOptionsFindPair(options,pre,name,&svalue,&flag);CHKERRQ(ierr); 28332d747510SLisandro Dalcin if (!flag || !svalue) { if (set) *set = PETSC_FALSE; *nmax = 0; PetscFunctionReturn(0);} 28342d747510SLisandro Dalcin if (set) *set = PETSC_TRUE; 28352d747510SLisandro Dalcin ierr = PetscTokenCreate(svalue,',',&token);CHKERRQ(ierr); 28362d747510SLisandro Dalcin ierr = PetscTokenFind(token,&value);CHKERRQ(ierr); 28372d747510SLisandro Dalcin while (value && n < *nmax) { 28382d747510SLisandro Dalcin ierr = PetscOptionsStringToScalar(value,dvalue++);CHKERRQ(ierr); 28392d747510SLisandro Dalcin ierr = PetscTokenFind(token,&value);CHKERRQ(ierr); 28402d747510SLisandro Dalcin n++; 28412d747510SLisandro Dalcin } 28422d747510SLisandro Dalcin ierr = PetscTokenDestroy(&token);CHKERRQ(ierr); 28432d747510SLisandro Dalcin *nmax = n; 28442d747510SLisandro Dalcin PetscFunctionReturn(0); 28452d747510SLisandro Dalcin } 284614ce751eSBarry Smith 2847e5c89e4eSSatish Balay /*@C 2848e5c89e4eSSatish Balay PetscOptionsGetStringArray - Gets an array of string values for a particular 2849e5c89e4eSSatish Balay option in the database. The values must be separated with commas with 2850e5c89e4eSSatish Balay no intervening spaces. 2851e5c89e4eSSatish Balay 2852e5c89e4eSSatish Balay Not Collective 2853e5c89e4eSSatish Balay 2854e5c89e4eSSatish Balay Input Parameters: 28555c9cc608SHong Zhang + options - options database, use NULL for default global database 2856c5929fdfSBarry Smith . pre - string to prepend to name or NULL 2857e5c89e4eSSatish Balay . name - the option one is seeking 2858e5c89e4eSSatish Balay - nmax - maximum number of strings 2859e5c89e4eSSatish Balay 2860e5c89e4eSSatish Balay Output Parameter: 2861e5c89e4eSSatish Balay + strings - location to copy strings 286296ef3cdfSSatish Balay - set - PETSC_TRUE if found, else PETSC_FALSE 2863e5c89e4eSSatish Balay 2864e5c89e4eSSatish Balay Level: beginner 2865e5c89e4eSSatish Balay 2866e5c89e4eSSatish Balay Notes: 2867e5c89e4eSSatish Balay The user should pass in an array of pointers to char, to hold all the 2868e5c89e4eSSatish Balay strings returned by this function. 2869e5c89e4eSSatish Balay 2870e5c89e4eSSatish Balay The user is responsible for deallocating the strings that are 2871e5c89e4eSSatish Balay returned. The Fortran interface for this routine is not supported. 2872e5c89e4eSSatish Balay 2873e5c89e4eSSatish Balay .seealso: PetscOptionsGetInt(), PetscOptionsGetReal(), 2874acfcf0e5SJed Brown PetscOptionsHasName(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool(), 2875e5c89e4eSSatish Balay PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 2876e5c89e4eSSatish Balay PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 2877acfcf0e5SJed Brown PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 2878a264d7a6SBarry Smith PetscOptionsFList(), PetscOptionsEList() 2879e5c89e4eSSatish Balay @*/ 2880c5929fdfSBarry Smith PetscErrorCode PetscOptionsGetStringArray(PetscOptions options,const char pre[],const char name[],char *strings[],PetscInt *nmax,PetscBool *set) 2881e5c89e4eSSatish Balay { 28822d747510SLisandro Dalcin const char *svalue; 2883e5c89e4eSSatish Balay char *value; 2884e5c89e4eSSatish Balay PetscErrorCode ierr; 28852d747510SLisandro Dalcin PetscInt n = 0; 2886ace3abfcSBarry Smith PetscBool flag; 28879c9d3cfdSBarry Smith PetscToken token; 2888e5c89e4eSSatish Balay 2889e5c89e4eSSatish Balay PetscFunctionBegin; 28902d747510SLisandro Dalcin PetscValidCharPointer(name,3); 28912d747510SLisandro Dalcin PetscValidPointer(strings,4); 28922d747510SLisandro Dalcin PetscValidIntPointer(nmax,5); 2893e5c89e4eSSatish Balay 28942d747510SLisandro Dalcin ierr = PetscOptionsFindPair(options,pre,name,&svalue,&flag);CHKERRQ(ierr); 28952d747510SLisandro Dalcin if (!flag || !svalue) { if (set) *set = PETSC_FALSE; *nmax = 0; PetscFunctionReturn(0);} 28962d747510SLisandro Dalcin if (set) *set = PETSC_TRUE; 28972d747510SLisandro Dalcin ierr = PetscTokenCreate(svalue,',',&token);CHKERRQ(ierr); 2898e5c89e4eSSatish Balay ierr = PetscTokenFind(token,&value);CHKERRQ(ierr); 28992d747510SLisandro Dalcin while (value && n < *nmax) { 2900e5c89e4eSSatish Balay ierr = PetscStrallocpy(value,&strings[n]);CHKERRQ(ierr); 2901e5c89e4eSSatish Balay ierr = PetscTokenFind(token,&value);CHKERRQ(ierr); 2902e5c89e4eSSatish Balay n++; 2903e5c89e4eSSatish Balay } 29048c74ee41SBarry Smith ierr = PetscTokenDestroy(&token);CHKERRQ(ierr); 2905e5c89e4eSSatish Balay *nmax = n; 2906e5c89e4eSSatish Balay PetscFunctionReturn(0); 2907e5c89e4eSSatish Balay } 290806824ed3SPatrick Sanan 290906824ed3SPatrick Sanan /*@C 291006824ed3SPatrick Sanan PetscOptionsDeprecated - mark an option as deprecated, optionally replacing it with a new one 291106824ed3SPatrick Sanan 291206824ed3SPatrick Sanan Prints a deprecation warning, unless an option is supplied to suppress. 291306824ed3SPatrick Sanan 29141c9f3c13SBarry Smith Logically Collective 291506824ed3SPatrick Sanan 291606824ed3SPatrick Sanan Input Parameters: 29179503aa97SPatrick Sanan + pre - string to prepend to name or NULL 291806824ed3SPatrick Sanan . oldname - the old, deprecated option 291906824ed3SPatrick Sanan . newname - the new option, or NULL if option is purely removed 29209f3a6782SPatrick Sanan . version - a string describing the version of first deprecation, e.g. "3.9" 29219f3a6782SPatrick Sanan - info - additional information string, or NULL. 292206824ed3SPatrick Sanan 292306824ed3SPatrick Sanan Options Database Keys: 292406824ed3SPatrick Sanan . -options_suppress_deprecated_warnings - do not print deprecation warnings 292506824ed3SPatrick Sanan 292606824ed3SPatrick Sanan Notes: 29271c9f3c13SBarry Smith Must be called between PetscOptionsBegin() (or PetscObjectOptionsBegin()) and PetscOptionsEnd(). 29281c9f3c13SBarry Smith Only the proces of rank zero that owns the PetscOptionsItems are argument (managed by PetscOptionsBegin() or 29291c9f3c13SBarry Smith PetscObjectOptionsBegin() prints the information 2930b40114eaSPatrick Sanan If newname is provided, the old option is replaced. Otherwise, it remains 2931b40114eaSPatrick Sanan in the options database. 29329f3a6782SPatrick Sanan If an option is not replaced, the info argument should be used to advise the user 29339f3a6782SPatrick Sanan on how to proceed. 29349f3a6782SPatrick Sanan There is a limit on the length of the warning printed, so very long strings 29359f3a6782SPatrick Sanan provided as info may be truncated. 293606824ed3SPatrick Sanan 293706824ed3SPatrick Sanan Level: developer 293806824ed3SPatrick Sanan 293906824ed3SPatrick Sanan .seealso: PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsScalar(), PetscOptionsBool(), PetscOptionsString(), PetscOptionsSetValue() 294006824ed3SPatrick Sanan 294106824ed3SPatrick Sanan @*/ 29429f3a6782SPatrick Sanan PetscErrorCode PetscOptionsDeprecated_Private(PetscOptionItems *PetscOptionsObject,const char oldname[],const char newname[],const char version[],const char info[]) 294306824ed3SPatrick Sanan { 294406824ed3SPatrick Sanan PetscErrorCode ierr; 294506824ed3SPatrick Sanan PetscBool found,quiet; 294606824ed3SPatrick Sanan const char *value; 294706824ed3SPatrick Sanan const char * const quietopt="-options_suppress_deprecated_warnings"; 29489f3a6782SPatrick Sanan char msg[4096]; 2949b0bdc838SStefano Zampini char *prefix = NULL; 2950b0bdc838SStefano Zampini PetscOptions options = NULL; 2951b0bdc838SStefano Zampini MPI_Comm comm = PETSC_COMM_SELF; 295206824ed3SPatrick Sanan 295306824ed3SPatrick Sanan PetscFunctionBegin; 295406824ed3SPatrick Sanan PetscValidCharPointer(oldname,2); 295506824ed3SPatrick Sanan PetscValidCharPointer(version,4); 2956b0bdc838SStefano Zampini if (PetscOptionsObject) { 2957b0bdc838SStefano Zampini prefix = PetscOptionsObject->prefix; 2958b0bdc838SStefano Zampini options = PetscOptionsObject->options; 2959b0bdc838SStefano Zampini comm = PetscOptionsObject->comm; 2960b0bdc838SStefano Zampini } 2961b0bdc838SStefano Zampini ierr = PetscOptionsFindPair(options,prefix,oldname,&value,&found);CHKERRQ(ierr); 296206824ed3SPatrick Sanan if (found) { 296306824ed3SPatrick Sanan if (newname) { 2964b0bdc838SStefano Zampini if (prefix) { 2965b0bdc838SStefano Zampini ierr = PetscOptionsPrefixPush(options,prefix);CHKERRQ(ierr); 2966d255429eSPatrick Sanan } 2967b0bdc838SStefano Zampini ierr = PetscOptionsSetValue(options,newname,value);CHKERRQ(ierr); 2968b0bdc838SStefano Zampini if (prefix) { 2969b0bdc838SStefano Zampini ierr = PetscOptionsPrefixPop(options);CHKERRQ(ierr); 2970d255429eSPatrick Sanan } 2971b0bdc838SStefano Zampini ierr = PetscOptionsClearValue(options,oldname);CHKERRQ(ierr); 2972b40114eaSPatrick Sanan } 297306824ed3SPatrick Sanan quiet = PETSC_FALSE; 2974b0bdc838SStefano Zampini ierr = PetscOptionsGetBool(options,NULL,quietopt,&quiet,NULL);CHKERRQ(ierr); 297506824ed3SPatrick Sanan if (!quiet) { 29769f3a6782SPatrick Sanan ierr = PetscStrcpy(msg,"** PETSc DEPRECATION WARNING ** : the option ");CHKERRQ(ierr); 29771fa95f81SSatish Balay ierr = PetscStrcat(msg,oldname);CHKERRQ(ierr); 2978928bb9adSStefano Zampini ierr = PetscStrcat(msg," is deprecated as of version ");CHKERRQ(ierr); 29799f3a6782SPatrick Sanan ierr = PetscStrcat(msg,version);CHKERRQ(ierr); 29809f3a6782SPatrick Sanan ierr = PetscStrcat(msg," and will be removed in a future release.");CHKERRQ(ierr); 298106824ed3SPatrick Sanan if (newname) { 29829f3a6782SPatrick Sanan ierr = PetscStrcat(msg," Please use the option ");CHKERRQ(ierr); 29839f3a6782SPatrick Sanan ierr = PetscStrcat(msg,newname);CHKERRQ(ierr); 29849f3a6782SPatrick Sanan ierr = PetscStrcat(msg," instead.");CHKERRQ(ierr); 298506824ed3SPatrick Sanan } 29869f3a6782SPatrick Sanan if (info) { 29879f3a6782SPatrick Sanan ierr = PetscStrcat(msg," ");CHKERRQ(ierr); 29889f3a6782SPatrick Sanan ierr = PetscStrcat(msg,info);CHKERRQ(ierr); 29899f3a6782SPatrick Sanan } 29909f3a6782SPatrick Sanan ierr = PetscStrcat(msg," (Silence this warning with ");CHKERRQ(ierr); 29919f3a6782SPatrick Sanan ierr = PetscStrcat(msg,quietopt);CHKERRQ(ierr); 29929f3a6782SPatrick Sanan ierr = PetscStrcat(msg,")\n");CHKERRQ(ierr); 2993b0bdc838SStefano Zampini ierr = PetscPrintf(comm,msg);CHKERRQ(ierr); 299406824ed3SPatrick Sanan } 299506824ed3SPatrick Sanan } 299606824ed3SPatrick Sanan PetscFunctionReturn(0); 299706824ed3SPatrick Sanan } 2998