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_STRING_H) 19*2d747510SLisandro Dalcin #include <string.h> /* strcasecmp */ 20ef279fd6SBarry Smith #endif 21ef279fd6SBarry Smith #if defined(PETSC_HAVE_STRINGS_H) 22ef279fd6SBarry Smith # include <strings.h> /* strcasecmp */ 23ef279fd6SBarry Smith #endif 243bcbd388SSean Farley #if defined(PETSC_HAVE_YAML) 253bcbd388SSean Farley #include <yaml.h> 263bcbd388SSean Farley #endif 27e5c89e4eSSatish Balay 28*2d747510SLisandro Dalcin #if defined(PETSC_HAVE_STRCASECMP) 29*2d747510SLisandro Dalcin #define PetscOptNameCmp(a,b) strcasecmp(a,b) 30*2d747510SLisandro Dalcin #elif defined(PETSC_HAVE_STRICMP) 31*2d747510SLisandro Dalcin #define PetscOptNameCmp(a,b) stricmp(a,b) 32*2d747510SLisandro Dalcin #else 33*2d747510SLisandro Dalcin #define PetscOptNameCmp(a,b) Error_strcasecmp_not_found 34*2d747510SLisandro Dalcin #endif 35*2d747510SLisandro Dalcin 36*2d747510SLisandro Dalcin #include <petsc/private/hashtable.h> 37*2d747510SLisandro Dalcin 38*2d747510SLisandro Dalcin /* This assumes ASCII encoding and ignores locale settings */ 39*2d747510SLisandro Dalcin /* Using tolower() is about 2X slower in microbenchmarks */ 40*2d747510SLisandro Dalcin PETSC_STATIC_INLINE int PetscToLower(int c) 41*2d747510SLisandro Dalcin { 42*2d747510SLisandro Dalcin return ((c >= 'A') & (c <= 'Z')) ? c + 'a' - 'A' : c; 43*2d747510SLisandro Dalcin } 44*2d747510SLisandro Dalcin 45*2d747510SLisandro Dalcin /* Bob Jenkins's one at a time hash function (case-insensitive) */ 46*2d747510SLisandro Dalcin PETSC_STATIC_INLINE unsigned int PetscOptHash(const char key[]) 47*2d747510SLisandro Dalcin { 48*2d747510SLisandro Dalcin unsigned int hash = 0; 49*2d747510SLisandro Dalcin while (*key) { 50*2d747510SLisandro Dalcin hash += PetscToLower(*key++); 51*2d747510SLisandro Dalcin hash += hash << 10; 52*2d747510SLisandro Dalcin hash ^= hash >> 6; 53*2d747510SLisandro Dalcin } 54*2d747510SLisandro Dalcin hash += hash << 3; 55*2d747510SLisandro Dalcin hash ^= hash >> 11; 56*2d747510SLisandro Dalcin hash += hash << 15; 57*2d747510SLisandro Dalcin return hash; 58*2d747510SLisandro Dalcin } 59*2d747510SLisandro Dalcin 60*2d747510SLisandro Dalcin PETSC_STATIC_INLINE int PetscOptEqual(const char a[],const char b[]) 61*2d747510SLisandro Dalcin { 62*2d747510SLisandro Dalcin return !PetscOptNameCmp(a,b); 63*2d747510SLisandro Dalcin } 64*2d747510SLisandro Dalcin 65*2d747510SLisandro Dalcin KHASH_INIT(HO, kh_cstr_t, int, 1, PetscOptHash, PetscOptEqual) 66*2d747510SLisandro Dalcin 67e5c89e4eSSatish Balay /* 683fc1eb6aSBarry Smith This table holds all the options set by the user. For simplicity, we use a static size database 69e5c89e4eSSatish Balay */ 70*2d747510SLisandro Dalcin #define MAXOPTNAME 512 71e5c89e4eSSatish Balay #define MAXOPTIONS 512 72e5c89e4eSSatish Balay #define MAXALIASES 25 7374e0666dSJed Brown #define MAXPREFIXES 25 74*2d747510SLisandro Dalcin #define MAXOPTIONSMONITORS 5 75e5c89e4eSSatish Balay 764416b707SBarry Smith struct _n_PetscOptions { 77*2d747510SLisandro Dalcin int N; /* number of options */ 78*2d747510SLisandro Dalcin char *names[MAXOPTIONS]; /* option names */ 79*2d747510SLisandro Dalcin char *values[MAXOPTIONS]; /* option values */ 80*2d747510SLisandro Dalcin PetscBool used[MAXOPTIONS]; /* flag option use */ 81081c24baSBoyana Norris 82*2d747510SLisandro Dalcin /* Hash table */ 83*2d747510SLisandro Dalcin khash_t(HO) *ht; 84*2d747510SLisandro Dalcin 85*2d747510SLisandro Dalcin /* Prefixes */ 86*2d747510SLisandro Dalcin int prefixind; 87*2d747510SLisandro Dalcin int prefixstack[MAXPREFIXES]; 88*2d747510SLisandro Dalcin char prefix[MAXOPTNAME]; 89*2d747510SLisandro Dalcin 90*2d747510SLisandro Dalcin /* Aliases */ 91*2d747510SLisandro Dalcin int Naliases; /* number or aliases */ 92*2d747510SLisandro Dalcin char *aliases1[MAXALIASES]; /* aliased */ 93*2d747510SLisandro Dalcin char *aliases2[MAXALIASES]; /* aliasee */ 94*2d747510SLisandro Dalcin 95*2d747510SLisandro Dalcin /* Help */ 96*2d747510SLisandro Dalcin PetscBool help; /* flag whether "-help" is in the database */ 97*2d747510SLisandro Dalcin 98*2d747510SLisandro Dalcin /* Monitors */ 99081c24baSBoyana Norris PetscErrorCode (*monitor[MAXOPTIONSMONITORS])(const char[],const char[],void*); /* returns control to user after */ 100c2efdce3SBarry Smith PetscErrorCode (*monitordestroy[MAXOPTIONSMONITORS])(void**); /* */ 101081c24baSBoyana Norris void *monitorcontext[MAXOPTIONSMONITORS]; /* to pass arbitrary user data into monitor */ 102081c24baSBoyana Norris PetscInt numbermonitors; /* to, for instance, detect options being set */ 1034416b707SBarry Smith }; 104e5c89e4eSSatish Balay 1054416b707SBarry Smith static PetscOptions defaultoptions = NULL; 106f8d0b74dSMatthew Knepley 107*2d747510SLisandro Dalcin 108081c24baSBoyana Norris /* 109081c24baSBoyana Norris Options events monitor 110081c24baSBoyana Norris */ 111*2d747510SLisandro Dalcin static PetscErrorCode PetscOptionsMonitor(PetscOptions options,const char name[],const char value[]) 112e5c89e4eSSatish Balay { 113*2d747510SLisandro Dalcin PetscInt i; 114e5c89e4eSSatish Balay PetscErrorCode ierr; 115e5c89e4eSSatish Balay 116*2d747510SLisandro Dalcin if (!PetscInitializeCalled) return 0; 117e5c89e4eSSatish Balay PetscFunctionBegin; 118*2d747510SLisandro Dalcin for (i=0; i<options->numbermonitors; i++) { 119*2d747510SLisandro Dalcin ierr = (*options->monitor[i])(name,value,options->monitorcontext[i]);CHKERRQ(ierr); 120e5c89e4eSSatish Balay } 121e5c89e4eSSatish Balay PetscFunctionReturn(0); 122e5c89e4eSSatish Balay } 123e5c89e4eSSatish Balay 124*2d747510SLisandro Dalcin /*@ 125*2d747510SLisandro Dalcin PetscOptionsCreate - Creates an empty options database. 126e5c89e4eSSatish Balay 127e5c89e4eSSatish Balay Output Parameter: 128*2d747510SLisandro Dalcin . options - Options database object 129e5c89e4eSSatish Balay 130e5c89e4eSSatish Balay Level: advanced 131e5c89e4eSSatish Balay 132*2d747510SLisandro Dalcin .seealso: PetscOptionsDestroy() 133e5c89e4eSSatish Balay @*/ 134*2d747510SLisandro Dalcin PetscErrorCode PetscOptionsCreate(PetscOptions *options) 135*2d747510SLisandro Dalcin { 136*2d747510SLisandro Dalcin if (!options) return PETSC_ERR_ARG_NULL; 137*2d747510SLisandro Dalcin *options = (PetscOptions)calloc(1,sizeof(**options)); 138*2d747510SLisandro Dalcin if (!*options) return PETSC_ERR_MEM; 139*2d747510SLisandro Dalcin return 0; 140*2d747510SLisandro Dalcin } 141*2d747510SLisandro Dalcin 142*2d747510SLisandro Dalcin /*@ 143*2d747510SLisandro Dalcin PetscOptionsDestroy - Destroys an option database. 144*2d747510SLisandro Dalcin 145*2d747510SLisandro Dalcin Input Parameter: 146*2d747510SLisandro Dalcin . options - the PetscOptions object 147*2d747510SLisandro Dalcin 148*2d747510SLisandro Dalcin Level: developer 149*2d747510SLisandro Dalcin 150*2d747510SLisandro Dalcin .seealso: PetscOptionsInsert() 151*2d747510SLisandro Dalcin @*/ 152*2d747510SLisandro Dalcin PetscErrorCode PetscOptionsDestroy(PetscOptions *options) 153e5c89e4eSSatish Balay { 154e5c89e4eSSatish Balay PetscErrorCode ierr; 155e5c89e4eSSatish Balay 156*2d747510SLisandro Dalcin if (!*options) return 0; 157*2d747510SLisandro Dalcin ierr = PetscOptionsClear(*options);if (ierr) return ierr; 158*2d747510SLisandro Dalcin /* XXX what about monitors ? */ 159*2d747510SLisandro Dalcin *options = NULL; 160e5c89e4eSSatish Balay PetscFunctionReturn(0); 161e5c89e4eSSatish Balay } 162e5c89e4eSSatish Balay 163*2d747510SLisandro Dalcin /* 164*2d747510SLisandro Dalcin PetscOptionsCreateDefault - Creates the default global options database 165*2d747510SLisandro Dalcin */ 166*2d747510SLisandro Dalcin PetscErrorCode PetscOptionsCreateDefault(void) 167e5c89e4eSSatish Balay { 168e5c89e4eSSatish Balay PetscErrorCode ierr; 169e5c89e4eSSatish Balay 170*2d747510SLisandro Dalcin if (!defaultoptions) { 171*2d747510SLisandro Dalcin ierr = PetscOptionsCreate(&defaultoptions);if (ierr) return ierr; 172*2d747510SLisandro Dalcin } 173*2d747510SLisandro Dalcin return 0; 174*2d747510SLisandro Dalcin } 175*2d747510SLisandro Dalcin 176*2d747510SLisandro Dalcin /* 177*2d747510SLisandro Dalcin PetscOptionsDestroyDefault - Destroys the default global options database 178*2d747510SLisandro Dalcin */ 179*2d747510SLisandro Dalcin PetscErrorCode PetscOptionsDestroyDefault(void) 180*2d747510SLisandro Dalcin { 181*2d747510SLisandro Dalcin PetscErrorCode ierr; 182*2d747510SLisandro Dalcin 183*2d747510SLisandro Dalcin ierr = PetscOptionsDestroy(&defaultoptions);if (ierr) return ierr; 184*2d747510SLisandro Dalcin return 0; 185e5c89e4eSSatish Balay } 186e5c89e4eSSatish Balay 18794ef8ddeSSatish Balay /*@C 1887cd08cecSJed Brown PetscOptionsValidKey - PETSc Options database keys must begin with one or two dashes (-) followed by a letter. 1893fc1eb6aSBarry Smith 1903fc1eb6aSBarry Smith Input Parameter: 191*2d747510SLisandro Dalcin . key - string to check if valid 1923fc1eb6aSBarry Smith 1933fc1eb6aSBarry Smith Output Parameter: 194*2d747510SLisandro Dalcin . valid - PETSC_TRUE if a valid key 1953fc1eb6aSBarry Smith 196f6680f47SSatish Balay Level: intermediate 1973fc1eb6aSBarry Smith @*/ 198*2d747510SLisandro Dalcin PetscErrorCode PetscOptionsValidKey(const char key[],PetscBool *valid) 19996fc60bcSBarry Smith { 200f603b5e9SToby Isaac char *ptr; 2017c5db45bSBarry Smith 20296fc60bcSBarry Smith PetscFunctionBegin; 203*2d747510SLisandro Dalcin if (key) PetscValidCharPointer(key,1); 204*2d747510SLisandro Dalcin PetscValidPointer(valid,2); 205*2d747510SLisandro Dalcin *valid = PETSC_FALSE; 206*2d747510SLisandro Dalcin if (!key) PetscFunctionReturn(0); 207*2d747510SLisandro Dalcin if (key[0] != '-') PetscFunctionReturn(0); 208*2d747510SLisandro Dalcin if (key[1] == '-') key++; 209*2d747510SLisandro Dalcin if (!isalpha((int)(key[1]))) PetscFunctionReturn(0); 210*2d747510SLisandro Dalcin (void) strtod(key,&ptr); 211*2d747510SLisandro Dalcin if (ptr != key && !(*ptr == '_' || isalnum(*ptr))) PetscFunctionReturn(0); 212*2d747510SLisandro Dalcin *valid = PETSC_TRUE; 21396fc60bcSBarry Smith PetscFunctionReturn(0); 21496fc60bcSBarry Smith } 21596fc60bcSBarry Smith 216e5c89e4eSSatish Balay /*@C 217e5c89e4eSSatish Balay PetscOptionsInsertString - Inserts options into the database from a string 218e5c89e4eSSatish Balay 219*2d747510SLisandro Dalcin Not Collective, but only processes that call this routine will set the options 22001508a89SJed Brown included in the string 221e5c89e4eSSatish Balay 222e5c89e4eSSatish Balay Input Parameter: 223a8c7a070SBarry Smith . in_str - string that contains options separated by blanks 224e5c89e4eSSatish Balay 225e5c89e4eSSatish Balay 226e5c89e4eSSatish Balay Level: intermediate 227e5c89e4eSSatish Balay 228e5c89e4eSSatish Balay Contributed by Boyana Norris 229e5c89e4eSSatish Balay 23088c29154SBarry Smith .seealso: PetscOptionsSetValue(), PetscOptionsView(), PetscOptionsHasName(), PetscOptionsGetInt(), 231acfcf0e5SJed Brown PetscOptionsGetReal(), PetscOptionsGetString(), PetscOptionsGetIntArray(), PetscOptionsBool(), 232e5c89e4eSSatish Balay PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 233e5c89e4eSSatish Balay PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 234acfcf0e5SJed Brown PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 235a264d7a6SBarry Smith PetscOptionsFList(), PetscOptionsEList(), PetscOptionsInsertFile() 236e5c89e4eSSatish Balay @*/ 237c5929fdfSBarry Smith PetscErrorCode PetscOptionsInsertString(PetscOptions options,const char in_str[]) 238e5c89e4eSSatish Balay { 23996fc60bcSBarry Smith char *first,*second; 240e5c89e4eSSatish Balay PetscErrorCode ierr; 2419c9d3cfdSBarry Smith PetscToken token; 242ace3abfcSBarry Smith PetscBool key,ispush,ispop; 243e5c89e4eSSatish Balay 244e5c89e4eSSatish Balay PetscFunctionBegin; 24596fc60bcSBarry Smith ierr = PetscTokenCreate(in_str,' ',&token);CHKERRQ(ierr); 246e5c89e4eSSatish Balay ierr = PetscTokenFind(token,&first);CHKERRQ(ierr); 24796fc60bcSBarry Smith while (first) { 2489db968c8SJed Brown ierr = PetscStrcasecmp(first,"-prefix_push",&ispush);CHKERRQ(ierr); 2499db968c8SJed Brown ierr = PetscStrcasecmp(first,"-prefix_pop",&ispop);CHKERRQ(ierr); 25096fc60bcSBarry Smith ierr = PetscOptionsValidKey(first,&key);CHKERRQ(ierr); 2519db968c8SJed Brown if (ispush) { 2529db968c8SJed Brown ierr = PetscTokenFind(token,&second);CHKERRQ(ierr); 253c5929fdfSBarry Smith ierr = PetscOptionsPrefixPush(options,second);CHKERRQ(ierr); 2549db968c8SJed Brown ierr = PetscTokenFind(token,&first);CHKERRQ(ierr); 2559db968c8SJed Brown } else if (ispop) { 256c5929fdfSBarry Smith ierr = PetscOptionsPrefixPop(options);CHKERRQ(ierr); 2579db968c8SJed Brown ierr = PetscTokenFind(token,&first);CHKERRQ(ierr); 2589db968c8SJed Brown } else if (key) { 259e5c89e4eSSatish Balay ierr = PetscTokenFind(token,&second);CHKERRQ(ierr); 26096fc60bcSBarry Smith ierr = PetscOptionsValidKey(second,&key);CHKERRQ(ierr); 26196fc60bcSBarry Smith if (!key) { 262c5929fdfSBarry Smith ierr = PetscOptionsSetValue(options,first,second);CHKERRQ(ierr); 26396fc60bcSBarry Smith ierr = PetscTokenFind(token,&first);CHKERRQ(ierr); 26496fc60bcSBarry Smith } else { 265c5929fdfSBarry Smith ierr = PetscOptionsSetValue(options,first,NULL);CHKERRQ(ierr); 26696fc60bcSBarry Smith first = second; 26796fc60bcSBarry Smith } 26896fc60bcSBarry Smith } else { 26996fc60bcSBarry Smith ierr = PetscTokenFind(token,&first);CHKERRQ(ierr); 270e5c89e4eSSatish Balay } 271e5c89e4eSSatish Balay } 2728c74ee41SBarry Smith ierr = PetscTokenDestroy(&token);CHKERRQ(ierr); 273e5c89e4eSSatish Balay PetscFunctionReturn(0); 274e5c89e4eSSatish Balay } 275e5c89e4eSSatish Balay 2763fc1eb6aSBarry Smith /* 2773fc1eb6aSBarry Smith Returns a line (ended by a \n, \r or null character of any length. Result should be freed with free() 2783fc1eb6aSBarry Smith */ 2795fa91da5SBarry Smith static char *Petscgetline(FILE * f) 2805fa91da5SBarry Smith { 2815fa91da5SBarry Smith size_t size = 0; 2825fa91da5SBarry Smith size_t len = 0; 2835fa91da5SBarry Smith size_t last = 0; 2840298fd71SBarry Smith char *buf = NULL; 2855fa91da5SBarry Smith 2865fa91da5SBarry Smith if (feof(f)) return 0; 2875fa91da5SBarry Smith do { 2885fa91da5SBarry Smith size += 1024; /* BUFSIZ is defined as "the optimal read size for this platform" */ 2896e0c8459SSatish Balay buf = (char*)realloc((void*)buf,size); /* realloc(NULL,n) is the same as malloc(n) */ 2905fa91da5SBarry Smith /* Actually do the read. Note that fgets puts a terminal '\0' on the 2915fa91da5SBarry Smith end of the string, so we make sure we overwrite this */ 29208ac41f7SSatish Balay if (!fgets(buf+len,size,f)) buf[len]=0; 2935fa91da5SBarry Smith PetscStrlen(buf,&len); 2945fa91da5SBarry Smith last = len - 1; 2955fa91da5SBarry Smith } while (!feof(f) && buf[last] != '\n' && buf[last] != '\r'); 29608ac41f7SSatish Balay if (len) return buf; 2975fa91da5SBarry Smith free(buf); 2985fa91da5SBarry Smith return 0; 2995fa91da5SBarry Smith } 3005fa91da5SBarry Smith 301e5c89e4eSSatish Balay /*@C 302e5c89e4eSSatish Balay PetscOptionsInsertFile - Inserts options into the database from a file. 303e5c89e4eSSatish Balay 3044c48f4c1SBarry Smith Collective on MPI_Comm 305e5c89e4eSSatish Balay 306e5c89e4eSSatish Balay Input Parameter: 3079b754dc9SBarry Smith + comm - the processes that will share the options (usually PETSC_COMM_WORLD) 308c5929fdfSBarry Smith . options - options database, use NULL for default global database 309e5c89e4eSSatish Balay . file - name of file 3109b754dc9SBarry Smith - require - if PETSC_TRUE will generate an error if the file does not exist 311e5c89e4eSSatish Balay 312e5c89e4eSSatish Balay 31395452b02SPatrick Sanan Notes: 31495452b02SPatrick Sanan Use # for lines that are comments and which should be ignored. 3157c43ebc8SBarry Smith 316f0feba65SBarry Smith Usually, instead of using this command, one should list the file name in the call to PetscInitialize(), this insures that certain options 317609bdbeeSBarry 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 318f0feba65SBarry Smith calls to XXXSetFromOptions() it should not be used for options listed under PetscInitialize(). 319f0feba65SBarry Smith 3203bcbd388SSean Farley Level: developer 321e5c89e4eSSatish Balay 32288c29154SBarry Smith .seealso: PetscOptionsSetValue(), PetscOptionsView(), PetscOptionsHasName(), PetscOptionsGetInt(), 323acfcf0e5SJed Brown PetscOptionsGetReal(), PetscOptionsGetString(), PetscOptionsGetIntArray(), PetscOptionsBool(), 324e5c89e4eSSatish Balay PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 325e5c89e4eSSatish Balay PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 326acfcf0e5SJed Brown PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 327a264d7a6SBarry Smith PetscOptionsFList(), PetscOptionsEList() 328e5c89e4eSSatish Balay 329e5c89e4eSSatish Balay @*/ 330c5929fdfSBarry Smith PetscErrorCode PetscOptionsInsertFile(MPI_Comm comm,PetscOptions options,const char file[],PetscBool require) 331e5c89e4eSSatish Balay { 3323a018368SJed Brown char *string,fname[PETSC_MAX_PATH_LEN],*first,*second,*third,*vstring = 0,*astring = 0,*packed = 0; 333e5c89e4eSSatish Balay PetscErrorCode ierr; 33413e3f751SJed Brown size_t i,len,bytes; 335e5c89e4eSSatish Balay FILE *fd; 3369c9d3cfdSBarry Smith PetscToken token; 337ed9cf6e9SBarry Smith int err; 3387c43ebc8SBarry Smith char cmt[1]={'#'},*cmatch; 3393a018368SJed Brown PetscMPIInt rank,cnt=0,acnt=0,counts[2]; 340ad38b122SPatrick Sanan PetscBool isdir; 341e5c89e4eSSatish Balay 342e5c89e4eSSatish Balay PetscFunctionBegin; 34305c7dedfSBarry Smith ierr = MPI_Comm_rank(comm,&rank);CHKERRQ(ierr); 34405c7dedfSBarry Smith if (!rank) { 34566af5158SSatish Balay cnt = 0; 34666af5158SSatish Balay acnt = 0; 34705c7dedfSBarry Smith 348e5c89e4eSSatish Balay ierr = PetscFixFilename(file,fname);CHKERRQ(ierr); 349e5c89e4eSSatish Balay fd = fopen(fname,"r"); 350ad38b122SPatrick Sanan ierr = PetscTestDirectory(fname,'r',&isdir);CHKERRQ(ierr); 351ad38b122SPatrick Sanan if (isdir && require) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_USER,"Specified options file %s is a directory",fname); 352ad38b122SPatrick Sanan if (fd && !isdir) { 3533a018368SJed Brown PetscSegBuffer vseg,aseg; 3543a018368SJed Brown ierr = PetscSegBufferCreate(1,4000,&vseg);CHKERRQ(ierr); 3553a018368SJed Brown ierr = PetscSegBufferCreate(1,2000,&aseg);CHKERRQ(ierr); 3563a018368SJed Brown 3579b754dc9SBarry Smith /* the following line will not work when opening initial files (like .petscrc) since info is not yet set */ 3589b754dc9SBarry Smith ierr = PetscInfo1(0,"Opened options file %s\n",file);CHKERRQ(ierr); 359e24ecc5dSJed Brown 3605fa91da5SBarry Smith while ((string = Petscgetline(fd))) { 3614704e885SBarry Smith /* eliminate comments from each line */ 3627c43ebc8SBarry Smith for (i=0; i<1; i++) { 363a2ea699eSBarry Smith ierr = PetscStrchr(string,cmt[i],&cmatch);CHKERRQ(ierr); 36490f79514SSatish Balay if (cmatch) *cmatch = 0; 36590f79514SSatish Balay } 366e5c89e4eSSatish Balay ierr = PetscStrlen(string,&len);CHKERRQ(ierr); 3675981331cSSatish Balay /* replace tabs, ^M, \n with " " */ 368e5c89e4eSSatish Balay for (i=0; i<len; i++) { 3695981331cSSatish Balay if (string[i] == '\t' || string[i] == '\r' || string[i] == '\n') { 370e5c89e4eSSatish Balay string[i] = ' '; 371e5c89e4eSSatish Balay } 372e5c89e4eSSatish Balay } 37390f79514SSatish Balay ierr = PetscTokenCreate(string,' ',&token);CHKERRQ(ierr); 374e5c89e4eSSatish Balay ierr = PetscTokenFind(token,&first);CHKERRQ(ierr); 37590f79514SSatish Balay if (!first) { 37602b0d46eSSatish Balay goto destroy; 37790f79514SSatish Balay } else if (!first[0]) { /* if first token is empty spaces, redo first token */ 37890f79514SSatish Balay ierr = PetscTokenFind(token,&first);CHKERRQ(ierr); 37990f79514SSatish Balay } 380e5c89e4eSSatish Balay ierr = PetscTokenFind(token,&second);CHKERRQ(ierr); 3812662f744SSatish Balay if (!first) { 3822662f744SSatish Balay goto destroy; 3832662f744SSatish Balay } else if (first[0] == '-') { 384e24ecc5dSJed Brown ierr = PetscStrlen(first,&len);CHKERRQ(ierr); 38513e3f751SJed Brown ierr = PetscSegBufferGet(vseg,len+1,&vstring);CHKERRQ(ierr); 386e24ecc5dSJed Brown ierr = PetscMemcpy(vstring,first,len);CHKERRQ(ierr); 387e24ecc5dSJed Brown vstring[len] = ' '; 38809192fe3SBarry Smith if (second) { 389e24ecc5dSJed Brown ierr = PetscStrlen(second,&len);CHKERRQ(ierr); 39013e3f751SJed Brown ierr = PetscSegBufferGet(vseg,len+3,&vstring);CHKERRQ(ierr); 391e24ecc5dSJed Brown vstring[0] = '"'; 392e24ecc5dSJed Brown ierr = PetscMemcpy(vstring+1,second,len);CHKERRQ(ierr); 393e24ecc5dSJed Brown vstring[len+1] = '"'; 394e24ecc5dSJed Brown vstring[len+2] = ' '; 39509192fe3SBarry Smith } 39690f79514SSatish Balay } else { 397ace3abfcSBarry Smith PetscBool match; 398e5c89e4eSSatish Balay 399e5c89e4eSSatish Balay ierr = PetscStrcasecmp(first,"alias",&match);CHKERRQ(ierr); 400e5c89e4eSSatish Balay if (match) { 401e5c89e4eSSatish Balay ierr = PetscTokenFind(token,&third);CHKERRQ(ierr); 402e32f2f54SBarry Smith if (!third) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Error in options file:alias missing (%s)",second); 403e24ecc5dSJed Brown ierr = PetscStrlen(second,&len);CHKERRQ(ierr); 40413e3f751SJed Brown ierr = PetscSegBufferGet(aseg,len+1,&astring);CHKERRQ(ierr); 405e24ecc5dSJed Brown ierr = PetscMemcpy(astring,second,len);CHKERRQ(ierr); 406e24ecc5dSJed Brown astring[len] = ' '; 407e24ecc5dSJed Brown 408e24ecc5dSJed Brown ierr = PetscStrlen(third,&len);CHKERRQ(ierr); 40913e3f751SJed Brown ierr = PetscSegBufferGet(aseg,len+1,&astring);CHKERRQ(ierr); 410e24ecc5dSJed Brown ierr = PetscMemcpy(astring,third,len);CHKERRQ(ierr); 411e24ecc5dSJed Brown astring[len] = ' '; 412f23aa3ddSBarry Smith } else SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Unknown statement in options file: (%s)",string); 413e5c89e4eSSatish Balay } 41402b0d46eSSatish Balay destroy: 4154b40f50bSBarry Smith free(string); 4168c74ee41SBarry Smith ierr = PetscTokenDestroy(&token);CHKERRQ(ierr); 417e5c89e4eSSatish Balay } 418ed9cf6e9SBarry Smith err = fclose(fd); 419e32f2f54SBarry Smith if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fclose() failed on file"); 420e24ecc5dSJed Brown ierr = PetscSegBufferGetSize(aseg,&bytes);CHKERRQ(ierr); /* size without null termination */ 421e24ecc5dSJed Brown ierr = PetscMPIIntCast(bytes,&acnt);CHKERRQ(ierr); 422e24ecc5dSJed Brown ierr = PetscSegBufferGet(aseg,1,&astring);CHKERRQ(ierr); 423e24ecc5dSJed Brown astring[0] = 0; 424e24ecc5dSJed Brown ierr = PetscSegBufferGetSize(vseg,&bytes);CHKERRQ(ierr); /* size without null termination */ 425e24ecc5dSJed Brown ierr = PetscMPIIntCast(bytes,&cnt);CHKERRQ(ierr); 426e24ecc5dSJed Brown ierr = PetscSegBufferGet(vseg,1,&vstring);CHKERRQ(ierr); 427e24ecc5dSJed Brown vstring[0] = 0; 428854ce69bSBarry Smith ierr = PetscMalloc1(2+acnt+cnt,&packed);CHKERRQ(ierr); 4293a018368SJed Brown ierr = PetscSegBufferExtractTo(aseg,packed);CHKERRQ(ierr); 4303a018368SJed Brown ierr = PetscSegBufferExtractTo(vseg,packed+acnt+1);CHKERRQ(ierr); 4313a018368SJed Brown ierr = PetscSegBufferDestroy(&aseg);CHKERRQ(ierr); 4323a018368SJed Brown ierr = PetscSegBufferDestroy(&vseg);CHKERRQ(ierr); 433f23aa3ddSBarry Smith } else if (require) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_USER,"Unable to open Options File %s",fname); 4349b754dc9SBarry Smith } 43505c7dedfSBarry Smith 4363a018368SJed Brown counts[0] = acnt; 4373a018368SJed Brown counts[1] = cnt; 4383a018368SJed Brown ierr = MPI_Bcast(counts,2,MPI_INT,0,comm);CHKERRQ(ierr); 4393a018368SJed Brown acnt = counts[0]; 4403a018368SJed Brown cnt = counts[1]; 4413a018368SJed Brown if (rank) { 442854ce69bSBarry Smith ierr = PetscMalloc1(2+acnt+cnt,&packed);CHKERRQ(ierr); 4433a018368SJed Brown } 4443a018368SJed Brown if (acnt || cnt) { 4453a018368SJed Brown ierr = MPI_Bcast(packed,2+acnt+cnt,MPI_CHAR,0,comm);CHKERRQ(ierr); 4463a018368SJed Brown astring = packed; 4473a018368SJed Brown vstring = packed + acnt + 1; 4483a018368SJed Brown } 4493a018368SJed Brown 4509b754dc9SBarry Smith if (acnt) { 4519b754dc9SBarry Smith PetscToken token; 4529b754dc9SBarry Smith char *first,*second; 4539b754dc9SBarry Smith 4549b754dc9SBarry Smith ierr = PetscTokenCreate(astring,' ',&token);CHKERRQ(ierr); 4559b754dc9SBarry Smith ierr = PetscTokenFind(token,&first);CHKERRQ(ierr); 4569b754dc9SBarry Smith while (first) { 4579b754dc9SBarry Smith ierr = PetscTokenFind(token,&second);CHKERRQ(ierr); 458c5929fdfSBarry Smith ierr = PetscOptionsSetAlias(options,first,second);CHKERRQ(ierr); 4599b754dc9SBarry Smith ierr = PetscTokenFind(token,&first);CHKERRQ(ierr); 4609b754dc9SBarry Smith } 4618c74ee41SBarry Smith ierr = PetscTokenDestroy(&token);CHKERRQ(ierr); 4629b754dc9SBarry Smith } 4639b754dc9SBarry Smith 4649b754dc9SBarry Smith if (cnt) { 465c5929fdfSBarry Smith ierr = PetscOptionsInsertString(options,vstring);CHKERRQ(ierr); 466e5c89e4eSSatish Balay } 4673a018368SJed Brown ierr = PetscFree(packed);CHKERRQ(ierr); 468e5c89e4eSSatish Balay PetscFunctionReturn(0); 469e5c89e4eSSatish Balay } 470e5c89e4eSSatish Balay 471*2d747510SLisandro Dalcin static PetscErrorCode PetscOptionsInsertArgs(PetscOptions options,int argc,char *args[]) 47285079163SJed Brown { 47385079163SJed Brown PetscErrorCode ierr; 47485079163SJed Brown int left = argc - 1; 47585079163SJed Brown char **eargs = args + 1; 47685079163SJed Brown 47785079163SJed Brown PetscFunctionBegin; 47885079163SJed Brown while (left) { 479093de6efSBarry Smith PetscBool isoptions_file,isprefixpush,isprefixpop,isp4,tisp4,isp4yourname,isp4rmrank,key; 48085079163SJed Brown ierr = PetscStrcasecmp(eargs[0],"-options_file",&isoptions_file);CHKERRQ(ierr); 4819db968c8SJed Brown ierr = PetscStrcasecmp(eargs[0],"-prefix_push",&isprefixpush);CHKERRQ(ierr); 4829db968c8SJed Brown ierr = PetscStrcasecmp(eargs[0],"-prefix_pop",&isprefixpop);CHKERRQ(ierr); 48385079163SJed Brown ierr = PetscStrcasecmp(eargs[0],"-p4pg",&isp4);CHKERRQ(ierr); 48485079163SJed Brown ierr = PetscStrcasecmp(eargs[0],"-p4yourname",&isp4yourname);CHKERRQ(ierr); 48585079163SJed Brown ierr = PetscStrcasecmp(eargs[0],"-p4rmrank",&isp4rmrank);CHKERRQ(ierr); 48685079163SJed Brown ierr = PetscStrcasecmp(eargs[0],"-p4wd",&tisp4);CHKERRQ(ierr); 487ace3abfcSBarry Smith isp4 = (PetscBool) (isp4 || tisp4); 48885079163SJed Brown ierr = PetscStrcasecmp(eargs[0],"-np",&tisp4);CHKERRQ(ierr); 489ace3abfcSBarry Smith isp4 = (PetscBool) (isp4 || tisp4); 49085079163SJed Brown ierr = PetscStrcasecmp(eargs[0],"-p4amslave",&tisp4);CHKERRQ(ierr); 491093de6efSBarry Smith ierr = PetscOptionsValidKey(eargs[0],&key);CHKERRQ(ierr); 49285079163SJed Brown 493093de6efSBarry Smith if (!key) { 49485079163SJed Brown eargs++; left--; 49585079163SJed Brown } else if (isoptions_file) { 49685079163SJed Brown if (left <= 1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_USER,"Missing filename for -options_file filename option"); 49785079163SJed Brown if (eargs[1][0] == '-') SETERRQ(PETSC_COMM_SELF,PETSC_ERR_USER,"Missing filename for -options_file filename option"); 498c5929fdfSBarry Smith ierr = PetscOptionsInsertFile(PETSC_COMM_WORLD,options,eargs[1],PETSC_TRUE);CHKERRQ(ierr); 49985079163SJed Brown eargs += 2; left -= 2; 5009db968c8SJed Brown } else if (isprefixpush) { 5019db968c8SJed Brown if (left <= 1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_USER,"Missing prefix for -prefix_push option"); 5029db968c8SJed Brown if (eargs[1][0] == '-') SETERRQ(PETSC_COMM_SELF,PETSC_ERR_USER,"Missing prefix for -prefix_push option (prefixes cannot start with '-')"); 503c5929fdfSBarry Smith ierr = PetscOptionsPrefixPush(options,eargs[1]);CHKERRQ(ierr); 5049db968c8SJed Brown eargs += 2; left -= 2; 5059db968c8SJed Brown } else if (isprefixpop) { 506c5929fdfSBarry Smith ierr = PetscOptionsPrefixPop(options);CHKERRQ(ierr); 5079db968c8SJed Brown eargs++; left--; 50885079163SJed Brown 50985079163SJed Brown /* 51085079163SJed Brown These are "bad" options that MPICH, etc put on the command line 51185079163SJed Brown we strip them out here. 51285079163SJed Brown */ 51385079163SJed Brown } else if (tisp4 || isp4rmrank) { 51485079163SJed Brown eargs += 1; left -= 1; 51585079163SJed Brown } else if (isp4 || isp4yourname) { 51685079163SJed Brown eargs += 2; left -= 2; 5177935c3d8SJed Brown } else { 5187935c3d8SJed Brown PetscBool nextiskey = PETSC_FALSE; 5197935c3d8SJed Brown if (left >= 2) {ierr = PetscOptionsValidKey(eargs[1],&nextiskey);CHKERRQ(ierr);} 52098b6bf53SJed Brown if (left < 2 || nextiskey) { 521c5929fdfSBarry Smith ierr = PetscOptionsSetValue(options,eargs[0],NULL);CHKERRQ(ierr); 52285079163SJed Brown eargs++; left--; 52385079163SJed Brown } else { 524c5929fdfSBarry Smith ierr = PetscOptionsSetValue(options,eargs[0],eargs[1]);CHKERRQ(ierr); 52585079163SJed Brown eargs += 2; left -= 2; 52685079163SJed Brown } 52785079163SJed Brown } 5287935c3d8SJed Brown } 52985079163SJed Brown PetscFunctionReturn(0); 53085079163SJed Brown } 53185079163SJed Brown 53285079163SJed Brown 533e5c89e4eSSatish Balay /*@C 534e5c89e4eSSatish Balay PetscOptionsInsert - Inserts into the options database from the command line, 535e5c89e4eSSatish Balay the environmental variable and a file. 536e5c89e4eSSatish Balay 537e5c89e4eSSatish Balay Input Parameters: 538c5929fdfSBarry Smith + options - options database or NULL for the default global database 539c5929fdfSBarry Smith . argc - count of number of command line arguments 540e5c89e4eSSatish Balay . args - the command line arguments 541e5c89e4eSSatish Balay - file - optional filename, defaults to ~username/.petscrc 542e5c89e4eSSatish Balay 543e5c89e4eSSatish Balay Note: 544e5c89e4eSSatish Balay Since PetscOptionsInsert() is automatically called by PetscInitialize(), 545e5c89e4eSSatish Balay the user does not typically need to call this routine. PetscOptionsInsert() 546e5c89e4eSSatish Balay can be called several times, adding additional entries into the database. 547e5c89e4eSSatish Balay 548081c24baSBoyana Norris Options Database Keys: 549081c24baSBoyana Norris + -options_monitor <optional filename> - print options names and values as they are set 550ec873e40SMatthew G Knepley . -options_file <filename> - read options from a file 551081c24baSBoyana Norris 552e5c89e4eSSatish Balay Level: advanced 553e5c89e4eSSatish Balay 554e5c89e4eSSatish Balay Concepts: options database^adding 555e5c89e4eSSatish Balay 556*2d747510SLisandro Dalcin .seealso: PetscOptionsDestroy(), PetscOptionsView(), PetscOptionsInsertString(), PetscOptionsInsertFile(), 55796fc60bcSBarry Smith PetscInitialize() 558e5c89e4eSSatish Balay @*/ 559c5929fdfSBarry Smith PetscErrorCode PetscOptionsInsert(PetscOptions options,int *argc,char ***args,const char file[]) 560e5c89e4eSSatish Balay { 561e5c89e4eSSatish Balay PetscErrorCode ierr; 562e5c89e4eSSatish Balay PetscMPIInt rank; 563*2d747510SLisandro Dalcin char filename[PETSC_MAX_PATH_LEN]; 564ace3abfcSBarry Smith PetscBool flag = PETSC_FALSE; 565e5c89e4eSSatish Balay 5668dea33a6SBarry Smith 567e5c89e4eSSatish Balay PetscFunctionBegin; 568e5c89e4eSSatish Balay ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr); 569e5c89e4eSSatish Balay 5704b09e917SBarry Smith if (file && file[0]) { 571*2d747510SLisandro Dalcin ierr = PetscStrreplace(PETSC_COMM_WORLD,file,filename,PETSC_MAX_PATH_LEN);CHKERRQ(ierr); 572*2d747510SLisandro Dalcin ierr = PetscOptionsInsertFile(PETSC_COMM_WORLD,options,filename,PETSC_TRUE);CHKERRQ(ierr); 573321366bcSBarry Smith } 57485079163SJed Brown /* 57585079163SJed Brown We want to be able to give -skip_petscrc on the command line, but need to parse it first. Since the command line 57685079163SJed Brown should take precedence, we insert it twice. It would be sufficient to just scan for -skip_petscrc. 57785079163SJed Brown */ 578*2d747510SLisandro Dalcin if (argc && args && *argc) {ierr = PetscOptionsInsertArgs(options,*argc,*args);CHKERRQ(ierr);} 579c5929fdfSBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-skip_petscrc",&flag,NULL);CHKERRQ(ierr); 580321366bcSBarry Smith if (!flag) { 581*2d747510SLisandro Dalcin ierr = PetscGetHomeDirectory(filename,PETSC_MAX_PATH_LEN-16);CHKERRQ(ierr); 5821ea3218fSSatish Balay /* PetscOptionsInsertFile() does a fopen() on rank0 only - so only rank0 HomeDir value is relavent */ 583*2d747510SLisandro Dalcin if (filename[0]) { ierr = PetscStrcat(filename,"/.petscrc");CHKERRQ(ierr); } 584*2d747510SLisandro Dalcin ierr = PetscOptionsInsertFile(PETSC_COMM_WORLD,options,filename,PETSC_FALSE);CHKERRQ(ierr); 585c5929fdfSBarry Smith ierr = PetscOptionsInsertFile(PETSC_COMM_WORLD,options,".petscrc",PETSC_FALSE);CHKERRQ(ierr); 586c5929fdfSBarry Smith ierr = PetscOptionsInsertFile(PETSC_COMM_WORLD,options,"petscrc",PETSC_FALSE);CHKERRQ(ierr); 587e5c89e4eSSatish Balay } 588e5c89e4eSSatish Balay 589*2d747510SLisandro Dalcin /* insert environment options */ 590e5c89e4eSSatish Balay { 591*2d747510SLisandro Dalcin char *eoptions = NULL; 592e5c89e4eSSatish Balay size_t len = 0; 593e5c89e4eSSatish Balay if (!rank) { 594e5c89e4eSSatish Balay eoptions = (char*)getenv("PETSC_OPTIONS"); 595e5c89e4eSSatish Balay ierr = PetscStrlen(eoptions,&len);CHKERRQ(ierr); 59676434e50SSatish Balay ierr = MPI_Bcast(&len,1,MPIU_SIZE_T,0,PETSC_COMM_WORLD);CHKERRQ(ierr); 597e5c89e4eSSatish Balay } else { 59876434e50SSatish Balay ierr = MPI_Bcast(&len,1,MPIU_SIZE_T,0,PETSC_COMM_WORLD);CHKERRQ(ierr); 599e5c89e4eSSatish Balay if (len) { 600854ce69bSBarry Smith ierr = PetscMalloc1(len+1,&eoptions);CHKERRQ(ierr); 601e5c89e4eSSatish Balay } 602e5c89e4eSSatish Balay } 603e5c89e4eSSatish Balay if (len) { 604e5c89e4eSSatish Balay ierr = MPI_Bcast(eoptions,len,MPI_CHAR,0,PETSC_COMM_WORLD);CHKERRQ(ierr); 60596fc60bcSBarry Smith if (rank) eoptions[len] = 0; 606c5929fdfSBarry Smith ierr = PetscOptionsInsertString(options,eoptions);CHKERRQ(ierr); 607e5c89e4eSSatish Balay if (rank) {ierr = PetscFree(eoptions);CHKERRQ(ierr);} 608e5c89e4eSSatish Balay } 609e5c89e4eSSatish Balay } 610e5c89e4eSSatish Balay 6113bcbd388SSean Farley #if defined(PETSC_HAVE_YAML) 61256a31166SBarry Smith { 6133bcbd388SSean Farley char yaml_file[PETSC_MAX_PATH_LEN]; 61456a31166SBarry Smith PetscBool yaml_flg; 615c5929fdfSBarry Smith ierr = PetscOptionsGetString(NULL,NULL,"-options_file_yaml",yaml_file,PETSC_MAX_PATH_LEN,&yaml_flg);CHKERRQ(ierr); 61656a31166SBarry Smith if (yaml_flg) { 61756a31166SBarry Smith ierr = PetscOptionsInsertFileYAML(PETSC_COMM_WORLD,yaml_file,PETSC_TRUE);CHKERRQ(ierr); 61856a31166SBarry Smith } 61956a31166SBarry Smith } 6203bcbd388SSean Farley #endif 6213bcbd388SSean Farley 62285079163SJed Brown /* insert command line options again because they take precedence over arguments in petscrc/environment */ 623*2d747510SLisandro Dalcin if (argc && args && *argc) {ierr = PetscOptionsInsertArgs(options,*argc,*args);CHKERRQ(ierr);} 624e5c89e4eSSatish Balay PetscFunctionReturn(0); 625e5c89e4eSSatish Balay } 626e5c89e4eSSatish Balay 627e5c89e4eSSatish Balay /*@C 62888c29154SBarry Smith PetscOptionsView - Prints the options that have been loaded. This is 629e5c89e4eSSatish Balay useful for debugging purposes. 630e5c89e4eSSatish Balay 631c139c21fSBarry Smith Logically Collective on PetscViewer 632e5c89e4eSSatish Balay 633e5c89e4eSSatish Balay Input Parameter: 6345c9cc608SHong Zhang - options - options database, use NULL for default global database 6355c9cc608SHong Zhang + viewer - must be an PETSCVIEWERASCII viewer 636e5c89e4eSSatish Balay 637e5c89e4eSSatish Balay Options Database Key: 6381d1ba570SSatish Balay . -options_table - Activates PetscOptionsView() within PetscFinalize() 639e5c89e4eSSatish Balay 640e5c89e4eSSatish Balay Level: advanced 641e5c89e4eSSatish Balay 642e5c89e4eSSatish Balay Concepts: options database^printing 643e5c89e4eSSatish Balay 644e5c89e4eSSatish Balay .seealso: PetscOptionsAllUsed() 645e5c89e4eSSatish Balay @*/ 646c5929fdfSBarry Smith PetscErrorCode PetscOptionsView(PetscOptions options,PetscViewer viewer) 647e5c89e4eSSatish Balay { 648e5c89e4eSSatish Balay PetscErrorCode ierr; 649431c96f7SBarry Smith PetscInt i; 65088c29154SBarry Smith PetscBool isascii; 651e5c89e4eSSatish Balay 652e5c89e4eSSatish Balay PetscFunctionBegin; 653*2d747510SLisandro Dalcin if (viewer) PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2); 654c5929fdfSBarry Smith options = options ? options : defaultoptions; 65588c29154SBarry Smith if (!viewer) viewer = PETSC_VIEWER_STDOUT_WORLD; 656251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&isascii);CHKERRQ(ierr); 657ce94432eSBarry Smith if (!isascii) SETERRQ(PetscObjectComm((PetscObject)viewer),PETSC_ERR_SUP,"Only supports ASCII viewer"); 65888c29154SBarry Smith 659*2d747510SLisandro Dalcin if (!options->N) { 66088c29154SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"#No PETSc Option Table entries\n");CHKERRQ(ierr); 661*2d747510SLisandro Dalcin PetscFunctionReturn(0); 66230694fe9SBarry Smith } 663*2d747510SLisandro Dalcin 664*2d747510SLisandro Dalcin ierr = PetscViewerASCIIPrintf(viewer,"#PETSc Option Table entries:\n");CHKERRQ(ierr); 665e5c89e4eSSatish Balay for (i=0; i<options->N; i++) { 666e5c89e4eSSatish Balay if (options->values[i]) { 66788c29154SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"-%s %s\n",options->names[i],options->values[i]);CHKERRQ(ierr); 668e5c89e4eSSatish Balay } else { 66988c29154SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"-%s\n",options->names[i]);CHKERRQ(ierr); 670e5c89e4eSSatish Balay } 671e5c89e4eSSatish Balay } 67288c29154SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"#End of PETSc Option Table entries\n");CHKERRQ(ierr); 673e5c89e4eSSatish Balay PetscFunctionReturn(0); 674e5c89e4eSSatish Balay } 675e5c89e4eSSatish Balay 676e11779c2SBarry Smith /* 677e11779c2SBarry Smith Called by error handlers to print options used in run 678e11779c2SBarry Smith */ 67995c0884eSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscOptionsViewError(void) 680e11779c2SBarry Smith { 681e11779c2SBarry Smith PetscInt i; 6824416b707SBarry Smith PetscOptions options = defaultoptions; 683e11779c2SBarry Smith 684e11779c2SBarry Smith PetscFunctionBegin; 685e11779c2SBarry Smith if (options->N) { 686e11779c2SBarry Smith (*PetscErrorPrintf)("PETSc Option Table entries:\n"); 687e11779c2SBarry Smith } else { 688e11779c2SBarry Smith (*PetscErrorPrintf)("No PETSc Option Table entries\n"); 689e11779c2SBarry Smith } 690e11779c2SBarry Smith for (i=0; i<options->N; i++) { 691e11779c2SBarry Smith if (options->values[i]) { 692e11779c2SBarry Smith (*PetscErrorPrintf)("-%s %s\n",options->names[i],options->values[i]); 693e11779c2SBarry Smith } else { 694e11779c2SBarry Smith (*PetscErrorPrintf)("-%s\n",options->names[i]); 695e11779c2SBarry Smith } 696e11779c2SBarry Smith } 697e11779c2SBarry Smith PetscFunctionReturn(0); 698e11779c2SBarry Smith } 699e11779c2SBarry Smith 700e5c89e4eSSatish Balay /*@C 70174e0666dSJed Brown PetscOptionsPrefixPush - Designate a prefix to be used by all options insertions to follow. 70274e0666dSJed Brown 70374e0666dSJed Brown Not Collective, but prefix will only be applied on calling ranks 70474e0666dSJed Brown 7059db968c8SJed Brown Input Parameter: 706c5929fdfSBarry Smith + options - options database, or NULL for the default global database 707c5929fdfSBarry Smith - prefix - The string to append to the existing prefix 7089db968c8SJed Brown 7099db968c8SJed Brown Options Database Keys: 7109db968c8SJed Brown + -prefix_push <some_prefix_> - push the given prefix 7119db968c8SJed Brown - -prefix_pop - pop the last prefix 7129db968c8SJed Brown 7139db968c8SJed Brown Notes: 7149db968c8SJed Brown It is common to use this in conjunction with -options_file as in 7159db968c8SJed Brown 7169db968c8SJed Brown $ -prefix_push system1_ -options_file system1rc -prefix_pop -prefix_push system2_ -options_file system2rc -prefix_pop 7179db968c8SJed Brown 7189db968c8SJed Brown where the files no longer require all options to be prefixed with -system2_. 71974e0666dSJed Brown 72074e0666dSJed Brown Level: advanced 72174e0666dSJed Brown 72274e0666dSJed Brown .seealso: PetscOptionsPrefixPop() 72374e0666dSJed Brown @*/ 724c5929fdfSBarry Smith PetscErrorCode PetscOptionsPrefixPush(PetscOptions options,const char prefix[]) 72574e0666dSJed Brown { 72674e0666dSJed Brown PetscErrorCode ierr; 72774e0666dSJed Brown size_t n; 72874e0666dSJed Brown PetscInt start; 729*2d747510SLisandro Dalcin char key[MAXOPTNAME+1]; 730*2d747510SLisandro Dalcin PetscBool valid; 73174e0666dSJed Brown 73274e0666dSJed Brown PetscFunctionBegin; 7339db968c8SJed Brown PetscValidCharPointer(prefix,1); 734c5929fdfSBarry Smith options = options ? options : defaultoptions; 73574e0666dSJed 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); 736*2d747510SLisandro Dalcin key[0] = '-'; /* keys must start with '-' */ 737*2d747510SLisandro Dalcin ierr = PetscStrncpy(key+1,prefix,sizeof(key)-1);CHKERRQ(ierr); 738*2d747510SLisandro Dalcin ierr = PetscOptionsValidKey(key,&valid);CHKERRQ(ierr); 739*2d747510SLisandro 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); 74074e0666dSJed Brown start = options->prefixind ? options->prefixstack[options->prefixind-1] : 0; 74174e0666dSJed Brown ierr = PetscStrlen(prefix,&n);CHKERRQ(ierr); 74274e0666dSJed Brown if (n+1 > sizeof(options->prefix)-start) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Maximum prefix length %d exceeded",sizeof(options->prefix)); 74374e0666dSJed Brown ierr = PetscMemcpy(options->prefix+start,prefix,n+1);CHKERRQ(ierr); 74474e0666dSJed Brown options->prefixstack[options->prefixind++] = start+n; 74574e0666dSJed Brown PetscFunctionReturn(0); 74674e0666dSJed Brown } 74774e0666dSJed Brown 748c5929fdfSBarry Smith /*@C 74974e0666dSJed Brown PetscOptionsPrefixPop - Remove the latest options prefix, see PetscOptionsPrefixPush() for details 75074e0666dSJed Brown 75174e0666dSJed Brown Not Collective, but prefix will only be popped on calling ranks 75274e0666dSJed Brown 753c5929fdfSBarry Smith Input Parameters: 754c5929fdfSBarry Smith . options - options database, or NULL for the default global database 755c5929fdfSBarry Smith 75674e0666dSJed Brown Level: advanced 75774e0666dSJed Brown 75874e0666dSJed Brown .seealso: PetscOptionsPrefixPush() 75974e0666dSJed Brown @*/ 760c5929fdfSBarry Smith PetscErrorCode PetscOptionsPrefixPop(PetscOptions options) 76174e0666dSJed Brown { 76274e0666dSJed Brown PetscInt offset; 76374e0666dSJed Brown 76474e0666dSJed Brown PetscFunctionBegin; 765c5929fdfSBarry Smith options = options ? options : defaultoptions; 76674e0666dSJed Brown if (options->prefixind < 1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"More prefixes popped than pushed"); 76774e0666dSJed Brown options->prefixind--; 76874e0666dSJed Brown offset = options->prefixind ? options->prefixstack[options->prefixind-1] : 0; 76974e0666dSJed Brown options->prefix[offset] = 0; 77074e0666dSJed Brown PetscFunctionReturn(0); 77174e0666dSJed Brown } 77274e0666dSJed Brown 773a542b6e8SBarry Smith /*@C 774a542b6e8SBarry Smith PetscOptionsClear - Removes all options form the database leaving it empty. 775a542b6e8SBarry Smith 776c5929fdfSBarry Smith Input Parameters: 777c5929fdfSBarry Smith . options - options database, use NULL for the default global database 778c5929fdfSBarry Smith 779a542b6e8SBarry Smith Level: developer 780a542b6e8SBarry Smith 781a542b6e8SBarry Smith .seealso: PetscOptionsInsert() 782a542b6e8SBarry Smith @*/ 783c5929fdfSBarry Smith PetscErrorCode PetscOptionsClear(PetscOptions options) 784a542b6e8SBarry Smith { 785a542b6e8SBarry Smith PetscInt i; 786a542b6e8SBarry Smith 787c5929fdfSBarry Smith options = options ? options : defaultoptions; 788*2d747510SLisandro Dalcin if (!options) return 0; 789*2d747510SLisandro Dalcin 790a542b6e8SBarry Smith for (i=0; i<options->N; i++) { 791a542b6e8SBarry Smith if (options->names[i]) free(options->names[i]); 792a542b6e8SBarry Smith if (options->values[i]) free(options->values[i]); 793a542b6e8SBarry Smith } 794*2d747510SLisandro Dalcin options->N = 0; 795*2d747510SLisandro Dalcin 796a542b6e8SBarry Smith for (i=0; i<options->Naliases; i++) { 797a542b6e8SBarry Smith free(options->aliases1[i]); 798a542b6e8SBarry Smith free(options->aliases2[i]); 799a542b6e8SBarry Smith } 800a542b6e8SBarry Smith options->Naliases = 0; 801a542b6e8SBarry Smith 802*2d747510SLisandro Dalcin /* destroy hash table */ 803*2d747510SLisandro Dalcin kh_destroy(HO,options->ht); 804*2d747510SLisandro Dalcin options->ht = NULL; 8050eb63584SBarry Smith 806*2d747510SLisandro Dalcin options->prefixind = 0; 807*2d747510SLisandro Dalcin options->prefix[0] = 0; 808*2d747510SLisandro Dalcin options->help = PETSC_FALSE; 8094416b707SBarry Smith return 0; 8104416b707SBarry Smith } 8114416b707SBarry Smith 812*2d747510SLisandro Dalcin /*@C 813*2d747510SLisandro Dalcin PetscOptionsSetAlias - Makes a key and alias for another key 814*2d747510SLisandro Dalcin 815*2d747510SLisandro Dalcin Not Collective, but setting values on certain processors could cause problems 816*2d747510SLisandro Dalcin for parallel objects looking for options. 817*2d747510SLisandro Dalcin 818*2d747510SLisandro Dalcin Input Parameters: 819*2d747510SLisandro Dalcin + options - options database, or NULL for default global database 820*2d747510SLisandro Dalcin . newname - the alias 821*2d747510SLisandro Dalcin - oldname - the name that alias will refer to 822*2d747510SLisandro Dalcin 823*2d747510SLisandro Dalcin Level: advanced 824*2d747510SLisandro Dalcin 825*2d747510SLisandro Dalcin .seealso: PetscOptionsGetInt(), PetscOptionsGetReal(),OptionsHasName(), 826*2d747510SLisandro Dalcin PetscOptionsGetString(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(),PetscOptionsBool(), 827*2d747510SLisandro Dalcin PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 828*2d747510SLisandro Dalcin PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 829*2d747510SLisandro Dalcin PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 830*2d747510SLisandro Dalcin PetscOptionsFList(), PetscOptionsEList() 831*2d747510SLisandro Dalcin @*/ 832*2d747510SLisandro Dalcin PetscErrorCode PetscOptionsSetAlias(PetscOptions options,const char newname[],const char oldname[]) 833*2d747510SLisandro Dalcin { 834*2d747510SLisandro Dalcin PetscInt n; 835*2d747510SLisandro Dalcin size_t len; 836*2d747510SLisandro Dalcin PetscErrorCode ierr; 837*2d747510SLisandro Dalcin 838*2d747510SLisandro Dalcin PetscFunctionBegin; 839*2d747510SLisandro Dalcin PetscValidCharPointer(newname,2); 840*2d747510SLisandro Dalcin PetscValidCharPointer(oldname,3); 841*2d747510SLisandro Dalcin options = options ? options : defaultoptions; 842*2d747510SLisandro Dalcin if (newname[0] != '-') SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"aliased must start with '-': Instead %s",newname); 843*2d747510SLisandro Dalcin if (oldname[0] != '-') SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"aliasee must start with '-': Instead %s",oldname); 844*2d747510SLisandro Dalcin 845*2d747510SLisandro Dalcin n = options->Naliases; 846*2d747510SLisandro 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); 847*2d747510SLisandro Dalcin 848*2d747510SLisandro Dalcin newname++; oldname++; 849*2d747510SLisandro Dalcin ierr = PetscStrlen(newname,&len);CHKERRQ(ierr); 850*2d747510SLisandro Dalcin options->aliases1[n] = (char*)malloc((len+1)*sizeof(char)); 851*2d747510SLisandro Dalcin ierr = PetscStrcpy(options->aliases1[n],newname);CHKERRQ(ierr); 852*2d747510SLisandro Dalcin ierr = PetscStrlen(oldname,&len);CHKERRQ(ierr); 853*2d747510SLisandro Dalcin options->aliases2[n] = (char*)malloc((len+1)*sizeof(char)); 854*2d747510SLisandro Dalcin ierr = PetscStrcpy(options->aliases2[n],oldname);CHKERRQ(ierr); 855*2d747510SLisandro Dalcin options->Naliases++; 856*2d747510SLisandro Dalcin PetscFunctionReturn(0); 857*2d747510SLisandro Dalcin } 8584416b707SBarry Smith 859e5c89e4eSSatish Balay /*@C 860e5c89e4eSSatish Balay PetscOptionsSetValue - Sets an option name-value pair in the options 861e5c89e4eSSatish Balay database, overriding whatever is already present. 862e5c89e4eSSatish Balay 863*2d747510SLisandro Dalcin Not Collective, but setting values on certain processors could cause problems 864e5c89e4eSSatish Balay for parallel objects looking for options. 865e5c89e4eSSatish Balay 866e5c89e4eSSatish Balay Input Parameters: 867c5929fdfSBarry Smith + options - options database, use NULL for the default global database 868c5929fdfSBarry Smith . name - name of option, this SHOULD have the - prepended 869*2d747510SLisandro Dalcin - value - the option value (not used for all options, so can be NULL) 870e5c89e4eSSatish Balay 871e5c89e4eSSatish Balay Level: intermediate 872e5c89e4eSSatish Balay 873e5c89e4eSSatish Balay Note: 874d49172ceSBarry Smith This function can be called BEFORE PetscInitialize() 875d49172ceSBarry Smith 876*2d747510SLisandro Dalcin Developers Note: Uses malloc() directly because PETSc may not be initialized yet. 877b0250c70SBarry Smith 878e5c89e4eSSatish Balay Concepts: options database^adding option 879e5c89e4eSSatish Balay 880*2d747510SLisandro Dalcin .seealso: PetscOptionsInsert(), PetscOptionsClearValue() 881e5c89e4eSSatish Balay @*/ 882*2d747510SLisandro Dalcin PetscErrorCode PetscOptionsSetValue(PetscOptions options,const char name[],const char value[]) 883e5c89e4eSSatish Balay { 884e5c89e4eSSatish Balay size_t len; 885*2d747510SLisandro Dalcin int N,n,i; 886e5c89e4eSSatish Balay char **names; 887*2d747510SLisandro Dalcin char fullname[MAXOPTNAME] = ""; 888*2d747510SLisandro Dalcin PetscErrorCode ierr; 889e5c89e4eSSatish Balay 890*2d747510SLisandro Dalcin if (!options && !defaultoptions) { 891*2d747510SLisandro Dalcin ierr = PetscOptionsCreateDefault();if (ierr) return ierr; 892c5929fdfSBarry Smith } 893*2d747510SLisandro Dalcin options = options ? options : defaultoptions; 894*2d747510SLisandro Dalcin 895*2d747510SLisandro Dalcin if (name[0] != '-') return PETSC_ERR_ARG_OUTOFRANGE; 896e5c89e4eSSatish Balay 897d49172ceSBarry Smith /* this is so that -h and -help are equivalent (p4 does not like -help)*/ 898*2d747510SLisandro Dalcin if (!strcmp(name,"-h")) name = "-help"; 899*2d747510SLisandro Dalcin if (!PetscOptNameCmp(name,"-help")) options->help = PETSC_TRUE; 900e5c89e4eSSatish Balay 901*2d747510SLisandro Dalcin name++; /* skip starting dash */ 902*2d747510SLisandro Dalcin 90374e0666dSJed Brown if (options->prefixind > 0) { 904d49172ceSBarry Smith strncpy(fullname,options->prefix,sizeof(fullname)); 905*2d747510SLisandro Dalcin fullname[sizeof(fullname)-1] = 0; 90689ae1891SBarry Smith strncat(fullname,name,sizeof(fullname)-strlen(fullname)-1); 907*2d747510SLisandro Dalcin fullname[sizeof(fullname)-1] = 0; 90874e0666dSJed Brown name = fullname; 90974e0666dSJed Brown } 91074e0666dSJed Brown 91174e0666dSJed Brown /* check against aliases */ 912e5c89e4eSSatish Balay N = options->Naliases; 913e5c89e4eSSatish Balay for (i=0; i<N; i++) { 914*2d747510SLisandro Dalcin int result = PetscOptNameCmp(options->aliases1[i],name); 915*2d747510SLisandro Dalcin if (!result) { name = options->aliases2[i]; break; } 916e5c89e4eSSatish Balay } 917e5c89e4eSSatish Balay 918*2d747510SLisandro Dalcin /* slow search */ 919*2d747510SLisandro Dalcin N = n = options->N; 920e5c89e4eSSatish Balay names = options->names; 921e5c89e4eSSatish Balay for (i=0; i<N; i++) { 922*2d747510SLisandro Dalcin int result = PetscOptNameCmp(names[i],name); 923*2d747510SLisandro Dalcin if (!result) { 924*2d747510SLisandro Dalcin n = i; goto setvalue; 925*2d747510SLisandro Dalcin } else if (result > 0) { 926*2d747510SLisandro Dalcin n = i; break; 927e5c89e4eSSatish Balay } 928e5c89e4eSSatish Balay } 929*2d747510SLisandro Dalcin if (N >= MAXOPTIONS) return PETSC_ERR_MEM; 930*2d747510SLisandro Dalcin /* shift remaining values up 1 */ 931e5c89e4eSSatish Balay for (i=N; i>n; i--) { 9325e8c5e88SLisandro Dalcin options->names[i] = options->names[i-1]; 933e5c89e4eSSatish Balay options->values[i] = options->values[i-1]; 934e5c89e4eSSatish Balay options->used[i] = options->used[i-1]; 935e5c89e4eSSatish Balay } 936*2d747510SLisandro Dalcin options->names[n] = NULL; 937*2d747510SLisandro Dalcin options->values[n] = NULL; 938*2d747510SLisandro Dalcin options->used[n] = PETSC_FALSE; 939*2d747510SLisandro Dalcin options->N++; 940*2d747510SLisandro Dalcin 941*2d747510SLisandro Dalcin /* destroy hash table */ 942*2d747510SLisandro Dalcin kh_destroy(HO,options->ht); 943*2d747510SLisandro Dalcin options->ht = NULL; 944*2d747510SLisandro Dalcin 945*2d747510SLisandro Dalcin /* set new name */ 94670d8d27cSBarry Smith len = strlen(name); 9475e8c5e88SLisandro Dalcin options->names[n] = (char*)malloc((len+1)*sizeof(char)); 948d49172ceSBarry Smith if (!options->names[n]) return PETSC_ERR_MEM; 949d49172ceSBarry Smith strcpy(options->names[n],name); 950*2d747510SLisandro Dalcin 951*2d747510SLisandro Dalcin setvalue: 952*2d747510SLisandro Dalcin /* set new value */ 953*2d747510SLisandro Dalcin if (options->values[n]) free(options->values[n]); 954d49172ceSBarry Smith len = value ? strlen(value) : 0; 9555e8c5e88SLisandro Dalcin if (len) { 956e5c89e4eSSatish Balay options->values[n] = (char*)malloc((len+1)*sizeof(char)); 957d49172ceSBarry Smith if (!options->values[n]) return PETSC_ERR_MEM; 958d49172ceSBarry Smith strcpy(options->values[n],value); 959*2d747510SLisandro Dalcin } else { 960*2d747510SLisandro Dalcin options->values[n] = NULL; 961*2d747510SLisandro Dalcin } 962*2d747510SLisandro Dalcin 963*2d747510SLisandro Dalcin ierr = PetscOptionsMonitor(options,name,value?value:"");if (ierr) return ierr; 964d49172ceSBarry Smith return 0; 965e5c89e4eSSatish Balay } 966e5c89e4eSSatish Balay 967e5c89e4eSSatish Balay /*@C 968e5c89e4eSSatish Balay PetscOptionsClearValue - Clears an option name-value pair in the options 969e5c89e4eSSatish Balay database, overriding whatever is already present. 970e5c89e4eSSatish Balay 971e5c89e4eSSatish Balay Not Collective, but setting values on certain processors could cause problems 972e5c89e4eSSatish Balay for parallel objects looking for options. 973e5c89e4eSSatish Balay 974e5c89e4eSSatish Balay Input Parameter: 975c5929fdfSBarry Smith + options - options database, use NULL for the default global database 976e5c89e4eSSatish Balay . name - name of option, this SHOULD have the - prepended 977e5c89e4eSSatish Balay 978e5c89e4eSSatish Balay Level: intermediate 979e5c89e4eSSatish Balay 980e5c89e4eSSatish Balay Concepts: options database^removing option 981e5c89e4eSSatish Balay .seealso: PetscOptionsInsert() 982e5c89e4eSSatish Balay @*/ 983*2d747510SLisandro Dalcin PetscErrorCode PetscOptionsClearValue(PetscOptions options,const char name[]) 984e5c89e4eSSatish Balay { 985*2d747510SLisandro Dalcin int N,n,i; 986*2d747510SLisandro Dalcin char **names; 987e5c89e4eSSatish Balay PetscErrorCode ierr; 988e5c89e4eSSatish Balay 989e5c89e4eSSatish Balay PetscFunctionBegin; 990c5929fdfSBarry Smith options = options ? options : defaultoptions; 991*2d747510SLisandro Dalcin if (name[0] != '-') SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Name must begin with '-': Instead %s",name); 992e5c89e4eSSatish Balay 993*2d747510SLisandro Dalcin /* this is so that -h and -help are equivalent (p4 does not like -help)*/ 994*2d747510SLisandro Dalcin if (!strcmp(name,"-h")) name = "-help"; 995*2d747510SLisandro Dalcin if (!PetscOptNameCmp(name,"-help")) options->help = PETSC_FALSE; 996*2d747510SLisandro Dalcin 997*2d747510SLisandro Dalcin name++; /* skip starting dash */ 998*2d747510SLisandro Dalcin 999*2d747510SLisandro Dalcin /* slow search */ 1000*2d747510SLisandro Dalcin N = n = options->N; 1001e5c89e4eSSatish Balay names = options->names; 1002e5c89e4eSSatish Balay for (i=0; i<N; i++) { 1003*2d747510SLisandro Dalcin int result = PetscOptNameCmp(names[i],name); 1004*2d747510SLisandro Dalcin if (!result) { 1005*2d747510SLisandro Dalcin n = i; break; 1006*2d747510SLisandro Dalcin } else if (result > 0) { 1007*2d747510SLisandro Dalcin n = N; break; 1008e5c89e4eSSatish Balay } 1009*2d747510SLisandro Dalcin } 1010*2d747510SLisandro Dalcin if (n == N) PetscFunctionReturn(0); /* it was not present */ 1011e5c89e4eSSatish Balay 1012*2d747510SLisandro Dalcin /* remove name and value */ 1013*2d747510SLisandro Dalcin if (options->names[n]) free(options->names[n]); 1014*2d747510SLisandro Dalcin if (options->values[n]) free(options->values[n]); 1015e5c89e4eSSatish Balay /* shift remaining values down 1 */ 1016e5c89e4eSSatish Balay for (i=n; i<N-1; i++) { 10175e8c5e88SLisandro Dalcin options->names[i] = options->names[i+1]; 1018e5c89e4eSSatish Balay options->values[i] = options->values[i+1]; 1019e5c89e4eSSatish Balay options->used[i] = options->used[i+1]; 1020e5c89e4eSSatish Balay } 1021e5c89e4eSSatish Balay options->N--; 1022*2d747510SLisandro Dalcin 1023*2d747510SLisandro Dalcin /* destroy hash table */ 1024*2d747510SLisandro Dalcin kh_destroy(HO,options->ht); 1025*2d747510SLisandro Dalcin options->ht = NULL; 1026*2d747510SLisandro Dalcin 1027*2d747510SLisandro Dalcin ierr = PetscOptionsMonitor(options,name,NULL);CHKERRQ(ierr); 1028e5c89e4eSSatish Balay PetscFunctionReturn(0); 1029e5c89e4eSSatish Balay } 1030e5c89e4eSSatish Balay 1031e5c89e4eSSatish Balay /*@C 1032*2d747510SLisandro Dalcin PetscOptionsFindPair - Gets an option name-value pair from the options database. 1033e5c89e4eSSatish Balay 1034*2d747510SLisandro Dalcin Not Collective 1035e5c89e4eSSatish Balay 1036e5c89e4eSSatish Balay Input Parameters: 1037*2d747510SLisandro Dalcin + options - options database, use NULL for the default global database 1038*2d747510SLisandro Dalcin . pre - the string to prepend to the name or NULL, this SHOULD NOT have the "-" prepended 1039*2d747510SLisandro Dalcin - name - name of option, this SHOULD have the "-" prepended 1040e5c89e4eSSatish Balay 1041*2d747510SLisandro Dalcin Output Parameters: 1042*2d747510SLisandro Dalcin + value - the option value (optional, not used for all options) 1043*2d747510SLisandro Dalcin - set - whether the option is set (optional) 1044e5c89e4eSSatish Balay 1045*2d747510SLisandro Dalcin Level: developer 1046*2d747510SLisandro Dalcin 1047*2d747510SLisandro Dalcin Concepts: options database^getting option 1048*2d747510SLisandro Dalcin 1049*2d747510SLisandro Dalcin .seealso: PetscOptionsSetValue(), PetscOptionsClearValue() 1050e5c89e4eSSatish Balay @*/ 1051*2d747510SLisandro Dalcin PetscErrorCode PetscOptionsFindPair(PetscOptions options,const char pre[],const char name[],const char *value[],PetscBool *set) 1052e5c89e4eSSatish Balay { 1053*2d747510SLisandro Dalcin char buf[MAXOPTNAME]; 1054*2d747510SLisandro Dalcin PetscBool usehashtable = PETSC_TRUE; 1055*2d747510SLisandro Dalcin PetscBool matchnumbers = PETSC_TRUE; 1056e5c89e4eSSatish Balay PetscErrorCode ierr; 1057e5c89e4eSSatish Balay 1058e5c89e4eSSatish Balay PetscFunctionBegin; 1059c5929fdfSBarry Smith options = options ? options : defaultoptions; 1060*2d747510SLisandro Dalcin if (pre && PetscUnlikely(pre[0] == '-')) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Prefix cannot begin with '-': Instead %s",pre); 1061*2d747510SLisandro Dalcin if (PetscUnlikely(name[0] != '-')) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Name must begin with '-': Instead %s",name); 1062e5c89e4eSSatish Balay 1063*2d747510SLisandro Dalcin name++; /* skip starting dash */ 1064e5c89e4eSSatish Balay 10657cd08cecSJed Brown /* append prefix to name, if prefix="foo_" and option='--bar", prefixed option is --foo_bar */ 1066*2d747510SLisandro Dalcin if (pre && pre[0]) { 1067*2d747510SLisandro Dalcin char *ptr = buf; 1068*2d747510SLisandro Dalcin if (name[0] == '-') { *ptr++ = '-'; name++; } 1069*2d747510SLisandro Dalcin ierr = PetscStrncpy(ptr,pre,buf+sizeof(buf)-ptr);CHKERRQ(ierr); 1070*2d747510SLisandro Dalcin ierr = PetscStrlcat(buf,name,sizeof(buf));CHKERRQ(ierr); 1071*2d747510SLisandro Dalcin name = buf; 10727cd08cecSJed Brown } 1073*2d747510SLisandro Dalcin 10742f828895SJed Brown #if defined(PETSC_USE_DEBUG) 10752f828895SJed Brown { 10762f828895SJed Brown PetscBool valid; 1077*2d747510SLisandro Dalcin char key[MAXOPTNAME+1] = "-"; 1078*2d747510SLisandro Dalcin ierr = PetscStrncpy(key+1,name,sizeof(key)-1);CHKERRQ(ierr); 10792f828895SJed Brown ierr = PetscOptionsValidKey(key,&valid);CHKERRQ(ierr); 10802f828895SJed 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); 10812f828895SJed Brown } 10822f828895SJed Brown #endif 1083e5c89e4eSSatish Balay 1084*2d747510SLisandro Dalcin if (!options->ht && usehashtable) { 1085*2d747510SLisandro Dalcin int i,ret; 1086*2d747510SLisandro Dalcin khiter_t it; 1087*2d747510SLisandro Dalcin khash_t(HO) *ht; 1088*2d747510SLisandro Dalcin ht = kh_init(HO); 1089*2d747510SLisandro Dalcin if (PetscUnlikely(!ht)) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_MEM,"Hash table allocation failed"); 1090*2d747510SLisandro Dalcin ret = kh_resize(HO,ht,options->N*2); /* twice the required size to reduce risk of collisions */ 1091*2d747510SLisandro Dalcin if (PetscUnlikely(ret)) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_MEM,"Hash table allocation failed"); 1092*2d747510SLisandro Dalcin for (i=0; i<options->N; i++) { 1093*2d747510SLisandro Dalcin it = kh_put(HO,ht,options->names[i],&ret); 1094*2d747510SLisandro Dalcin if (PetscUnlikely(ret != 1)) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_MEM,"Hash table allocation failed"); 1095*2d747510SLisandro Dalcin kh_val(ht,it) = i; 1096*2d747510SLisandro Dalcin } 1097*2d747510SLisandro Dalcin options->ht = ht; 1098*2d747510SLisandro Dalcin } 1099*2d747510SLisandro Dalcin 1100*2d747510SLisandro Dalcin if (usehashtable) 1101*2d747510SLisandro Dalcin { /* fast search */ 1102*2d747510SLisandro Dalcin khash_t(HO) *ht = options->ht; 1103*2d747510SLisandro Dalcin khiter_t it = kh_get(HO,ht,name); 1104*2d747510SLisandro Dalcin if (it != kh_end(ht)) { 1105*2d747510SLisandro Dalcin int i = kh_val(ht,it); 1106e5c89e4eSSatish Balay options->used[i] = PETSC_TRUE; 1107*2d747510SLisandro Dalcin if (value) *value = options->values[i]; 1108*2d747510SLisandro Dalcin if (set) *set = PETSC_TRUE; 1109*2d747510SLisandro Dalcin PetscFunctionReturn(0); 1110*2d747510SLisandro Dalcin } 1111*2d747510SLisandro Dalcin } else 1112*2d747510SLisandro Dalcin { /* slow search */ 1113*2d747510SLisandro Dalcin int i, N = options->N; 1114*2d747510SLisandro Dalcin for (i=0; i<N; i++) { 1115*2d747510SLisandro Dalcin int result = PetscOptNameCmp(options->names[i],name);CHKERRQ(ierr); 1116*2d747510SLisandro Dalcin if (!result) { 1117*2d747510SLisandro Dalcin options->used[i] = PETSC_TRUE; 1118*2d747510SLisandro Dalcin if (value) *value = options->values[i]; 1119*2d747510SLisandro Dalcin if (set) *set = PETSC_TRUE; 1120*2d747510SLisandro Dalcin PetscFunctionReturn(0); 1121*2d747510SLisandro Dalcin } else if (result > 0) { 1122e5c89e4eSSatish Balay break; 1123e5c89e4eSSatish Balay } 1124e5c89e4eSSatish Balay } 1125*2d747510SLisandro Dalcin } 1126*2d747510SLisandro Dalcin 1127*2d747510SLisandro Dalcin /* 1128*2d747510SLisandro Dalcin The following block slows down all lookups in the most frequent path (most lookups are unsuccessful). 1129*2d747510SLisandro Dalcin Maybe this special lookup mode should be enabled on request with a push/pop API. 1130*2d747510SLisandro Dalcin The feature of matching _%d_ used sparingly in the codebase. 1131*2d747510SLisandro Dalcin */ 1132*2d747510SLisandro Dalcin if (matchnumbers) { 1133*2d747510SLisandro Dalcin int i,j,cnt = 0,locs[16],loce[16]; 1134e5c89e4eSSatish Balay /* determine the location and number of all _%d_ in the key */ 1135*2d747510SLisandro Dalcin for (i=0; name[i]; i++) { 1136*2d747510SLisandro Dalcin if (name[i] == '_') { 1137*2d747510SLisandro Dalcin for (j=i+1; name[j]; j++) { 1138*2d747510SLisandro Dalcin if (name[j] >= '0' && name[j] <= '9') continue; 1139*2d747510SLisandro Dalcin if (name[j] == '_' && j > i+1) { /* found a number */ 1140e5c89e4eSSatish Balay locs[cnt] = i+1; 1141e5c89e4eSSatish Balay loce[cnt++] = j+1; 1142e5c89e4eSSatish Balay } 1143*2d747510SLisandro Dalcin i = j-1; 1144e5c89e4eSSatish Balay break; 1145e5c89e4eSSatish Balay } 1146e5c89e4eSSatish Balay } 1147e5c89e4eSSatish Balay } 1148e5c89e4eSSatish Balay for (i=0; i<cnt; i++) { 1149*2d747510SLisandro Dalcin PetscBool found; 1150*2d747510SLisandro Dalcin char opt[MAXOPTNAME+1] = "-", tmp[MAXOPTNAME]; 1151*2d747510SLisandro Dalcin ierr = PetscStrncpy(tmp,name,PetscMin((size_t)(locs[i]+1),sizeof(tmp)));CHKERRQ(ierr); 1152*2d747510SLisandro Dalcin ierr = PetscStrlcat(opt,tmp,sizeof(opt));CHKERRQ(ierr); 1153*2d747510SLisandro Dalcin ierr = PetscStrlcat(opt,name+loce[i],sizeof(opt));CHKERRQ(ierr); 1154*2d747510SLisandro Dalcin ierr = PetscOptionsFindPair(options,NULL,opt,value,&found);CHKERRQ(ierr); 1155*2d747510SLisandro Dalcin if (found) {if (set) *set = PETSC_TRUE; PetscFunctionReturn(0);} 1156e5c89e4eSSatish Balay } 1157e5c89e4eSSatish Balay } 1158*2d747510SLisandro Dalcin 1159*2d747510SLisandro Dalcin if (set) *set = PETSC_FALSE; 1160e5c89e4eSSatish Balay PetscFunctionReturn(0); 1161e5c89e4eSSatish Balay } 1162e5c89e4eSSatish Balay 1163*2d747510SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscOptionsFindPairPrefix_Private(PetscOptions options,const char pre[], const char name[],const char *value[],PetscBool *set) 1164514bf10dSMatthew G Knepley { 1165*2d747510SLisandro Dalcin char buf[MAXOPTNAME]; 1166514bf10dSMatthew G Knepley PetscErrorCode ierr; 1167514bf10dSMatthew G Knepley 1168514bf10dSMatthew G Knepley PetscFunctionBegin; 1169c5929fdfSBarry Smith options = options ? options : defaultoptions; 1170*2d747510SLisandro Dalcin if (pre && pre[0] == '-') SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Prefix cannot begin with '-': Instead %s",pre); 1171*2d747510SLisandro Dalcin if (name[0] != '-') SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Name must begin with '-': Instead %s",name); 1172514bf10dSMatthew G Knepley 1173*2d747510SLisandro Dalcin name++; /* skip starting dash */ 1174514bf10dSMatthew G Knepley 1175514bf10dSMatthew G Knepley /* append prefix to name, if prefix="foo_" and option='--bar", prefixed option is --foo_bar */ 1176*2d747510SLisandro Dalcin if (pre && pre[0]) { 1177*2d747510SLisandro Dalcin char *ptr = buf; 1178*2d747510SLisandro Dalcin if (name[0] == '-') { *ptr++ = '-'; name++; } 1179*2d747510SLisandro Dalcin ierr = PetscStrncpy(ptr,pre,sizeof(buf)+(size_t)(ptr-buf));CHKERRQ(ierr); 1180*2d747510SLisandro Dalcin ierr = PetscStrlcat(buf,name,sizeof(buf));CHKERRQ(ierr); 1181*2d747510SLisandro Dalcin name = buf; 1182514bf10dSMatthew G Knepley } 1183*2d747510SLisandro Dalcin 1184514bf10dSMatthew G Knepley #if defined(PETSC_USE_DEBUG) 1185514bf10dSMatthew G Knepley { 1186514bf10dSMatthew G Knepley PetscBool valid; 1187*2d747510SLisandro Dalcin char key[MAXOPTNAME+1] = "-"; 1188*2d747510SLisandro Dalcin ierr = PetscStrncpy(key+1,name,sizeof(key)-1);CHKERRQ(ierr); 1189514bf10dSMatthew G Knepley ierr = PetscOptionsValidKey(key,&valid);CHKERRQ(ierr); 1190514bf10dSMatthew 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); 1191514bf10dSMatthew G Knepley } 1192514bf10dSMatthew G Knepley #endif 1193514bf10dSMatthew G Knepley 1194*2d747510SLisandro Dalcin { /* slow search */ 1195*2d747510SLisandro Dalcin int i; 1196*2d747510SLisandro Dalcin size_t len; 1197*2d747510SLisandro Dalcin PetscBool match; 1198*2d747510SLisandro Dalcin ierr = PetscStrlen(name,&len);CHKERRQ(ierr); 1199*2d747510SLisandro Dalcin for (i=0; i<options->N; i++) { 1200*2d747510SLisandro Dalcin ierr = PetscStrncmp(options->names[i],name,len,&match);CHKERRQ(ierr); 1201514bf10dSMatthew G Knepley if (match) { 1202514bf10dSMatthew G Knepley options->used[i] = PETSC_TRUE; 1203*2d747510SLisandro Dalcin if (value) *value = options->values[i]; 1204*2d747510SLisandro Dalcin if (set) *set = PETSC_TRUE; 1205*2d747510SLisandro Dalcin PetscFunctionReturn(0); 1206514bf10dSMatthew G Knepley } 1207514bf10dSMatthew G Knepley } 1208*2d747510SLisandro Dalcin } 1209*2d747510SLisandro Dalcin 1210*2d747510SLisandro Dalcin if (set) *set = PETSC_FALSE; 1211514bf10dSMatthew G Knepley PetscFunctionReturn(0); 1212514bf10dSMatthew G Knepley } 1213514bf10dSMatthew G Knepley 1214e5c89e4eSSatish Balay /*@C 1215e5c89e4eSSatish Balay PetscOptionsReject - Generates an error if a certain option is given. 1216e5c89e4eSSatish Balay 1217e5c89e4eSSatish Balay Not Collective, but setting values on certain processors could cause problems 1218e5c89e4eSSatish Balay for parallel objects looking for options. 1219e5c89e4eSSatish Balay 1220e5c89e4eSSatish Balay Input Parameters: 12215c9cc608SHong Zhang + options - options database, use NULL for default global database 1222*2d747510SLisandro Dalcin . pre - the option prefix (may be NULL) 1223*2d747510SLisandro Dalcin . name - the option name one is seeking 12240298fd71SBarry Smith - mess - error message (may be NULL) 1225e5c89e4eSSatish Balay 1226e5c89e4eSSatish Balay Level: advanced 1227e5c89e4eSSatish Balay 1228e5c89e4eSSatish Balay Concepts: options database^rejecting option 1229e5c89e4eSSatish Balay 1230e5c89e4eSSatish Balay .seealso: PetscOptionsGetInt(), PetscOptionsGetReal(),OptionsHasName(), 1231acfcf0e5SJed Brown PetscOptionsGetString(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool(), 1232e5c89e4eSSatish Balay PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 1233e5c89e4eSSatish Balay PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 1234acfcf0e5SJed Brown PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 1235a264d7a6SBarry Smith PetscOptionsFList(), PetscOptionsEList() 1236e5c89e4eSSatish Balay @*/ 1237*2d747510SLisandro Dalcin PetscErrorCode PetscOptionsReject(PetscOptions options,const char pre[],const char name[],const char mess[]) 1238e5c89e4eSSatish Balay { 1239e5c89e4eSSatish Balay PetscErrorCode ierr; 1240ace3abfcSBarry Smith PetscBool flag = PETSC_FALSE; 1241e5c89e4eSSatish Balay 1242e5c89e4eSSatish Balay PetscFunctionBegin; 1243*2d747510SLisandro Dalcin ierr = PetscOptionsHasName(options,pre,name,&flag);CHKERRQ(ierr); 1244e5c89e4eSSatish Balay if (flag) { 1245*2d747510SLisandro 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); 1246*2d747510SLisandro Dalcin else SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Program has disabled option: -%s%s",pre?pre:"",name+1); 1247e5c89e4eSSatish Balay } 1248e5c89e4eSSatish Balay PetscFunctionReturn(0); 1249e5c89e4eSSatish Balay } 1250e5c89e4eSSatish Balay 1251e5c89e4eSSatish Balay /*@C 1252*2d747510SLisandro Dalcin PetscOptionsHasHelp - Determines whether the "-help" option is in the database. 1253*2d747510SLisandro Dalcin 1254*2d747510SLisandro Dalcin Not Collective 1255*2d747510SLisandro Dalcin 1256*2d747510SLisandro Dalcin Input Parameters: 1257*2d747510SLisandro Dalcin . options - options database, use NULL for default global database 1258*2d747510SLisandro Dalcin 1259*2d747510SLisandro Dalcin Output Parameters: 1260*2d747510SLisandro Dalcin . set - PETSC_TRUE if found else PETSC_FALSE. 1261*2d747510SLisandro Dalcin 1262*2d747510SLisandro Dalcin Level: advanced 1263*2d747510SLisandro Dalcin 1264*2d747510SLisandro Dalcin Concepts: options database^help 1265*2d747510SLisandro Dalcin 1266*2d747510SLisandro Dalcin .seealso: PetscOptionsHasName() 1267*2d747510SLisandro Dalcin @*/ 1268*2d747510SLisandro Dalcin PetscErrorCode PetscOptionsHasHelp(PetscOptions options,PetscBool *set) 1269*2d747510SLisandro Dalcin { 1270*2d747510SLisandro Dalcin PetscFunctionBegin; 1271*2d747510SLisandro Dalcin PetscValidPointer(set,2); 1272*2d747510SLisandro Dalcin options = options ? options : defaultoptions; 1273*2d747510SLisandro Dalcin *set = options->help; 1274*2d747510SLisandro Dalcin PetscFunctionReturn(0); 1275*2d747510SLisandro Dalcin } 1276*2d747510SLisandro Dalcin 1277*2d747510SLisandro Dalcin /*@C 127890d69ab7SBarry 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 127990d69ab7SBarry Smith its value is set to false. 1280e5c89e4eSSatish Balay 1281e5c89e4eSSatish Balay Not Collective 1282e5c89e4eSSatish Balay 1283e5c89e4eSSatish Balay Input Parameters: 12845c9cc608SHong Zhang + options - options database, use NULL for default global database 12853de71b31SHong Zhang . pre - string to prepend to the name or NULL 12863de71b31SHong Zhang - name - the option one is seeking 1287e5c89e4eSSatish Balay 1288e5c89e4eSSatish Balay Output Parameters: 128996ef3cdfSSatish Balay . set - PETSC_TRUE if found else PETSC_FALSE. 1290e5c89e4eSSatish Balay 1291e5c89e4eSSatish Balay Level: beginner 1292e5c89e4eSSatish Balay 1293e5c89e4eSSatish Balay Concepts: options database^has option name 1294e5c89e4eSSatish Balay 129595452b02SPatrick Sanan Notes: 1296*2d747510SLisandro Dalcin Name cannot be simply "-h". 1297431c96f7SBarry Smith 1298acfcf0e5SJed Brown In many cases you probably want to use PetscOptionsGetBool() instead of calling this, to allowing toggling values. 129990d69ab7SBarry Smith 1300e5c89e4eSSatish Balay .seealso: PetscOptionsGetInt(), PetscOptionsGetReal(), 1301f3e3d7dfSBarry Smith PetscOptionsGetString(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool(), 1302e5c89e4eSSatish Balay PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 1303e5c89e4eSSatish Balay PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 1304acfcf0e5SJed Brown PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 1305a264d7a6SBarry Smith PetscOptionsFList(), PetscOptionsEList() 1306e5c89e4eSSatish Balay @*/ 1307c5929fdfSBarry Smith PetscErrorCode PetscOptionsHasName(PetscOptions options,const char pre[],const char name[],PetscBool *set) 1308e5c89e4eSSatish Balay { 1309*2d747510SLisandro Dalcin const char *value; 1310e5c89e4eSSatish Balay PetscErrorCode ierr; 1311ace3abfcSBarry Smith PetscBool flag; 1312e5c89e4eSSatish Balay 1313e5c89e4eSSatish Balay PetscFunctionBegin; 1314*2d747510SLisandro Dalcin ierr = PetscOptionsFindPair(options,pre,name,&value,&flag);CHKERRQ(ierr); 131596ef3cdfSSatish Balay if (set) *set = flag; 1316e5c89e4eSSatish Balay PetscFunctionReturn(0); 1317e5c89e4eSSatish Balay } 1318e5c89e4eSSatish Balay 1319e5c89e4eSSatish Balay /*@C 1320*2d747510SLisandro Dalcin PetscOptionsGetAll - Lists all the options the program was run with in a single string. 1321*2d747510SLisandro Dalcin 1322*2d747510SLisandro Dalcin Not Collective 1323*2d747510SLisandro Dalcin 1324*2d747510SLisandro Dalcin Input Paramter: 1325*2d747510SLisandro Dalcin . options - the options database, use NULL for the default global database 1326*2d747510SLisandro Dalcin 1327*2d747510SLisandro Dalcin Output Parameter: 1328*2d747510SLisandro Dalcin . copts - pointer where string pointer is stored 1329*2d747510SLisandro Dalcin 1330*2d747510SLisandro Dalcin Notes: 1331*2d747510SLisandro Dalcin the array and each entry in the array should be freed with PetscFree() 1332*2d747510SLisandro Dalcin 1333*2d747510SLisandro Dalcin Level: advanced 1334*2d747510SLisandro Dalcin 1335*2d747510SLisandro Dalcin Concepts: options database^listing 1336*2d747510SLisandro Dalcin 1337*2d747510SLisandro Dalcin .seealso: PetscOptionsAllUsed(), PetscOptionsView() 1338*2d747510SLisandro Dalcin @*/ 1339*2d747510SLisandro Dalcin PetscErrorCode PetscOptionsGetAll(PetscOptions options,char *copts[]) 1340*2d747510SLisandro Dalcin { 1341*2d747510SLisandro Dalcin PetscErrorCode ierr; 1342*2d747510SLisandro Dalcin PetscInt i; 1343*2d747510SLisandro Dalcin size_t len = 1,lent = 0; 1344*2d747510SLisandro Dalcin char *coptions = NULL; 1345*2d747510SLisandro Dalcin 1346*2d747510SLisandro Dalcin PetscFunctionBegin; 1347*2d747510SLisandro Dalcin PetscValidPointer(copts,2); 1348*2d747510SLisandro Dalcin options = options ? options : defaultoptions; 1349*2d747510SLisandro Dalcin /* count the length of the required string */ 1350*2d747510SLisandro Dalcin for (i=0; i<options->N; i++) { 1351*2d747510SLisandro Dalcin ierr = PetscStrlen(options->names[i],&lent);CHKERRQ(ierr); 1352*2d747510SLisandro Dalcin len += 2 + lent; 1353*2d747510SLisandro Dalcin if (options->values[i]) { 1354*2d747510SLisandro Dalcin ierr = PetscStrlen(options->values[i],&lent);CHKERRQ(ierr); 1355*2d747510SLisandro Dalcin len += 1 + lent; 1356*2d747510SLisandro Dalcin } 1357*2d747510SLisandro Dalcin } 1358*2d747510SLisandro Dalcin ierr = PetscMalloc1(len,&coptions);CHKERRQ(ierr); 1359*2d747510SLisandro Dalcin coptions[0] = 0; 1360*2d747510SLisandro Dalcin for (i=0; i<options->N; i++) { 1361*2d747510SLisandro Dalcin ierr = PetscStrcat(coptions,"-");CHKERRQ(ierr); 1362*2d747510SLisandro Dalcin ierr = PetscStrcat(coptions,options->names[i]);CHKERRQ(ierr); 1363*2d747510SLisandro Dalcin ierr = PetscStrcat(coptions," ");CHKERRQ(ierr); 1364*2d747510SLisandro Dalcin if (options->values[i]) { 1365*2d747510SLisandro Dalcin ierr = PetscStrcat(coptions,options->values[i]);CHKERRQ(ierr); 1366*2d747510SLisandro Dalcin ierr = PetscStrcat(coptions," ");CHKERRQ(ierr); 1367*2d747510SLisandro Dalcin } 1368*2d747510SLisandro Dalcin } 1369*2d747510SLisandro Dalcin *copts = coptions; 1370*2d747510SLisandro Dalcin PetscFunctionReturn(0); 1371*2d747510SLisandro Dalcin } 1372*2d747510SLisandro Dalcin 1373*2d747510SLisandro Dalcin /*@C 1374*2d747510SLisandro Dalcin PetscOptionsUsed - Indicates if PETSc has used a particular option set in the database 1375*2d747510SLisandro Dalcin 1376*2d747510SLisandro Dalcin Not Collective 1377*2d747510SLisandro Dalcin 1378*2d747510SLisandro Dalcin Input Parameter: 1379*2d747510SLisandro Dalcin + options - options database, use NULL for default global database 1380*2d747510SLisandro Dalcin - name - string name of option 1381*2d747510SLisandro Dalcin 1382*2d747510SLisandro Dalcin Output Parameter: 1383*2d747510SLisandro Dalcin . used - PETSC_TRUE if the option was used, otherwise false, including if option was not found in options database 1384*2d747510SLisandro Dalcin 1385*2d747510SLisandro Dalcin Level: advanced 1386*2d747510SLisandro Dalcin 1387*2d747510SLisandro Dalcin .seealso: PetscOptionsView(), PetscOptionsLeft(), PetscOptionsAllUsed() 1388*2d747510SLisandro Dalcin @*/ 1389*2d747510SLisandro Dalcin PetscErrorCode PetscOptionsUsed(PetscOptions options,const char *name,PetscBool *used) 1390*2d747510SLisandro Dalcin { 1391*2d747510SLisandro Dalcin PetscInt i; 1392*2d747510SLisandro Dalcin PetscErrorCode ierr; 1393*2d747510SLisandro Dalcin 1394*2d747510SLisandro Dalcin PetscFunctionBegin; 1395*2d747510SLisandro Dalcin PetscValidCharPointer(name,2); 1396*2d747510SLisandro Dalcin PetscValidPointer(used,3); 1397*2d747510SLisandro Dalcin options = options ? options : defaultoptions; 1398*2d747510SLisandro Dalcin *used = PETSC_FALSE; 1399*2d747510SLisandro Dalcin for (i=0; i<options->N; i++) { 1400*2d747510SLisandro Dalcin ierr = PetscStrcmp(options->names[i],name,used);CHKERRQ(ierr); 1401*2d747510SLisandro Dalcin if (*used) { 1402*2d747510SLisandro Dalcin *used = options->used[i]; 1403*2d747510SLisandro Dalcin break; 1404*2d747510SLisandro Dalcin } 1405*2d747510SLisandro Dalcin } 1406*2d747510SLisandro Dalcin PetscFunctionReturn(0); 1407*2d747510SLisandro Dalcin } 1408*2d747510SLisandro Dalcin 1409*2d747510SLisandro Dalcin /*@C 1410*2d747510SLisandro Dalcin PetscOptionsAllUsed - Returns a count of the number of options in the 1411*2d747510SLisandro Dalcin database that have never been selected. 1412*2d747510SLisandro Dalcin 1413*2d747510SLisandro Dalcin Not Collective 1414*2d747510SLisandro Dalcin 1415*2d747510SLisandro Dalcin Input Parameter: 1416*2d747510SLisandro Dalcin . options - options database, use NULL for default global database 1417*2d747510SLisandro Dalcin 1418*2d747510SLisandro Dalcin Output Parameter: 1419*2d747510SLisandro Dalcin . N - count of options not used 1420*2d747510SLisandro Dalcin 1421*2d747510SLisandro Dalcin Level: advanced 1422*2d747510SLisandro Dalcin 1423*2d747510SLisandro Dalcin .seealso: PetscOptionsView() 1424*2d747510SLisandro Dalcin @*/ 1425*2d747510SLisandro Dalcin PetscErrorCode PetscOptionsAllUsed(PetscOptions options,PetscInt *N) 1426*2d747510SLisandro Dalcin { 1427*2d747510SLisandro Dalcin PetscInt i,n = 0; 1428*2d747510SLisandro Dalcin 1429*2d747510SLisandro Dalcin PetscFunctionBegin; 1430*2d747510SLisandro Dalcin PetscValidIntPointer(N,2); 1431*2d747510SLisandro Dalcin options = options ? options : defaultoptions; 1432*2d747510SLisandro Dalcin for (i=0; i<options->N; i++) { 1433*2d747510SLisandro Dalcin if (!options->used[i]) n++; 1434*2d747510SLisandro Dalcin } 1435*2d747510SLisandro Dalcin *N = n; 1436*2d747510SLisandro Dalcin PetscFunctionReturn(0); 1437*2d747510SLisandro Dalcin } 1438*2d747510SLisandro Dalcin 1439*2d747510SLisandro Dalcin /*@C 1440*2d747510SLisandro Dalcin PetscOptionsLeft - Prints to screen any options that were set and never used. 1441*2d747510SLisandro Dalcin 1442*2d747510SLisandro Dalcin Not Collective 1443*2d747510SLisandro Dalcin 1444*2d747510SLisandro Dalcin Input Parameter: 1445*2d747510SLisandro Dalcin . options - options database; use NULL for default global database 1446*2d747510SLisandro Dalcin 1447*2d747510SLisandro Dalcin Options Database Key: 1448*2d747510SLisandro Dalcin . -options_left - Activates OptionsAllUsed() within PetscFinalize() 1449*2d747510SLisandro Dalcin 1450*2d747510SLisandro Dalcin Level: advanced 1451*2d747510SLisandro Dalcin 1452*2d747510SLisandro Dalcin .seealso: PetscOptionsAllUsed() 1453*2d747510SLisandro Dalcin @*/ 1454*2d747510SLisandro Dalcin PetscErrorCode PetscOptionsLeft(PetscOptions options) 1455*2d747510SLisandro Dalcin { 1456*2d747510SLisandro Dalcin PetscErrorCode ierr; 1457*2d747510SLisandro Dalcin PetscInt i; 1458*2d747510SLisandro Dalcin 1459*2d747510SLisandro Dalcin PetscFunctionBegin; 1460*2d747510SLisandro Dalcin options = options ? options : defaultoptions; 1461*2d747510SLisandro Dalcin for (i=0; i<options->N; i++) { 1462*2d747510SLisandro Dalcin if (!options->used[i]) { 1463*2d747510SLisandro Dalcin if (options->values[i]) { 1464*2d747510SLisandro Dalcin ierr = PetscPrintf(PETSC_COMM_WORLD,"Option left: name:-%s value: %s\n",options->names[i],options->values[i]);CHKERRQ(ierr); 1465*2d747510SLisandro Dalcin } else { 1466*2d747510SLisandro Dalcin ierr = PetscPrintf(PETSC_COMM_WORLD,"Option left: name:-%s (no value)\n",options->names[i]);CHKERRQ(ierr); 1467*2d747510SLisandro Dalcin } 1468*2d747510SLisandro Dalcin } 1469*2d747510SLisandro Dalcin } 1470*2d747510SLisandro Dalcin PetscFunctionReturn(0); 1471*2d747510SLisandro Dalcin } 1472*2d747510SLisandro Dalcin 1473*2d747510SLisandro Dalcin /*@C 1474*2d747510SLisandro Dalcin PetscOptionsLeftGet - Returns all options that were set and never used. 1475*2d747510SLisandro Dalcin 1476*2d747510SLisandro Dalcin Not Collective 1477*2d747510SLisandro Dalcin 1478*2d747510SLisandro Dalcin Input Parameter: 1479*2d747510SLisandro Dalcin . options - options database, use NULL for default global database 1480*2d747510SLisandro Dalcin 1481*2d747510SLisandro Dalcin Output Parameter: 1482*2d747510SLisandro Dalcin . N - count of options not used 1483*2d747510SLisandro Dalcin . names - names of options not used 1484*2d747510SLisandro Dalcin . values - values of options not used 1485*2d747510SLisandro Dalcin 1486*2d747510SLisandro Dalcin Level: advanced 1487*2d747510SLisandro Dalcin 1488*2d747510SLisandro Dalcin Notes: 1489*2d747510SLisandro Dalcin Users should call PetscOptionsLeftRestore() to free the memory allocated in this routine 1490*2d747510SLisandro Dalcin 1491*2d747510SLisandro Dalcin .seealso: PetscOptionsAllUsed(), PetscOptionsLeft() 1492*2d747510SLisandro Dalcin @*/ 1493*2d747510SLisandro Dalcin PetscErrorCode PetscOptionsLeftGet(PetscOptions options,PetscInt *N,char **names[],char **values[]) 1494*2d747510SLisandro Dalcin { 1495*2d747510SLisandro Dalcin PetscErrorCode ierr; 1496*2d747510SLisandro Dalcin PetscInt i,n; 1497*2d747510SLisandro Dalcin 1498*2d747510SLisandro Dalcin PetscFunctionBegin; 1499*2d747510SLisandro Dalcin if (N) PetscValidIntPointer(N,2); 1500*2d747510SLisandro Dalcin if (names) PetscValidPointer(names,3); 1501*2d747510SLisandro Dalcin if (values) PetscValidPointer(values,4); 1502*2d747510SLisandro Dalcin options = options ? options : defaultoptions; 1503*2d747510SLisandro Dalcin 1504*2d747510SLisandro Dalcin /* The number of unused PETSc options */ 1505*2d747510SLisandro Dalcin n = 0; 1506*2d747510SLisandro Dalcin for (i=0; i<options->N; i++) { 1507*2d747510SLisandro Dalcin if (!options->used[i]) n++; 1508*2d747510SLisandro Dalcin } 1509*2d747510SLisandro Dalcin if (N) { *N = n; } 1510*2d747510SLisandro Dalcin if (names) { ierr = PetscMalloc1(n,names);CHKERRQ(ierr); } 1511*2d747510SLisandro Dalcin if (values) { ierr = PetscMalloc1(n,values);CHKERRQ(ierr); } 1512*2d747510SLisandro Dalcin 1513*2d747510SLisandro Dalcin n = 0; 1514*2d747510SLisandro Dalcin if (names || values) { 1515*2d747510SLisandro Dalcin for (i=0; i<options->N; i++) { 1516*2d747510SLisandro Dalcin if (!options->used[i]) { 1517*2d747510SLisandro Dalcin if (names) (*names)[n] = options->names[i]; 1518*2d747510SLisandro Dalcin if (values) (*values)[n] = options->values[i]; 1519*2d747510SLisandro Dalcin n++; 1520*2d747510SLisandro Dalcin } 1521*2d747510SLisandro Dalcin } 1522*2d747510SLisandro Dalcin } 1523*2d747510SLisandro Dalcin PetscFunctionReturn(0); 1524*2d747510SLisandro Dalcin } 1525*2d747510SLisandro Dalcin 1526*2d747510SLisandro Dalcin /*@C 1527*2d747510SLisandro Dalcin PetscOptionsLeftRestore - Free memory for the unused PETSc options obtained using PetscOptionsLeftGet. 1528*2d747510SLisandro Dalcin 1529*2d747510SLisandro Dalcin Not Collective 1530*2d747510SLisandro Dalcin 1531*2d747510SLisandro Dalcin Input Parameter: 1532*2d747510SLisandro Dalcin . options - options database, use NULL for default global database 1533*2d747510SLisandro Dalcin . names - names of options not used 1534*2d747510SLisandro Dalcin . values - values of options not used 1535*2d747510SLisandro Dalcin 1536*2d747510SLisandro Dalcin Level: advanced 1537*2d747510SLisandro Dalcin 1538*2d747510SLisandro Dalcin .seealso: PetscOptionsAllUsed(), PetscOptionsLeft(), PetscOptionsLeftGet() 1539*2d747510SLisandro Dalcin @*/ 1540*2d747510SLisandro Dalcin PetscErrorCode PetscOptionsLeftRestore(PetscOptions options,PetscInt *N,char **names[],char **values[]) 1541*2d747510SLisandro Dalcin { 1542*2d747510SLisandro Dalcin PetscErrorCode ierr; 1543*2d747510SLisandro Dalcin 1544*2d747510SLisandro Dalcin PetscFunctionBegin; 1545*2d747510SLisandro Dalcin if (N) PetscValidIntPointer(N,2); 1546*2d747510SLisandro Dalcin if (names) PetscValidPointer(names,3); 1547*2d747510SLisandro Dalcin if (values) PetscValidPointer(values,4); 1548*2d747510SLisandro Dalcin if (N) { *N = 0; } 1549*2d747510SLisandro Dalcin if (names) { ierr = PetscFree(*names);CHKERRQ(ierr); } 1550*2d747510SLisandro Dalcin if (values) { ierr = PetscFree(*values);CHKERRQ(ierr); } 1551*2d747510SLisandro Dalcin PetscFunctionReturn(0); 1552*2d747510SLisandro Dalcin } 1553*2d747510SLisandro Dalcin 1554*2d747510SLisandro Dalcin /*@C 1555*2d747510SLisandro Dalcin PetscOptionsSetFromOptions - Sets options related to the handling of options in PETSc 1556*2d747510SLisandro Dalcin 1557*2d747510SLisandro Dalcin Collective on PETSC_COMM_WORLD 1558*2d747510SLisandro Dalcin 1559*2d747510SLisandro Dalcin Input Parameter: 1560*2d747510SLisandro Dalcin . options - options database, use NULL for default global database 1561*2d747510SLisandro Dalcin 1562*2d747510SLisandro Dalcin Options Database Keys: 1563*2d747510SLisandro Dalcin + -options_monitor <optional filename> - prints the names and values of all runtime options as they are set. The monitor functionality is not 1564*2d747510SLisandro Dalcin available for options set through a file, environment variable, or on 1565*2d747510SLisandro Dalcin the command line. Only options set after PetscInitialize() completes will 1566*2d747510SLisandro Dalcin be monitored. 1567*2d747510SLisandro Dalcin . -options_monitor_cancel - cancel all options database monitors 1568*2d747510SLisandro Dalcin 1569*2d747510SLisandro Dalcin Notes: 1570*2d747510SLisandro Dalcin To see all options, run your program with the -help option or consult Users-Manual: sec_gettingstarted 1571*2d747510SLisandro Dalcin 1572*2d747510SLisandro Dalcin Level: intermediate 1573*2d747510SLisandro Dalcin 1574*2d747510SLisandro Dalcin .keywords: set, options, database 1575*2d747510SLisandro Dalcin @*/ 1576*2d747510SLisandro Dalcin PetscErrorCode PetscOptionsSetFromOptions(PetscOptions options) 1577*2d747510SLisandro Dalcin { 1578*2d747510SLisandro Dalcin PetscBool flgc = PETSC_FALSE,flgm; 1579*2d747510SLisandro Dalcin PetscErrorCode ierr; 1580*2d747510SLisandro Dalcin char monfilename[PETSC_MAX_PATH_LEN]; 1581*2d747510SLisandro Dalcin PetscViewer monviewer; 1582*2d747510SLisandro Dalcin 1583*2d747510SLisandro Dalcin PetscFunctionBegin; 1584*2d747510SLisandro Dalcin /* 1585*2d747510SLisandro Dalcin The options argument is currently ignored since we currently maintain only a single options database 1586*2d747510SLisandro Dalcin 1587*2d747510SLisandro Dalcin options = options ? options : defaultoptions; 1588*2d747510SLisandro Dalcin */ 1589*2d747510SLisandro Dalcin ierr = PetscOptionsBegin(PETSC_COMM_WORLD,NULL,"Options for handling options","PetscOptions");CHKERRQ(ierr); 1590*2d747510SLisandro Dalcin ierr = PetscOptionsString("-options_monitor","Monitor options database","PetscOptionsMonitorSet","stdout",monfilename,PETSC_MAX_PATH_LEN,&flgm);CHKERRQ(ierr); 1591*2d747510SLisandro Dalcin ierr = PetscOptionsBool("-options_monitor_cancel","Cancel all options database monitors","PetscOptionsMonitorCancel",flgc,&flgc,NULL);CHKERRQ(ierr); 1592*2d747510SLisandro Dalcin ierr = PetscOptionsEnd();CHKERRQ(ierr); 1593*2d747510SLisandro Dalcin if (flgm) { 1594*2d747510SLisandro Dalcin ierr = PetscViewerASCIIOpen(PETSC_COMM_WORLD,monfilename,&monviewer);CHKERRQ(ierr); 1595*2d747510SLisandro Dalcin ierr = PetscOptionsMonitorSet(PetscOptionsMonitorDefault,monviewer,(PetscErrorCode (*)(void**))PetscViewerDestroy);CHKERRQ(ierr); 1596*2d747510SLisandro Dalcin } 1597*2d747510SLisandro Dalcin if (flgc) { ierr = PetscOptionsMonitorCancel();CHKERRQ(ierr); } 1598*2d747510SLisandro Dalcin PetscFunctionReturn(0); 1599*2d747510SLisandro Dalcin } 1600*2d747510SLisandro Dalcin 1601*2d747510SLisandro Dalcin /*@C 1602*2d747510SLisandro Dalcin PetscOptionsMonitorDefault - Print all options set value events. 1603*2d747510SLisandro Dalcin 1604*2d747510SLisandro Dalcin Logically Collective on PETSC_COMM_WORLD 1605*2d747510SLisandro Dalcin 1606*2d747510SLisandro Dalcin Input Parameters: 1607*2d747510SLisandro Dalcin + name - option name string 1608*2d747510SLisandro Dalcin . value - option value string 1609*2d747510SLisandro Dalcin - ctx - an ASCII viewer 1610*2d747510SLisandro Dalcin 1611*2d747510SLisandro Dalcin Level: intermediate 1612*2d747510SLisandro Dalcin 1613*2d747510SLisandro Dalcin .keywords: PetscOptions, default, monitor 1614*2d747510SLisandro Dalcin 1615*2d747510SLisandro Dalcin .seealso: PetscOptionsMonitorSet() 1616*2d747510SLisandro Dalcin @*/ 1617*2d747510SLisandro Dalcin PetscErrorCode PetscOptionsMonitorDefault(const char name[],const char value[],void *ctx) 1618*2d747510SLisandro Dalcin { 1619*2d747510SLisandro Dalcin PetscErrorCode ierr; 1620*2d747510SLisandro Dalcin PetscViewer viewer = (PetscViewer)ctx; 1621*2d747510SLisandro Dalcin 1622*2d747510SLisandro Dalcin PetscFunctionBegin; 1623*2d747510SLisandro Dalcin if (!value) { 1624*2d747510SLisandro Dalcin ierr = PetscViewerASCIIPrintf(viewer,"Removing option: %s\n",name,value);CHKERRQ(ierr); 1625*2d747510SLisandro Dalcin } else if (!value[0]) { 1626*2d747510SLisandro Dalcin ierr = PetscViewerASCIIPrintf(viewer,"Setting option: %s (no value)\n",name);CHKERRQ(ierr); 1627*2d747510SLisandro Dalcin } else { 1628*2d747510SLisandro Dalcin ierr = PetscViewerASCIIPrintf(viewer,"Setting option: %s = %s\n",name,value);CHKERRQ(ierr); 1629*2d747510SLisandro Dalcin } 1630*2d747510SLisandro Dalcin PetscFunctionReturn(0); 1631*2d747510SLisandro Dalcin } 1632*2d747510SLisandro Dalcin 1633*2d747510SLisandro Dalcin /*@C 1634*2d747510SLisandro Dalcin PetscOptionsMonitorSet - Sets an ADDITIONAL function to be called at every method that 1635*2d747510SLisandro Dalcin modified the PETSc options database. 1636*2d747510SLisandro Dalcin 1637*2d747510SLisandro Dalcin Not Collective 1638*2d747510SLisandro Dalcin 1639*2d747510SLisandro Dalcin Input Parameters: 1640*2d747510SLisandro Dalcin + monitor - pointer to function (if this is NULL, it turns off monitoring 1641*2d747510SLisandro Dalcin . mctx - [optional] context for private data for the 1642*2d747510SLisandro Dalcin monitor routine (use NULL if no context is desired) 1643*2d747510SLisandro Dalcin - monitordestroy - [optional] routine that frees monitor context 1644*2d747510SLisandro Dalcin (may be NULL) 1645*2d747510SLisandro Dalcin 1646*2d747510SLisandro Dalcin Calling Sequence of monitor: 1647*2d747510SLisandro Dalcin $ monitor (const char name[], const char value[], void *mctx) 1648*2d747510SLisandro Dalcin 1649*2d747510SLisandro Dalcin + name - option name string 1650*2d747510SLisandro Dalcin . value - option value string 1651*2d747510SLisandro Dalcin - mctx - optional monitoring context, as set by PetscOptionsMonitorSet() 1652*2d747510SLisandro Dalcin 1653*2d747510SLisandro Dalcin Options Database Keys: 1654*2d747510SLisandro Dalcin + -options_monitor - sets PetscOptionsMonitorDefault() 1655*2d747510SLisandro Dalcin - -options_monitor_cancel - cancels all monitors that have 1656*2d747510SLisandro Dalcin been hardwired into a code by 1657*2d747510SLisandro Dalcin calls to PetscOptionsMonitorSet(), but 1658*2d747510SLisandro Dalcin does not cancel those set via 1659*2d747510SLisandro Dalcin the options database. 1660*2d747510SLisandro Dalcin 1661*2d747510SLisandro Dalcin Notes: 1662*2d747510SLisandro Dalcin The default is to do nothing. To print the name and value of options 1663*2d747510SLisandro Dalcin being inserted into the database, use PetscOptionsMonitorDefault() as the monitoring routine, 1664*2d747510SLisandro Dalcin with a null monitoring context. 1665*2d747510SLisandro Dalcin 1666*2d747510SLisandro Dalcin Several different monitoring routines may be set by calling 1667*2d747510SLisandro Dalcin PetscOptionsMonitorSet() multiple times; all will be called in the 1668*2d747510SLisandro Dalcin order in which they were set. 1669*2d747510SLisandro Dalcin 1670*2d747510SLisandro Dalcin Level: beginner 1671*2d747510SLisandro Dalcin 1672*2d747510SLisandro Dalcin .keywords: PetscOptions, set, monitor 1673*2d747510SLisandro Dalcin 1674*2d747510SLisandro Dalcin .seealso: PetscOptionsMonitorDefault(), PetscOptionsMonitorCancel() 1675*2d747510SLisandro Dalcin @*/ 1676*2d747510SLisandro Dalcin PetscErrorCode PetscOptionsMonitorSet(PetscErrorCode (*monitor)(const char name[], const char value[], void*),void *mctx,PetscErrorCode (*monitordestroy)(void**)) 1677*2d747510SLisandro Dalcin { 1678*2d747510SLisandro Dalcin PetscOptions options = defaultoptions; 1679*2d747510SLisandro Dalcin 1680*2d747510SLisandro Dalcin PetscFunctionBegin; 1681*2d747510SLisandro Dalcin if (options->numbermonitors >= MAXOPTIONSMONITORS) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Too many PetscOptions monitors set"); 1682*2d747510SLisandro Dalcin options->monitor[options->numbermonitors] = monitor; 1683*2d747510SLisandro Dalcin options->monitordestroy[options->numbermonitors] = monitordestroy; 1684*2d747510SLisandro Dalcin options->monitorcontext[options->numbermonitors++] = (void*)mctx; 1685*2d747510SLisandro Dalcin PetscFunctionReturn(0); 1686*2d747510SLisandro Dalcin } 1687*2d747510SLisandro Dalcin 1688*2d747510SLisandro Dalcin /*@ 1689*2d747510SLisandro Dalcin PetscOptionsMonitorCancel - Clears all monitors for a PetscOptions object. 1690*2d747510SLisandro Dalcin 1691*2d747510SLisandro Dalcin Not Collective 1692*2d747510SLisandro Dalcin 1693*2d747510SLisandro Dalcin Options Database Key: 1694*2d747510SLisandro Dalcin . -options_monitor_cancel - Cancels all monitors that have 1695*2d747510SLisandro Dalcin been hardwired into a code by calls to PetscOptionsMonitorSet(), 1696*2d747510SLisandro Dalcin but does not cancel those set via the options database. 1697*2d747510SLisandro Dalcin 1698*2d747510SLisandro Dalcin Level: intermediate 1699*2d747510SLisandro Dalcin 1700*2d747510SLisandro Dalcin .keywords: PetscOptions, set, monitor 1701*2d747510SLisandro Dalcin 1702*2d747510SLisandro Dalcin .seealso: PetscOptionsMonitorDefault(), PetscOptionsMonitorSet() 1703*2d747510SLisandro Dalcin @*/ 1704*2d747510SLisandro Dalcin PetscErrorCode PetscOptionsMonitorCancel(void) 1705*2d747510SLisandro Dalcin { 1706*2d747510SLisandro Dalcin PetscErrorCode ierr; 1707*2d747510SLisandro Dalcin PetscInt i; 1708*2d747510SLisandro Dalcin PetscOptions options = defaultoptions; 1709*2d747510SLisandro Dalcin 1710*2d747510SLisandro Dalcin PetscFunctionBegin; 1711*2d747510SLisandro Dalcin for (i=0; i<options->numbermonitors; i++) { 1712*2d747510SLisandro Dalcin if (options->monitordestroy[i]) { 1713*2d747510SLisandro Dalcin ierr = (*options->monitordestroy[i])(&options->monitorcontext[i]);CHKERRQ(ierr); 1714*2d747510SLisandro Dalcin } 1715*2d747510SLisandro Dalcin } 1716*2d747510SLisandro Dalcin options->numbermonitors = 0; 1717*2d747510SLisandro Dalcin PetscFunctionReturn(0); 1718*2d747510SLisandro Dalcin } 1719*2d747510SLisandro Dalcin 1720*2d747510SLisandro Dalcin /* 1721*2d747510SLisandro Dalcin PetscOptionsStringToBool - Converts string to PetscBool , handles cases like "yes", "no", "true", "false", "0", "1", "off", "on". 1722*2d747510SLisandro Dalcin */ 1723*2d747510SLisandro Dalcin PetscErrorCode PetscOptionsStringToBool(const char value[],PetscBool *a) 1724*2d747510SLisandro Dalcin { 1725*2d747510SLisandro Dalcin PetscBool istrue,isfalse; 1726*2d747510SLisandro Dalcin size_t len; 1727*2d747510SLisandro Dalcin PetscErrorCode ierr; 1728*2d747510SLisandro Dalcin 1729*2d747510SLisandro Dalcin PetscFunctionBegin; 1730*2d747510SLisandro Dalcin ierr = PetscStrlen(value,&len);CHKERRQ(ierr); 1731*2d747510SLisandro Dalcin if (!len) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Character string of length zero has no logical value"); 1732*2d747510SLisandro Dalcin ierr = PetscStrcasecmp(value,"TRUE",&istrue);CHKERRQ(ierr); 1733*2d747510SLisandro Dalcin if (istrue) {*a = PETSC_TRUE; PetscFunctionReturn(0);} 1734*2d747510SLisandro Dalcin ierr = PetscStrcasecmp(value,"YES",&istrue);CHKERRQ(ierr); 1735*2d747510SLisandro Dalcin if (istrue) {*a = PETSC_TRUE; PetscFunctionReturn(0);} 1736*2d747510SLisandro Dalcin ierr = PetscStrcasecmp(value,"1",&istrue);CHKERRQ(ierr); 1737*2d747510SLisandro Dalcin if (istrue) {*a = PETSC_TRUE; PetscFunctionReturn(0);} 1738*2d747510SLisandro Dalcin ierr = PetscStrcasecmp(value,"on",&istrue);CHKERRQ(ierr); 1739*2d747510SLisandro Dalcin if (istrue) {*a = PETSC_TRUE; PetscFunctionReturn(0);} 1740*2d747510SLisandro Dalcin ierr = PetscStrcasecmp(value,"FALSE",&isfalse);CHKERRQ(ierr); 1741*2d747510SLisandro Dalcin if (isfalse) {*a = PETSC_FALSE; PetscFunctionReturn(0);} 1742*2d747510SLisandro Dalcin ierr = PetscStrcasecmp(value,"NO",&isfalse);CHKERRQ(ierr); 1743*2d747510SLisandro Dalcin if (isfalse) {*a = PETSC_FALSE; PetscFunctionReturn(0);} 1744*2d747510SLisandro Dalcin ierr = PetscStrcasecmp(value,"0",&isfalse);CHKERRQ(ierr); 1745*2d747510SLisandro Dalcin if (isfalse) {*a = PETSC_FALSE; PetscFunctionReturn(0);} 1746*2d747510SLisandro Dalcin ierr = PetscStrcasecmp(value,"off",&isfalse);CHKERRQ(ierr); 1747*2d747510SLisandro Dalcin if (isfalse) {*a = PETSC_FALSE; PetscFunctionReturn(0);} 1748*2d747510SLisandro Dalcin SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Unknown logical value: %s",value); 1749*2d747510SLisandro Dalcin } 1750*2d747510SLisandro Dalcin 1751*2d747510SLisandro Dalcin /* 1752*2d747510SLisandro Dalcin PetscOptionsStringToInt - Converts a string to an integer value. Handles special cases such as "default" and "decide" 1753*2d747510SLisandro Dalcin */ 1754*2d747510SLisandro Dalcin PetscErrorCode PetscOptionsStringToInt(const char name[],PetscInt *a) 1755*2d747510SLisandro Dalcin { 1756*2d747510SLisandro Dalcin PetscErrorCode ierr; 1757*2d747510SLisandro Dalcin size_t len; 1758*2d747510SLisandro Dalcin PetscBool decide,tdefault,mouse; 1759*2d747510SLisandro Dalcin 1760*2d747510SLisandro Dalcin PetscFunctionBegin; 1761*2d747510SLisandro Dalcin ierr = PetscStrlen(name,&len);CHKERRQ(ierr); 1762*2d747510SLisandro Dalcin if (!len) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"character string of length zero has no numerical value"); 1763*2d747510SLisandro Dalcin 1764*2d747510SLisandro Dalcin ierr = PetscStrcasecmp(name,"PETSC_DEFAULT",&tdefault);CHKERRQ(ierr); 1765*2d747510SLisandro Dalcin if (!tdefault) { 1766*2d747510SLisandro Dalcin ierr = PetscStrcasecmp(name,"DEFAULT",&tdefault);CHKERRQ(ierr); 1767*2d747510SLisandro Dalcin } 1768*2d747510SLisandro Dalcin ierr = PetscStrcasecmp(name,"PETSC_DECIDE",&decide);CHKERRQ(ierr); 1769*2d747510SLisandro Dalcin if (!decide) { 1770*2d747510SLisandro Dalcin ierr = PetscStrcasecmp(name,"DECIDE",&decide);CHKERRQ(ierr); 1771*2d747510SLisandro Dalcin } 1772*2d747510SLisandro Dalcin ierr = PetscStrcasecmp(name,"mouse",&mouse);CHKERRQ(ierr); 1773*2d747510SLisandro Dalcin 1774*2d747510SLisandro Dalcin if (tdefault) *a = PETSC_DEFAULT; 1775*2d747510SLisandro Dalcin else if (decide) *a = PETSC_DECIDE; 1776*2d747510SLisandro Dalcin else if (mouse) *a = -1; 1777*2d747510SLisandro Dalcin else { 1778*2d747510SLisandro Dalcin char *endptr; 1779*2d747510SLisandro Dalcin long strtolval; 1780*2d747510SLisandro Dalcin 1781*2d747510SLisandro Dalcin strtolval = strtol(name,&endptr,10); 1782*2d747510SLisandro 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); 1783*2d747510SLisandro Dalcin 1784*2d747510SLisandro Dalcin #if defined(PETSC_USE_64BIT_INDICES) && defined(PETSC_HAVE_ATOLL) 1785*2d747510SLisandro Dalcin (void) strtolval; 1786*2d747510SLisandro Dalcin *a = atoll(name); 1787*2d747510SLisandro Dalcin #elif defined(PETSC_USE_64BIT_INDICES) && defined(PETSC_HAVE___INT64) 1788*2d747510SLisandro Dalcin (void) strtolval; 1789*2d747510SLisandro Dalcin *a = _atoi64(name); 1790*2d747510SLisandro Dalcin #else 1791*2d747510SLisandro Dalcin *a = (PetscInt)strtolval; 1792*2d747510SLisandro Dalcin #endif 1793*2d747510SLisandro Dalcin } 1794*2d747510SLisandro Dalcin PetscFunctionReturn(0); 1795*2d747510SLisandro Dalcin } 1796*2d747510SLisandro Dalcin 1797*2d747510SLisandro Dalcin #if defined(PETSC_USE_REAL___FLOAT128) 1798*2d747510SLisandro Dalcin #include <quadmath.h> 1799*2d747510SLisandro Dalcin #endif 1800*2d747510SLisandro Dalcin 1801*2d747510SLisandro Dalcin static PetscErrorCode PetscStrtod(const char name[],PetscReal *a,char **endptr) 1802*2d747510SLisandro Dalcin { 1803*2d747510SLisandro Dalcin PetscFunctionBegin; 1804*2d747510SLisandro Dalcin #if defined(PETSC_USE_REAL___FLOAT128) 1805*2d747510SLisandro Dalcin *a = strtoflt128(name,endptr); 1806*2d747510SLisandro Dalcin #else 1807*2d747510SLisandro Dalcin *a = (PetscReal)strtod(name,endptr); 1808*2d747510SLisandro Dalcin #endif 1809*2d747510SLisandro Dalcin PetscFunctionReturn(0); 1810*2d747510SLisandro Dalcin } 1811*2d747510SLisandro Dalcin 1812*2d747510SLisandro Dalcin static PetscErrorCode PetscStrtoz(const char name[],PetscScalar *a,char **endptr,PetscBool *isImaginary) 1813*2d747510SLisandro Dalcin { 1814*2d747510SLisandro Dalcin PetscBool hasi = PETSC_FALSE; 1815*2d747510SLisandro Dalcin char *ptr; 1816*2d747510SLisandro Dalcin PetscReal strtoval; 1817*2d747510SLisandro Dalcin PetscErrorCode ierr; 1818*2d747510SLisandro Dalcin 1819*2d747510SLisandro Dalcin PetscFunctionBegin; 1820*2d747510SLisandro Dalcin ierr = PetscStrtod(name,&strtoval,&ptr);CHKERRQ(ierr); 1821*2d747510SLisandro Dalcin if (ptr == name) { 1822*2d747510SLisandro Dalcin strtoval = 1.; 1823*2d747510SLisandro Dalcin hasi = PETSC_TRUE; 1824*2d747510SLisandro Dalcin if (name[0] == 'i') { 1825*2d747510SLisandro Dalcin ptr++; 1826*2d747510SLisandro Dalcin } else if (name[0] == '+' && name[1] == 'i') { 1827*2d747510SLisandro Dalcin ptr += 2; 1828*2d747510SLisandro Dalcin } else if (name[0] == '-' && name[1] == 'i') { 1829*2d747510SLisandro Dalcin strtoval = -1.; 1830*2d747510SLisandro Dalcin ptr += 2; 1831*2d747510SLisandro Dalcin } 1832*2d747510SLisandro Dalcin } else if (*ptr == 'i') { 1833*2d747510SLisandro Dalcin hasi = PETSC_TRUE; 1834*2d747510SLisandro Dalcin ptr++; 1835*2d747510SLisandro Dalcin } 1836*2d747510SLisandro Dalcin *endptr = ptr; 1837*2d747510SLisandro Dalcin *isImaginary = hasi; 1838*2d747510SLisandro Dalcin if (hasi) { 1839*2d747510SLisandro Dalcin #if !defined(PETSC_USE_COMPLEX) 1840*2d747510SLisandro Dalcin SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Input string %s contains imaginary but complex not supported ",name); 1841*2d747510SLisandro Dalcin #else 1842*2d747510SLisandro Dalcin *a = PetscCMPLX(0.,strtoval); 1843*2d747510SLisandro Dalcin #endif 1844*2d747510SLisandro Dalcin } else { 1845*2d747510SLisandro Dalcin *a = strtoval; 1846*2d747510SLisandro Dalcin } 1847*2d747510SLisandro Dalcin PetscFunctionReturn(0); 1848*2d747510SLisandro Dalcin } 1849*2d747510SLisandro Dalcin 1850*2d747510SLisandro Dalcin /* 1851*2d747510SLisandro Dalcin Converts a string to PetscReal value. Handles special cases like "default" and "decide" 1852*2d747510SLisandro Dalcin */ 1853*2d747510SLisandro Dalcin PetscErrorCode PetscOptionsStringToReal(const char name[],PetscReal *a) 1854*2d747510SLisandro Dalcin { 1855*2d747510SLisandro Dalcin size_t len; 1856*2d747510SLisandro Dalcin PetscBool match; 1857*2d747510SLisandro Dalcin char *endptr; 1858*2d747510SLisandro Dalcin PetscErrorCode ierr; 1859*2d747510SLisandro Dalcin 1860*2d747510SLisandro Dalcin PetscFunctionBegin; 1861*2d747510SLisandro Dalcin ierr = PetscStrlen(name,&len);CHKERRQ(ierr); 1862*2d747510SLisandro Dalcin if (!len) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"String of length zero has no numerical value"); 1863*2d747510SLisandro Dalcin 1864*2d747510SLisandro Dalcin ierr = PetscStrcasecmp(name,"PETSC_DEFAULT",&match);CHKERRQ(ierr); 1865*2d747510SLisandro Dalcin if (!match) { 1866*2d747510SLisandro Dalcin ierr = PetscStrcasecmp(name,"DEFAULT",&match);CHKERRQ(ierr); 1867*2d747510SLisandro Dalcin } 1868*2d747510SLisandro Dalcin if (match) {*a = PETSC_DEFAULT; PetscFunctionReturn(0);} 1869*2d747510SLisandro Dalcin 1870*2d747510SLisandro Dalcin ierr = PetscStrcasecmp(name,"PETSC_DECIDE",&match);CHKERRQ(ierr); 1871*2d747510SLisandro Dalcin if (!match) { 1872*2d747510SLisandro Dalcin ierr = PetscStrcasecmp(name,"DECIDE",&match);CHKERRQ(ierr); 1873*2d747510SLisandro Dalcin } 1874*2d747510SLisandro Dalcin if (match) {*a = PETSC_DECIDE; PetscFunctionReturn(0);} 1875*2d747510SLisandro Dalcin 1876*2d747510SLisandro Dalcin ierr = PetscStrtod(name,a,&endptr);CHKERRQ(ierr); 1877*2d747510SLisandro Dalcin if ((size_t) (endptr - name) != len) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Input string %s has no numeric value",name); 1878*2d747510SLisandro Dalcin PetscFunctionReturn(0); 1879*2d747510SLisandro Dalcin } 1880*2d747510SLisandro Dalcin 1881*2d747510SLisandro Dalcin PetscErrorCode PetscOptionsStringToScalar(const char name[],PetscScalar *a) 1882*2d747510SLisandro Dalcin { 1883*2d747510SLisandro Dalcin PetscBool imag1; 1884*2d747510SLisandro Dalcin size_t len; 1885*2d747510SLisandro Dalcin PetscScalar val = 0.; 1886*2d747510SLisandro Dalcin char *ptr = NULL; 1887*2d747510SLisandro Dalcin PetscErrorCode ierr; 1888*2d747510SLisandro Dalcin 1889*2d747510SLisandro Dalcin PetscFunctionBegin; 1890*2d747510SLisandro Dalcin ierr = PetscStrlen(name,&len);CHKERRQ(ierr); 1891*2d747510SLisandro Dalcin if (!len) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"character string of length zero has no numerical value"); 1892*2d747510SLisandro Dalcin ierr = PetscStrtoz(name,&val,&ptr,&imag1);CHKERRQ(ierr); 1893*2d747510SLisandro Dalcin #if defined(PETSC_USE_COMPLEX) 1894*2d747510SLisandro Dalcin if ((size_t) (ptr - name) < len) { 1895*2d747510SLisandro Dalcin PetscBool imag2; 1896*2d747510SLisandro Dalcin PetscScalar val2; 1897*2d747510SLisandro Dalcin 1898*2d747510SLisandro Dalcin ierr = PetscStrtoz(ptr,&val2,&ptr,&imag2);CHKERRQ(ierr); 1899*2d747510SLisandro Dalcin if (imag1 || !imag2) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Input string %s: must specify imaginary component second",name); 1900*2d747510SLisandro Dalcin val = PetscCMPLX(PetscRealPart(val),PetscImaginaryPart(val2)); 1901*2d747510SLisandro Dalcin } 1902*2d747510SLisandro Dalcin #endif 1903*2d747510SLisandro Dalcin if ((size_t) (ptr - name) != len) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Input string %s has no numeric value ",name); 1904*2d747510SLisandro Dalcin *a = val; 1905*2d747510SLisandro Dalcin PetscFunctionReturn(0); 1906*2d747510SLisandro Dalcin } 1907*2d747510SLisandro Dalcin 1908*2d747510SLisandro Dalcin /*@C 1909*2d747510SLisandro Dalcin PetscOptionsGetBool - Gets the Logical (true or false) value for a particular 1910*2d747510SLisandro Dalcin option in the database. 1911e5c89e4eSSatish Balay 1912e5c89e4eSSatish Balay Not Collective 1913e5c89e4eSSatish Balay 1914e5c89e4eSSatish Balay Input Parameters: 19155c9cc608SHong Zhang + options - options database, use NULL for default global database 1916c5929fdfSBarry Smith . pre - the string to prepend to the name or NULL 1917e5c89e4eSSatish Balay - name - the option one is seeking 1918e5c89e4eSSatish Balay 1919e5c89e4eSSatish Balay Output Parameter: 1920*2d747510SLisandro Dalcin + ivalue - the logical value to return 192196ef3cdfSSatish Balay - set - PETSC_TRUE if found, else PETSC_FALSE 1922e5c89e4eSSatish Balay 1923e5c89e4eSSatish Balay Level: beginner 1924e5c89e4eSSatish Balay 192595452b02SPatrick Sanan Notes: 1926*2d747510SLisandro Dalcin TRUE, true, YES, yes, nostring, and 1 all translate to PETSC_TRUE 1927*2d747510SLisandro Dalcin FALSE, false, NO, no, and 0 all translate to PETSC_FALSE 1928*2d747510SLisandro Dalcin 1929*2d747510SLisandro 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 1930*2d747510SLisandro Dalcin is equivalent to -requested_bool true 1931*2d747510SLisandro Dalcin 1932*2d747510SLisandro Dalcin If the user does not supply the option at all ivalue is NOT changed. Thus 19332efd9cb1SBarry Smith you should ALWAYS initialize the ivalue if you access it without first checking if the set flag is true. 19342efd9cb1SBarry Smith 1935*2d747510SLisandro Dalcin Concepts: options database^has logical 1936e5c89e4eSSatish Balay 1937e5c89e4eSSatish Balay .seealso: PetscOptionsGetReal(), PetscOptionsHasName(), PetscOptionsGetString(), 1938*2d747510SLisandro Dalcin PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsGetInt(), PetscOptionsBool(), 1939e5c89e4eSSatish Balay PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 1940e5c89e4eSSatish Balay PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 1941acfcf0e5SJed Brown PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 1942a264d7a6SBarry Smith PetscOptionsFList(), PetscOptionsEList() 1943e5c89e4eSSatish Balay @*/ 1944*2d747510SLisandro Dalcin PetscErrorCode PetscOptionsGetBool(PetscOptions options,const char pre[],const char name[],PetscBool *ivalue,PetscBool *set) 1945e5c89e4eSSatish Balay { 1946*2d747510SLisandro Dalcin const char *value; 1947ace3abfcSBarry Smith PetscBool flag; 1948*2d747510SLisandro Dalcin PetscErrorCode ierr; 1949e5c89e4eSSatish Balay 1950e5c89e4eSSatish Balay PetscFunctionBegin; 1951*2d747510SLisandro Dalcin PetscValidCharPointer(name,3); 1952*2d747510SLisandro Dalcin if (ivalue) PetscValidIntPointer(ivalue,4); 1953*2d747510SLisandro Dalcin ierr = PetscOptionsFindPair(options,pre,name,&value,&flag);CHKERRQ(ierr); 1954e5c89e4eSSatish Balay if (flag) { 195596ef3cdfSSatish Balay if (set) *set = PETSC_TRUE; 1956*2d747510SLisandro Dalcin if (!value) { 1957*2d747510SLisandro Dalcin if (ivalue) *ivalue = PETSC_TRUE; 1958*2d747510SLisandro Dalcin } else { 1959*2d747510SLisandro Dalcin ierr = PetscOptionsStringToBool(value, &flag);CHKERRQ(ierr); 1960*2d747510SLisandro Dalcin if (ivalue) *ivalue = flag; 1961e5c89e4eSSatish Balay } 1962e5c89e4eSSatish Balay } else { 196396ef3cdfSSatish Balay if (set) *set = PETSC_FALSE; 1964e5c89e4eSSatish Balay } 1965e5c89e4eSSatish Balay PetscFunctionReturn(0); 1966e5c89e4eSSatish Balay } 1967e5c89e4eSSatish Balay 1968e5c89e4eSSatish Balay /*@C 1969e5c89e4eSSatish Balay PetscOptionsGetEList - Puts a list of option values that a single one may be selected from 1970e5c89e4eSSatish Balay 1971e5c89e4eSSatish Balay Not Collective 1972e5c89e4eSSatish Balay 1973e5c89e4eSSatish Balay Input Parameters: 19745c9cc608SHong Zhang + options - options database, use NULL for default global database 1975c5929fdfSBarry Smith . pre - the string to prepend to the name or NULL 1976e5c89e4eSSatish Balay . opt - option name 1977a264d7a6SBarry Smith . list - the possible choices (one of these must be selected, anything else is invalid) 1978e5c89e4eSSatish Balay . ntext - number of choices 1979e5c89e4eSSatish Balay 1980e5c89e4eSSatish Balay Output Parameter: 19812efd9cb1SBarry Smith + value - the index of the value to return (defaults to zero if the option name is given but no choice is listed) 1982e5c89e4eSSatish Balay - set - PETSC_TRUE if found, else PETSC_FALSE 1983e5c89e4eSSatish Balay 1984e5c89e4eSSatish Balay Level: intermediate 1985e5c89e4eSSatish Balay 198695452b02SPatrick Sanan Notes: 198795452b02SPatrick Sanan If the user does not supply the option value is NOT changed. Thus 19882efd9cb1SBarry Smith you should ALWAYS initialize the ivalue if you access it without first checking if the set flag is true. 19892efd9cb1SBarry Smith 1990a264d7a6SBarry Smith See PetscOptionsFList() for when the choices are given in a PetscFunctionList() 1991e5c89e4eSSatish Balay 1992e5c89e4eSSatish Balay Concepts: options database^list 1993e5c89e4eSSatish Balay 1994e5c89e4eSSatish Balay .seealso: PetscOptionsGetInt(), PetscOptionsGetReal(), 1995acfcf0e5SJed Brown PetscOptionsHasName(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool(), 1996e5c89e4eSSatish Balay PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 1997e5c89e4eSSatish Balay PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 1998acfcf0e5SJed Brown PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 1999a264d7a6SBarry Smith PetscOptionsFList(), PetscOptionsEList() 2000e5c89e4eSSatish Balay @*/ 2001c5929fdfSBarry Smith PetscErrorCode PetscOptionsGetEList(PetscOptions options,const char pre[],const char opt[],const char * const *list,PetscInt ntext,PetscInt *value,PetscBool *set) 2002e5c89e4eSSatish Balay { 2003e5c89e4eSSatish Balay PetscErrorCode ierr; 2004e5c89e4eSSatish Balay size_t alen,len = 0; 2005e5c89e4eSSatish Balay char *svalue; 2006ace3abfcSBarry Smith PetscBool aset,flg = PETSC_FALSE; 2007e5c89e4eSSatish Balay PetscInt i; 2008e5c89e4eSSatish Balay 2009e5c89e4eSSatish Balay PetscFunctionBegin; 2010*2d747510SLisandro Dalcin PetscValidCharPointer(opt,3); 2011e5c89e4eSSatish Balay for (i=0; i<ntext; i++) { 2012e5c89e4eSSatish Balay ierr = PetscStrlen(list[i],&alen);CHKERRQ(ierr); 2013e5c89e4eSSatish Balay if (alen > len) len = alen; 2014e5c89e4eSSatish Balay } 2015e5c89e4eSSatish Balay len += 5; /* a little extra space for user mistypes */ 2016785e854fSJed Brown ierr = PetscMalloc1(len,&svalue);CHKERRQ(ierr); 2017c5929fdfSBarry Smith ierr = PetscOptionsGetString(options,pre,opt,svalue,len,&aset);CHKERRQ(ierr); 2018e5c89e4eSSatish Balay if (aset) { 2019fbedd5e0SJed Brown ierr = PetscEListFind(ntext,list,svalue,value,&flg);CHKERRQ(ierr); 2020e32f2f54SBarry Smith if (!flg) SETERRQ3(PETSC_COMM_SELF,PETSC_ERR_USER,"Unknown option %s for -%s%s",svalue,pre ? pre : "",opt+1); 2021fbedd5e0SJed Brown if (set) *set = PETSC_TRUE; 2022a297a907SKarl Rupp } else if (set) *set = PETSC_FALSE; 2023e5c89e4eSSatish Balay ierr = PetscFree(svalue);CHKERRQ(ierr); 2024e5c89e4eSSatish Balay PetscFunctionReturn(0); 2025e5c89e4eSSatish Balay } 2026e5c89e4eSSatish Balay 2027e5c89e4eSSatish Balay /*@C 2028e5c89e4eSSatish Balay PetscOptionsGetEnum - Gets the enum value for a particular option in the database. 2029e5c89e4eSSatish Balay 2030e5c89e4eSSatish Balay Not Collective 2031e5c89e4eSSatish Balay 2032e5c89e4eSSatish Balay Input Parameters: 20335c9cc608SHong Zhang + options - options database, use NULL for default global database 2034c5929fdfSBarry Smith . pre - option prefix or NULL 2035e5c89e4eSSatish Balay . opt - option name 2036e5c89e4eSSatish Balay . list - array containing the list of choices, followed by the enum name, followed by the enum prefix, followed by a null 2037e5c89e4eSSatish Balay - defaultv - the default (current) value 2038e5c89e4eSSatish Balay 2039e5c89e4eSSatish Balay Output Parameter: 2040e5c89e4eSSatish Balay + value - the value to return 204196ef3cdfSSatish Balay - set - PETSC_TRUE if found, else PETSC_FALSE 2042e5c89e4eSSatish Balay 2043e5c89e4eSSatish Balay Level: beginner 2044e5c89e4eSSatish Balay 2045e5c89e4eSSatish Balay Concepts: options database 2046e5c89e4eSSatish Balay 204795452b02SPatrick Sanan Notes: 204895452b02SPatrick Sanan If the user does not supply the option value is NOT changed. Thus 20492efd9cb1SBarry Smith you should ALWAYS initialize the ivalue if you access it without first checking if the set flag is true. 2050e5c89e4eSSatish Balay 20512efd9cb1SBarry Smith List is usually something like PCASMTypes or some other predefined list of enum names 2052e5c89e4eSSatish Balay 2053e5c89e4eSSatish Balay .seealso: PetscOptionsGetReal(), PetscOptionsHasName(), PetscOptionsGetString(), PetscOptionsGetInt(), 2054acfcf0e5SJed Brown PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool() 2055acfcf0e5SJed Brown PetscOptionsInt(), PetscOptionsString(), PetscOptionsReal(), PetscOptionsBool(), 2056e5c89e4eSSatish Balay PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 2057e5c89e4eSSatish Balay PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 2058acfcf0e5SJed Brown PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 2059a264d7a6SBarry Smith PetscOptionsFList(), PetscOptionsEList(), PetscOptionsGetEList(), PetscOptionsEnum() 2060e5c89e4eSSatish Balay @*/ 2061c5929fdfSBarry Smith PetscErrorCode PetscOptionsGetEnum(PetscOptions options,const char pre[],const char opt[],const char * const *list,PetscEnum *value,PetscBool *set) 2062e5c89e4eSSatish Balay { 2063e5c89e4eSSatish Balay PetscErrorCode ierr; 206469a24498SJed Brown PetscInt ntext = 0,tval; 2065ace3abfcSBarry Smith PetscBool fset; 2066e5c89e4eSSatish Balay 2067e5c89e4eSSatish Balay PetscFunctionBegin; 2068*2d747510SLisandro Dalcin PetscValidCharPointer(opt,3); 2069e5c89e4eSSatish Balay while (list[ntext++]) { 2070e32f2f54SBarry Smith if (ntext > 50) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"List argument appears to be wrong or have more than 50 entries"); 2071e5c89e4eSSatish Balay } 2072e32f2f54SBarry Smith if (ntext < 3) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"List argument must have at least two entries: typename and type prefix"); 2073e5c89e4eSSatish Balay ntext -= 3; 2074c5929fdfSBarry Smith ierr = PetscOptionsGetEList(options,pre,opt,list,ntext,&tval,&fset);CHKERRQ(ierr); 207569a24498SJed Brown /* with PETSC_USE_64BIT_INDICES sizeof(PetscInt) != sizeof(PetscEnum) */ 2076809ceb46SBarry Smith if (fset) *value = (PetscEnum)tval; 2077809ceb46SBarry Smith if (set) *set = fset; 2078e5c89e4eSSatish Balay PetscFunctionReturn(0); 2079e5c89e4eSSatish Balay } 2080e5c89e4eSSatish Balay 2081e5c89e4eSSatish Balay /*@C 2082*2d747510SLisandro Dalcin PetscOptionsGetInt - Gets the integer value for a particular option in the database. 2083e5c89e4eSSatish Balay 2084e5c89e4eSSatish Balay Not Collective 2085e5c89e4eSSatish Balay 2086e5c89e4eSSatish Balay Input Parameters: 20875c9cc608SHong Zhang + options - options database, use NULL for default global database 2088c5929fdfSBarry Smith . pre - the string to prepend to the name or NULL 2089e5c89e4eSSatish Balay - name - the option one is seeking 2090e5c89e4eSSatish Balay 2091e5c89e4eSSatish Balay Output Parameter: 2092*2d747510SLisandro Dalcin + ivalue - the integer value to return 209396ef3cdfSSatish Balay - set - PETSC_TRUE if found, else PETSC_FALSE 2094e5c89e4eSSatish Balay 2095e5c89e4eSSatish Balay Level: beginner 2096e5c89e4eSSatish Balay 2097e5c89e4eSSatish Balay Notes: 2098*2d747510SLisandro Dalcin If the user does not supply the option ivalue is NOT changed. Thus 20992efd9cb1SBarry Smith you should ALWAYS initialize the ivalue if you access it without first checking if the set flag is true. 21005c07ccb8SBarry Smith 2101*2d747510SLisandro Dalcin Concepts: options database^has int 2102e5c89e4eSSatish Balay 2103e5c89e4eSSatish Balay .seealso: PetscOptionsGetReal(), PetscOptionsHasName(), PetscOptionsGetString(), 2104*2d747510SLisandro Dalcin PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool() 2105*2d747510SLisandro Dalcin PetscOptionsInt(), PetscOptionsString(), PetscOptionsReal(), PetscOptionsBool(), 2106e5c89e4eSSatish Balay PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 2107e5c89e4eSSatish Balay PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 2108acfcf0e5SJed Brown PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 2109a264d7a6SBarry Smith PetscOptionsFList(), PetscOptionsEList() 2110e5c89e4eSSatish Balay @*/ 2111*2d747510SLisandro Dalcin PetscErrorCode PetscOptionsGetInt(PetscOptions options,const char pre[],const char name[],PetscInt *ivalue,PetscBool *set) 2112e5c89e4eSSatish Balay { 2113*2d747510SLisandro Dalcin const char *value; 2114e5c89e4eSSatish Balay PetscErrorCode ierr; 2115*2d747510SLisandro Dalcin PetscBool flag; 2116e5c89e4eSSatish Balay 2117e5c89e4eSSatish Balay PetscFunctionBegin; 2118*2d747510SLisandro Dalcin PetscValidCharPointer(name,3); 2119*2d747510SLisandro Dalcin PetscValidIntPointer(ivalue,4); 2120*2d747510SLisandro Dalcin ierr = PetscOptionsFindPair(options,pre,name,&value,&flag);CHKERRQ(ierr); 2121e5c89e4eSSatish Balay if (flag) { 212234a9cc2cSBarry Smith if (!value) { 2123*2d747510SLisandro Dalcin if (set) *set = PETSC_FALSE; 212434a9cc2cSBarry Smith } else { 2125*2d747510SLisandro Dalcin if (set) *set = PETSC_TRUE; 2126*2d747510SLisandro Dalcin ierr = PetscOptionsStringToInt(value,ivalue);CHKERRQ(ierr); 2127e5c89e4eSSatish Balay } 2128e5c89e4eSSatish Balay } else { 212996ef3cdfSSatish Balay if (set) *set = PETSC_FALSE; 2130e5c89e4eSSatish Balay } 2131e5c89e4eSSatish Balay PetscFunctionReturn(0); 2132e5c89e4eSSatish Balay } 2133e5c89e4eSSatish Balay 2134e2446a98SMatthew Knepley /*@C 2135e5c89e4eSSatish Balay PetscOptionsGetReal - Gets the double precision value for a particular 2136e5c89e4eSSatish Balay option in the database. 2137e5c89e4eSSatish Balay 2138e5c89e4eSSatish Balay Not Collective 2139e5c89e4eSSatish Balay 2140e5c89e4eSSatish Balay Input Parameters: 21415c9cc608SHong Zhang + options - options database, use NULL for default global database 2142c5929fdfSBarry Smith . pre - string to prepend to each name or NULL 2143e5c89e4eSSatish Balay - name - the option one is seeking 2144e5c89e4eSSatish Balay 2145e5c89e4eSSatish Balay Output Parameter: 2146e5c89e4eSSatish Balay + dvalue - the double value to return 214796ef3cdfSSatish Balay - set - PETSC_TRUE if found, PETSC_FALSE if not found 2148e5c89e4eSSatish Balay 214995452b02SPatrick Sanan Notes: 215095452b02SPatrick Sanan If the user does not supply the option dvalue is NOT changed. Thus 21512efd9cb1SBarry Smith you should ALWAYS initialize the ivalue if you access it without first checking if the set flag is true. 2152e4974155SBarry Smith 2153e5c89e4eSSatish Balay Level: beginner 2154e5c89e4eSSatish Balay 2155e5c89e4eSSatish Balay Concepts: options database^has double 2156e5c89e4eSSatish Balay 2157e5c89e4eSSatish Balay .seealso: PetscOptionsGetInt(), PetscOptionsHasName(), 2158acfcf0e5SJed Brown PetscOptionsGetString(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(),PetscOptionsBool(), 2159e5c89e4eSSatish Balay PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 2160e5c89e4eSSatish Balay PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 2161acfcf0e5SJed Brown PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 2162a264d7a6SBarry Smith PetscOptionsFList(), PetscOptionsEList() 2163e5c89e4eSSatish Balay @*/ 2164c5929fdfSBarry Smith PetscErrorCode PetscOptionsGetReal(PetscOptions options,const char pre[],const char name[],PetscReal *dvalue,PetscBool *set) 2165e5c89e4eSSatish Balay { 2166*2d747510SLisandro Dalcin const char *value; 2167ace3abfcSBarry Smith PetscBool flag; 2168*2d747510SLisandro Dalcin PetscErrorCode ierr; 2169e5c89e4eSSatish Balay 2170e5c89e4eSSatish Balay PetscFunctionBegin; 2171*2d747510SLisandro Dalcin PetscValidCharPointer(name,3); 2172*2d747510SLisandro Dalcin PetscValidRealPointer(dvalue,4); 2173*2d747510SLisandro Dalcin ierr = PetscOptionsFindPair(options,pre,name,&value,&flag);CHKERRQ(ierr); 2174e5c89e4eSSatish Balay if (flag) { 2175a297a907SKarl Rupp if (!value) { 2176a297a907SKarl Rupp if (set) *set = PETSC_FALSE; 2177a297a907SKarl Rupp } else { 2178a297a907SKarl Rupp if (set) *set = PETSC_TRUE; 2179a297a907SKarl Rupp ierr = PetscOptionsStringToReal(value,dvalue);CHKERRQ(ierr); 2180a297a907SKarl Rupp } 2181e5c89e4eSSatish Balay } else { 218296ef3cdfSSatish Balay if (set) *set = PETSC_FALSE; 2183e5c89e4eSSatish Balay } 2184e5c89e4eSSatish Balay PetscFunctionReturn(0); 2185e5c89e4eSSatish Balay } 2186e5c89e4eSSatish Balay 2187e5c89e4eSSatish Balay /*@C 2188e5c89e4eSSatish Balay PetscOptionsGetScalar - Gets the scalar value for a particular 2189e5c89e4eSSatish Balay option in the database. 2190e5c89e4eSSatish Balay 2191e5c89e4eSSatish Balay Not Collective 2192e5c89e4eSSatish Balay 2193e5c89e4eSSatish Balay Input Parameters: 21945c9cc608SHong Zhang + options - options database, use NULL for default global database 2195c5929fdfSBarry Smith . pre - string to prepend to each name or NULL 2196e5c89e4eSSatish Balay - name - the option one is seeking 2197e5c89e4eSSatish Balay 2198e5c89e4eSSatish Balay Output Parameter: 2199e5c89e4eSSatish Balay + dvalue - the double value to return 220096ef3cdfSSatish Balay - set - PETSC_TRUE if found, else PETSC_FALSE 2201e5c89e4eSSatish Balay 2202e5c89e4eSSatish Balay Level: beginner 2203e5c89e4eSSatish Balay 2204e5c89e4eSSatish Balay Usage: 2205eb4ae41dSBarry Smith A complex number 2+3i must be specified with NO spaces 2206e5c89e4eSSatish Balay 220795452b02SPatrick Sanan Notes: 220895452b02SPatrick Sanan If the user does not supply the option dvalue is NOT changed. Thus 22092efd9cb1SBarry Smith you should ALWAYS initialize the ivalue if you access it without first checking if the set flag is true. 2210e4974155SBarry Smith 2211e5c89e4eSSatish Balay Concepts: options database^has scalar 2212e5c89e4eSSatish Balay 2213e5c89e4eSSatish Balay .seealso: PetscOptionsGetInt(), PetscOptionsHasName(), 2214acfcf0e5SJed Brown PetscOptionsGetString(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool(), 2215e5c89e4eSSatish Balay PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 2216e5c89e4eSSatish Balay PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 2217acfcf0e5SJed Brown PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 2218a264d7a6SBarry Smith PetscOptionsFList(), PetscOptionsEList() 2219e5c89e4eSSatish Balay @*/ 2220c5929fdfSBarry Smith PetscErrorCode PetscOptionsGetScalar(PetscOptions options,const char pre[],const char name[],PetscScalar *dvalue,PetscBool *set) 2221e5c89e4eSSatish Balay { 2222*2d747510SLisandro Dalcin const char *value; 2223ace3abfcSBarry Smith PetscBool flag; 2224e5c89e4eSSatish Balay PetscErrorCode ierr; 2225e5c89e4eSSatish Balay 2226e5c89e4eSSatish Balay PetscFunctionBegin; 2227*2d747510SLisandro Dalcin PetscValidCharPointer(name,3); 2228*2d747510SLisandro Dalcin PetscValidScalarPointer(dvalue,4); 2229*2d747510SLisandro Dalcin ierr = PetscOptionsFindPair(options,pre,name,&value,&flag);CHKERRQ(ierr); 2230e5c89e4eSSatish Balay if (flag) { 2231e5c89e4eSSatish Balay if (!value) { 223296ef3cdfSSatish Balay if (set) *set = PETSC_FALSE; 2233e5c89e4eSSatish Balay } else { 2234e5c89e4eSSatish Balay #if !defined(PETSC_USE_COMPLEX) 2235cfbddea1SSatish Balay ierr = PetscOptionsStringToReal(value,dvalue);CHKERRQ(ierr); 2236e5c89e4eSSatish Balay #else 2237eb4ae41dSBarry Smith ierr = PetscOptionsStringToScalar(value,dvalue);CHKERRQ(ierr); 2238e5c89e4eSSatish Balay #endif 223996ef3cdfSSatish Balay if (set) *set = PETSC_TRUE; 2240e5c89e4eSSatish Balay } 2241e5c89e4eSSatish Balay } else { /* flag */ 224296ef3cdfSSatish Balay if (set) *set = PETSC_FALSE; 2243e5c89e4eSSatish Balay } 2244e5c89e4eSSatish Balay PetscFunctionReturn(0); 2245e5c89e4eSSatish Balay } 2246e5c89e4eSSatish Balay 2247e5c89e4eSSatish Balay /*@C 2248e5c89e4eSSatish Balay PetscOptionsGetString - Gets the string value for a particular option in 2249e5c89e4eSSatish Balay the database. 2250e5c89e4eSSatish Balay 2251e5c89e4eSSatish Balay Not Collective 2252e5c89e4eSSatish Balay 2253e5c89e4eSSatish Balay Input Parameters: 22545c9cc608SHong Zhang + options - options database, use NULL for default global database 2255c5929fdfSBarry Smith . pre - string to prepend to name or NULL 2256e5c89e4eSSatish Balay . name - the option one is seeking 2257bcbf2dc5SJed Brown - len - maximum length of the string including null termination 2258e5c89e4eSSatish Balay 2259e5c89e4eSSatish Balay Output Parameters: 2260e5c89e4eSSatish Balay + string - location to copy string 226196ef3cdfSSatish Balay - set - PETSC_TRUE if found, else PETSC_FALSE 2262e5c89e4eSSatish Balay 2263e5c89e4eSSatish Balay Level: beginner 2264e5c89e4eSSatish Balay 2265e5c89e4eSSatish Balay Fortran Note: 2266e5c89e4eSSatish Balay The Fortran interface is slightly different from the C/C++ 2267e5c89e4eSSatish Balay interface (len is not used). Sample usage in Fortran follows 2268e5c89e4eSSatish Balay .vb 2269e5c89e4eSSatish Balay character *20 string 227093e6ba5cSBarry Smith PetscErrorCode ierr 227193e6ba5cSBarry Smith PetscBool set 22721b266c99SBarry Smith call PetscOptionsGetString(PETSC_NULL_OPTIONS,PETSC_NULL_CHARACTER,'-s',string,set,ierr) 2273e5c89e4eSSatish Balay .ve 2274e5c89e4eSSatish Balay 227595452b02SPatrick Sanan Notes: 227695452b02SPatrick 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 2277e4974155SBarry Smith 22782efd9cb1SBarry Smith If the user does not use the option then the string is not changed. Thus 22792efd9cb1SBarry Smith you should ALWAYS initialize the string if you access it without first checking if the set flag is true. 22802efd9cb1SBarry Smith 2281e5c89e4eSSatish Balay Concepts: options database^string 2282e5c89e4eSSatish Balay 2283f3dea69dSBarry Smith Note: 2284f3dea69dSBarry 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). 2285f3dea69dSBarry Smith 2286e5c89e4eSSatish Balay .seealso: PetscOptionsGetInt(), PetscOptionsGetReal(), 2287acfcf0e5SJed Brown PetscOptionsHasName(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool(), 2288e5c89e4eSSatish Balay PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 2289e5c89e4eSSatish Balay PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 2290acfcf0e5SJed Brown PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 2291a264d7a6SBarry Smith PetscOptionsFList(), PetscOptionsEList() 2292e5c89e4eSSatish Balay @*/ 2293c5929fdfSBarry Smith PetscErrorCode PetscOptionsGetString(PetscOptions options,const char pre[],const char name[],char string[],size_t len,PetscBool *set) 2294e5c89e4eSSatish Balay { 2295*2d747510SLisandro Dalcin const char *value; 2296ace3abfcSBarry Smith PetscBool flag; 2297*2d747510SLisandro Dalcin PetscErrorCode ierr; 2298e5c89e4eSSatish Balay 2299e5c89e4eSSatish Balay PetscFunctionBegin; 2300*2d747510SLisandro Dalcin PetscValidCharPointer(name,3); 2301*2d747510SLisandro Dalcin PetscValidCharPointer(string,4); 2302*2d747510SLisandro Dalcin ierr = PetscOptionsFindPair(options,pre,name,&value,&flag);CHKERRQ(ierr); 2303e5c89e4eSSatish Balay if (!flag) { 230496ef3cdfSSatish Balay if (set) *set = PETSC_FALSE; 2305e5c89e4eSSatish Balay } else { 230696ef3cdfSSatish Balay if (set) *set = PETSC_TRUE; 2307e5c89e4eSSatish Balay if (value) { 2308e5c89e4eSSatish Balay ierr = PetscStrncpy(string,value,len);CHKERRQ(ierr); 2309e5c89e4eSSatish Balay } else { 2310e5c89e4eSSatish Balay ierr = PetscMemzero(string,len);CHKERRQ(ierr); 2311e5c89e4eSSatish Balay } 2312e5c89e4eSSatish Balay } 2313e5c89e4eSSatish Balay PetscFunctionReturn(0); 2314e5c89e4eSSatish Balay } 2315e5c89e4eSSatish Balay 2316c5929fdfSBarry Smith char *PetscOptionsGetStringMatlab(PetscOptions options,const char pre[],const char name[]) 231714ce751eSBarry Smith { 2318*2d747510SLisandro Dalcin const char *value; 231914ce751eSBarry Smith PetscBool flag; 2320*2d747510SLisandro Dalcin PetscErrorCode ierr; 232114ce751eSBarry Smith 232214ce751eSBarry Smith PetscFunctionBegin; 2323*2d747510SLisandro Dalcin ierr = PetscOptionsFindPair(options,pre,name,&value,&flag);if (ierr) PetscFunctionReturn(0); 2324*2d747510SLisandro Dalcin if (flag) PetscFunctionReturn((char*)value); 232514ce751eSBarry Smith else PetscFunctionReturn(0); 232614ce751eSBarry Smith } 232714ce751eSBarry Smith 2328*2d747510SLisandro Dalcin /*@C 2329*2d747510SLisandro Dalcin PetscOptionsGetBoolArray - Gets an array of Logical (true or false) values for a particular 2330*2d747510SLisandro Dalcin option in the database. The values must be separated with commas with 2331*2d747510SLisandro Dalcin no intervening spaces. 2332*2d747510SLisandro Dalcin 2333*2d747510SLisandro Dalcin Not Collective 2334*2d747510SLisandro Dalcin 2335*2d747510SLisandro Dalcin Input Parameters: 2336*2d747510SLisandro Dalcin + options - options database, use NULL for default global database 2337*2d747510SLisandro Dalcin . pre - string to prepend to each name or NULL 2338*2d747510SLisandro Dalcin . name - the option one is seeking 2339*2d747510SLisandro Dalcin - nmax - maximum number of values to retrieve 2340*2d747510SLisandro Dalcin 2341*2d747510SLisandro Dalcin Output Parameter: 2342*2d747510SLisandro Dalcin + dvalue - the integer values to return 2343*2d747510SLisandro Dalcin . nmax - actual number of values retreived 2344*2d747510SLisandro Dalcin - set - PETSC_TRUE if found, else PETSC_FALSE 2345*2d747510SLisandro Dalcin 2346*2d747510SLisandro Dalcin Level: beginner 2347*2d747510SLisandro Dalcin 2348*2d747510SLisandro Dalcin Concepts: options database^array of ints 2349*2d747510SLisandro Dalcin 2350*2d747510SLisandro Dalcin Notes: 2351*2d747510SLisandro Dalcin TRUE, true, YES, yes, nostring, and 1 all translate to PETSC_TRUE 2352*2d747510SLisandro Dalcin FALSE, false, NO, no, and 0 all translate to PETSC_FALSE 2353*2d747510SLisandro Dalcin 2354*2d747510SLisandro Dalcin .seealso: PetscOptionsGetInt(), PetscOptionsHasName(), 2355*2d747510SLisandro Dalcin PetscOptionsGetString(), PetscOptionsGetRealArray(), PetscOptionsBool(), 2356*2d747510SLisandro Dalcin PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 2357*2d747510SLisandro Dalcin PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 2358*2d747510SLisandro Dalcin PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 2359*2d747510SLisandro Dalcin PetscOptionsFList(), PetscOptionsEList() 2360*2d747510SLisandro Dalcin @*/ 2361*2d747510SLisandro Dalcin PetscErrorCode PetscOptionsGetBoolArray(PetscOptions options,const char pre[],const char name[],PetscBool dvalue[],PetscInt *nmax,PetscBool *set) 2362*2d747510SLisandro Dalcin { 2363*2d747510SLisandro Dalcin const char *svalue; 2364*2d747510SLisandro Dalcin char *value; 2365*2d747510SLisandro Dalcin PetscErrorCode ierr; 2366*2d747510SLisandro Dalcin PetscInt n = 0; 2367*2d747510SLisandro Dalcin PetscBool flag; 2368*2d747510SLisandro Dalcin PetscToken token; 2369*2d747510SLisandro Dalcin 2370*2d747510SLisandro Dalcin PetscFunctionBegin; 2371*2d747510SLisandro Dalcin PetscValidCharPointer(name,3); 2372*2d747510SLisandro Dalcin PetscValidIntPointer(dvalue,4); 2373*2d747510SLisandro Dalcin PetscValidIntPointer(nmax,5); 2374*2d747510SLisandro Dalcin 2375*2d747510SLisandro Dalcin ierr = PetscOptionsFindPair(options,pre,name,&svalue,&flag);CHKERRQ(ierr); 2376*2d747510SLisandro Dalcin if (!flag || !svalue) { if (set) *set = PETSC_FALSE; *nmax = 0; PetscFunctionReturn(0);} 2377*2d747510SLisandro Dalcin if (set) *set = PETSC_TRUE; 2378*2d747510SLisandro Dalcin ierr = PetscTokenCreate(svalue,',',&token);CHKERRQ(ierr); 2379*2d747510SLisandro Dalcin ierr = PetscTokenFind(token,&value);CHKERRQ(ierr); 2380*2d747510SLisandro Dalcin while (value && n < *nmax) { 2381*2d747510SLisandro Dalcin ierr = PetscOptionsStringToBool(value,dvalue);CHKERRQ(ierr); 2382*2d747510SLisandro Dalcin ierr = PetscTokenFind(token,&value);CHKERRQ(ierr); 2383*2d747510SLisandro Dalcin dvalue++; 2384*2d747510SLisandro Dalcin n++; 2385*2d747510SLisandro Dalcin } 2386*2d747510SLisandro Dalcin ierr = PetscTokenDestroy(&token);CHKERRQ(ierr); 2387*2d747510SLisandro Dalcin *nmax = n; 2388*2d747510SLisandro Dalcin PetscFunctionReturn(0); 2389*2d747510SLisandro Dalcin } 2390*2d747510SLisandro Dalcin 2391*2d747510SLisandro Dalcin /*@C 2392*2d747510SLisandro Dalcin PetscOptionsGetEnumArray - Gets an array of enum values for a particular option in the database. 2393*2d747510SLisandro Dalcin 2394*2d747510SLisandro Dalcin Not Collective 2395*2d747510SLisandro Dalcin 2396*2d747510SLisandro Dalcin Input Parameters: 2397*2d747510SLisandro Dalcin + options - options database, use NULL for default global database 2398*2d747510SLisandro Dalcin . pre - option prefix or NULL 2399*2d747510SLisandro Dalcin . name - option name 2400*2d747510SLisandro Dalcin . list - array containing the list of choices, followed by the enum name, followed by the enum prefix, followed by a null 2401*2d747510SLisandro Dalcin - nmax - maximum number of values to retrieve 2402*2d747510SLisandro Dalcin 2403*2d747510SLisandro Dalcin Output Parameters: 2404*2d747510SLisandro Dalcin + ivalue - the enum values to return 2405*2d747510SLisandro Dalcin . nmax - actual number of values retreived 2406*2d747510SLisandro Dalcin - set - PETSC_TRUE if found, else PETSC_FALSE 2407*2d747510SLisandro Dalcin 2408*2d747510SLisandro Dalcin Level: beginner 2409*2d747510SLisandro Dalcin 2410*2d747510SLisandro Dalcin Concepts: options database 2411*2d747510SLisandro Dalcin 2412*2d747510SLisandro Dalcin Notes: 2413*2d747510SLisandro Dalcin The array must be passed as a comma separated list. 2414*2d747510SLisandro Dalcin 2415*2d747510SLisandro Dalcin There must be no intervening spaces between the values. 2416*2d747510SLisandro Dalcin 2417*2d747510SLisandro Dalcin list is usually something like PCASMTypes or some other predefined list of enum names. 2418*2d747510SLisandro Dalcin 2419*2d747510SLisandro Dalcin .seealso: PetscOptionsGetReal(), PetscOptionsHasName(), PetscOptionsGetString(), PetscOptionsGetInt(), 2420*2d747510SLisandro Dalcin PetscOptionsGetEnum(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool() 2421*2d747510SLisandro Dalcin PetscOptionsInt(), PetscOptionsString(), PetscOptionsReal(), PetscOptionsBool(), PetscOptionsName(), 2422*2d747510SLisandro Dalcin PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), PetscOptionsStringArray(),PetscOptionsRealArray(), 2423*2d747510SLisandro Dalcin PetscOptionsScalar(), PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 2424*2d747510SLisandro Dalcin PetscOptionsFList(), PetscOptionsEList(), PetscOptionsGetEList(), PetscOptionsEnum() 2425*2d747510SLisandro Dalcin @*/ 2426*2d747510SLisandro Dalcin PetscErrorCode PetscOptionsGetEnumArray(PetscOptions options,const char pre[],const char name[],const char *const *list,PetscEnum ivalue[],PetscInt *nmax,PetscBool *set) 2427*2d747510SLisandro Dalcin { 2428*2d747510SLisandro Dalcin const char *svalue; 2429*2d747510SLisandro Dalcin char *value; 2430*2d747510SLisandro Dalcin PetscInt n = 0; 2431*2d747510SLisandro Dalcin PetscEnum evalue; 2432*2d747510SLisandro Dalcin PetscBool flag; 2433*2d747510SLisandro Dalcin PetscToken token; 2434*2d747510SLisandro Dalcin PetscErrorCode ierr; 2435*2d747510SLisandro Dalcin 2436*2d747510SLisandro Dalcin PetscFunctionBegin; 2437*2d747510SLisandro Dalcin PetscValidCharPointer(name,3); 2438*2d747510SLisandro Dalcin PetscValidPointer(list,4); 2439*2d747510SLisandro Dalcin PetscValidPointer(ivalue,5); 2440*2d747510SLisandro Dalcin PetscValidIntPointer(nmax,6); 2441*2d747510SLisandro Dalcin 2442*2d747510SLisandro Dalcin ierr = PetscOptionsFindPair(options,pre,name,&svalue,&flag);CHKERRQ(ierr); 2443*2d747510SLisandro Dalcin if (!flag || !svalue) { if (set) *set = PETSC_FALSE; *nmax = 0; PetscFunctionReturn(0);} 2444*2d747510SLisandro Dalcin if (set) *set = PETSC_TRUE; 2445*2d747510SLisandro Dalcin ierr = PetscTokenCreate(svalue,',',&token);CHKERRQ(ierr); 2446*2d747510SLisandro Dalcin ierr = PetscTokenFind(token,&value);CHKERRQ(ierr); 2447*2d747510SLisandro Dalcin while (value && n < *nmax) { 2448*2d747510SLisandro Dalcin ierr = PetscEnumFind(list,value,&evalue,&flag);CHKERRQ(ierr); 2449*2d747510SLisandro Dalcin if (!flag) SETERRQ3(PETSC_COMM_SELF,PETSC_ERR_USER,"Unknown enum value '%s' for -%s%s",svalue,pre ? pre : "",name+1); 2450*2d747510SLisandro Dalcin ivalue[n++] = evalue; 2451*2d747510SLisandro Dalcin ierr = PetscTokenFind(token,&value);CHKERRQ(ierr); 2452*2d747510SLisandro Dalcin } 2453*2d747510SLisandro Dalcin ierr = PetscTokenDestroy(&token);CHKERRQ(ierr); 2454*2d747510SLisandro Dalcin *nmax = n; 2455*2d747510SLisandro Dalcin PetscFunctionReturn(0); 2456*2d747510SLisandro Dalcin } 2457*2d747510SLisandro Dalcin 2458*2d747510SLisandro Dalcin /*@C 2459*2d747510SLisandro Dalcin PetscOptionsGetIntArray - Gets an array of integer values for a particular 2460*2d747510SLisandro Dalcin option in the database. 2461*2d747510SLisandro Dalcin 2462*2d747510SLisandro Dalcin Not Collective 2463*2d747510SLisandro Dalcin 2464*2d747510SLisandro Dalcin Input Parameters: 2465*2d747510SLisandro Dalcin + options - options database, use NULL for default global database 2466*2d747510SLisandro Dalcin . pre - string to prepend to each name or NULL 2467*2d747510SLisandro Dalcin . name - the option one is seeking 2468*2d747510SLisandro Dalcin - nmax - maximum number of values to retrieve 2469*2d747510SLisandro Dalcin 2470*2d747510SLisandro Dalcin Output Parameter: 2471*2d747510SLisandro Dalcin + ivalue - the integer values to return 2472*2d747510SLisandro Dalcin . nmax - actual number of values retreived 2473*2d747510SLisandro Dalcin - set - PETSC_TRUE if found, else PETSC_FALSE 2474*2d747510SLisandro Dalcin 2475*2d747510SLisandro Dalcin Level: beginner 2476*2d747510SLisandro Dalcin 2477*2d747510SLisandro Dalcin Notes: 2478*2d747510SLisandro Dalcin The array can be passed as 2479*2d747510SLisandro Dalcin a comma separated list: 0,1,2,3,4,5,6,7 2480*2d747510SLisandro Dalcin a range (start-end+1): 0-8 2481*2d747510SLisandro Dalcin a range with given increment (start-end+1:inc): 0-7:2 2482*2d747510SLisandro Dalcin a combination of values and ranges separated by commas: 0,1-8,8-15:2 2483*2d747510SLisandro Dalcin 2484*2d747510SLisandro Dalcin There must be no intervening spaces between the values. 2485*2d747510SLisandro Dalcin 2486*2d747510SLisandro Dalcin Concepts: options database^array of ints 2487*2d747510SLisandro Dalcin 2488*2d747510SLisandro Dalcin .seealso: PetscOptionsGetInt(), PetscOptionsHasName(), 2489*2d747510SLisandro Dalcin PetscOptionsGetString(), PetscOptionsGetRealArray(), PetscOptionsBool(), 2490*2d747510SLisandro Dalcin PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 2491*2d747510SLisandro Dalcin PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 2492*2d747510SLisandro Dalcin PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 2493*2d747510SLisandro Dalcin PetscOptionsFList(), PetscOptionsEList() 2494*2d747510SLisandro Dalcin @*/ 2495*2d747510SLisandro Dalcin PetscErrorCode PetscOptionsGetIntArray(PetscOptions options,const char pre[],const char name[],PetscInt ivalue[],PetscInt *nmax,PetscBool *set) 2496*2d747510SLisandro Dalcin { 2497*2d747510SLisandro Dalcin const char *svalue; 2498*2d747510SLisandro Dalcin char *value; 2499*2d747510SLisandro Dalcin PetscErrorCode ierr; 2500*2d747510SLisandro Dalcin PetscInt n = 0,i,j,start,end,inc,nvalues; 2501*2d747510SLisandro Dalcin size_t len; 2502*2d747510SLisandro Dalcin PetscBool flag,foundrange; 2503*2d747510SLisandro Dalcin PetscToken token; 2504*2d747510SLisandro Dalcin 2505*2d747510SLisandro Dalcin PetscFunctionBegin; 2506*2d747510SLisandro Dalcin PetscValidCharPointer(name,3); 2507*2d747510SLisandro Dalcin PetscValidIntPointer(ivalue,4); 2508*2d747510SLisandro Dalcin PetscValidIntPointer(nmax,5); 2509*2d747510SLisandro Dalcin 2510*2d747510SLisandro Dalcin ierr = PetscOptionsFindPair(options,pre,name,&svalue,&flag);CHKERRQ(ierr); 2511*2d747510SLisandro Dalcin if (!flag || !svalue) { if (set) *set = PETSC_FALSE; *nmax = 0; PetscFunctionReturn(0);} 2512*2d747510SLisandro Dalcin if (set) *set = PETSC_TRUE; 2513*2d747510SLisandro Dalcin ierr = PetscTokenCreate(svalue,',',&token);CHKERRQ(ierr); 2514*2d747510SLisandro Dalcin ierr = PetscTokenFind(token,&value);CHKERRQ(ierr); 2515*2d747510SLisandro Dalcin while (value && n < *nmax) { 2516*2d747510SLisandro Dalcin /* look for form d-D where d and D are integers */ 2517*2d747510SLisandro Dalcin foundrange = PETSC_FALSE; 2518*2d747510SLisandro Dalcin ierr = PetscStrlen(value,&len);CHKERRQ(ierr); 2519*2d747510SLisandro Dalcin if (value[0] == '-') i=2; 2520*2d747510SLisandro Dalcin else i=1; 2521*2d747510SLisandro Dalcin for (;i<(int)len; i++) { 2522*2d747510SLisandro Dalcin if (value[i] == '-') { 2523*2d747510SLisandro Dalcin if (i == (int)len-1) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_USER,"Error in %D-th array entry %s\n",n,value); 2524*2d747510SLisandro Dalcin value[i] = 0; 2525*2d747510SLisandro Dalcin 2526*2d747510SLisandro Dalcin ierr = PetscOptionsStringToInt(value,&start);CHKERRQ(ierr); 2527*2d747510SLisandro Dalcin inc = 1; 2528*2d747510SLisandro Dalcin j = i+1; 2529*2d747510SLisandro Dalcin for (;j<(int)len; j++) { 2530*2d747510SLisandro Dalcin if (value[j] == ':') { 2531*2d747510SLisandro Dalcin value[j] = 0; 2532*2d747510SLisandro Dalcin 2533*2d747510SLisandro Dalcin ierr = PetscOptionsStringToInt(value+j+1,&inc);CHKERRQ(ierr); 2534*2d747510SLisandro 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); 2535*2d747510SLisandro Dalcin break; 2536*2d747510SLisandro Dalcin } 2537*2d747510SLisandro Dalcin } 2538*2d747510SLisandro Dalcin ierr = PetscOptionsStringToInt(value+i+1,&end);CHKERRQ(ierr); 2539*2d747510SLisandro 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); 2540*2d747510SLisandro Dalcin nvalues = (end-start)/inc + (end-start)%inc; 2541*2d747510SLisandro 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); 2542*2d747510SLisandro Dalcin for (;start<end; start+=inc) { 2543*2d747510SLisandro Dalcin *ivalue = start; ivalue++;n++; 2544*2d747510SLisandro Dalcin } 2545*2d747510SLisandro Dalcin foundrange = PETSC_TRUE; 2546*2d747510SLisandro Dalcin break; 2547*2d747510SLisandro Dalcin } 2548*2d747510SLisandro Dalcin } 2549*2d747510SLisandro Dalcin if (!foundrange) { 2550*2d747510SLisandro Dalcin ierr = PetscOptionsStringToInt(value,ivalue);CHKERRQ(ierr); 2551*2d747510SLisandro Dalcin ivalue++; 2552*2d747510SLisandro Dalcin n++; 2553*2d747510SLisandro Dalcin } 2554*2d747510SLisandro Dalcin ierr = PetscTokenFind(token,&value);CHKERRQ(ierr); 2555*2d747510SLisandro Dalcin } 2556*2d747510SLisandro Dalcin ierr = PetscTokenDestroy(&token);CHKERRQ(ierr); 2557*2d747510SLisandro Dalcin *nmax = n; 2558*2d747510SLisandro Dalcin PetscFunctionReturn(0); 2559*2d747510SLisandro Dalcin } 2560*2d747510SLisandro Dalcin 2561*2d747510SLisandro Dalcin /*@C 2562*2d747510SLisandro Dalcin PetscOptionsGetRealArray - Gets an array of double precision values for a 2563*2d747510SLisandro Dalcin particular option in the database. The values must be separated with 2564*2d747510SLisandro Dalcin commas with no intervening spaces. 2565*2d747510SLisandro Dalcin 2566*2d747510SLisandro Dalcin Not Collective 2567*2d747510SLisandro Dalcin 2568*2d747510SLisandro Dalcin Input Parameters: 2569*2d747510SLisandro Dalcin + options - options database, use NULL for default global database 2570*2d747510SLisandro Dalcin . pre - string to prepend to each name or NULL 2571*2d747510SLisandro Dalcin . name - the option one is seeking 2572*2d747510SLisandro Dalcin - nmax - maximum number of values to retrieve 2573*2d747510SLisandro Dalcin 2574*2d747510SLisandro Dalcin Output Parameters: 2575*2d747510SLisandro Dalcin + dvalue - the double values to return 2576*2d747510SLisandro Dalcin . nmax - actual number of values retreived 2577*2d747510SLisandro Dalcin - set - PETSC_TRUE if found, else PETSC_FALSE 2578*2d747510SLisandro Dalcin 2579*2d747510SLisandro Dalcin Level: beginner 2580*2d747510SLisandro Dalcin 2581*2d747510SLisandro Dalcin Concepts: options database^array of doubles 2582*2d747510SLisandro Dalcin 2583*2d747510SLisandro Dalcin .seealso: PetscOptionsGetInt(), PetscOptionsHasName(), 2584*2d747510SLisandro Dalcin PetscOptionsGetString(), PetscOptionsGetIntArray(), PetscOptionsBool(), 2585*2d747510SLisandro Dalcin PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 2586*2d747510SLisandro Dalcin PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 2587*2d747510SLisandro Dalcin PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 2588*2d747510SLisandro Dalcin PetscOptionsFList(), PetscOptionsEList() 2589*2d747510SLisandro Dalcin @*/ 2590*2d747510SLisandro Dalcin PetscErrorCode PetscOptionsGetRealArray(PetscOptions options,const char pre[],const char name[],PetscReal dvalue[],PetscInt *nmax,PetscBool *set) 2591*2d747510SLisandro Dalcin { 2592*2d747510SLisandro Dalcin const char *svalue; 2593*2d747510SLisandro Dalcin char *value; 2594*2d747510SLisandro Dalcin PetscErrorCode ierr; 2595*2d747510SLisandro Dalcin PetscInt n = 0; 2596*2d747510SLisandro Dalcin PetscBool flag; 2597*2d747510SLisandro Dalcin PetscToken token; 2598*2d747510SLisandro Dalcin 2599*2d747510SLisandro Dalcin PetscFunctionBegin; 2600*2d747510SLisandro Dalcin PetscValidCharPointer(name,3); 2601*2d747510SLisandro Dalcin PetscValidRealPointer(dvalue,4); 2602*2d747510SLisandro Dalcin PetscValidIntPointer(nmax,5); 2603*2d747510SLisandro Dalcin 2604*2d747510SLisandro Dalcin ierr = PetscOptionsFindPair(options,pre,name,&svalue,&flag);CHKERRQ(ierr); 2605*2d747510SLisandro Dalcin if (!flag || !svalue) { if (set) *set = PETSC_FALSE; *nmax = 0; PetscFunctionReturn(0);} 2606*2d747510SLisandro Dalcin if (set) *set = PETSC_TRUE; 2607*2d747510SLisandro Dalcin ierr = PetscTokenCreate(svalue,',',&token);CHKERRQ(ierr); 2608*2d747510SLisandro Dalcin ierr = PetscTokenFind(token,&value);CHKERRQ(ierr); 2609*2d747510SLisandro Dalcin while (value && n < *nmax) { 2610*2d747510SLisandro Dalcin ierr = PetscOptionsStringToReal(value,dvalue++);CHKERRQ(ierr); 2611*2d747510SLisandro Dalcin ierr = PetscTokenFind(token,&value);CHKERRQ(ierr); 2612*2d747510SLisandro Dalcin n++; 2613*2d747510SLisandro Dalcin } 2614*2d747510SLisandro Dalcin ierr = PetscTokenDestroy(&token);CHKERRQ(ierr); 2615*2d747510SLisandro Dalcin *nmax = n; 2616*2d747510SLisandro Dalcin PetscFunctionReturn(0); 2617*2d747510SLisandro Dalcin } 2618*2d747510SLisandro Dalcin 2619*2d747510SLisandro Dalcin /*@C 2620*2d747510SLisandro Dalcin PetscOptionsGetScalarArray - Gets an array of scalars for a 2621*2d747510SLisandro Dalcin particular option in the database. The values must be separated with 2622*2d747510SLisandro Dalcin commas with no intervening spaces. 2623*2d747510SLisandro Dalcin 2624*2d747510SLisandro Dalcin Not Collective 2625*2d747510SLisandro Dalcin 2626*2d747510SLisandro Dalcin Input Parameters: 2627*2d747510SLisandro Dalcin + options - options database, use NULL for default global database 2628*2d747510SLisandro Dalcin . pre - string to prepend to each name or NULL 2629*2d747510SLisandro Dalcin . name - the option one is seeking 2630*2d747510SLisandro Dalcin - nmax - maximum number of values to retrieve 2631*2d747510SLisandro Dalcin 2632*2d747510SLisandro Dalcin Output Parameters: 2633*2d747510SLisandro Dalcin + dvalue - the scalar values to return 2634*2d747510SLisandro Dalcin . nmax - actual number of values retreived 2635*2d747510SLisandro Dalcin - set - PETSC_TRUE if found, else PETSC_FALSE 2636*2d747510SLisandro Dalcin 2637*2d747510SLisandro Dalcin Level: beginner 2638*2d747510SLisandro Dalcin 2639*2d747510SLisandro Dalcin Concepts: options database^array of doubles 2640*2d747510SLisandro Dalcin 2641*2d747510SLisandro Dalcin .seealso: PetscOptionsGetInt(), PetscOptionsHasName(), 2642*2d747510SLisandro Dalcin PetscOptionsGetString(), PetscOptionsGetIntArray(), PetscOptionsBool(), 2643*2d747510SLisandro Dalcin PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 2644*2d747510SLisandro Dalcin PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 2645*2d747510SLisandro Dalcin PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 2646*2d747510SLisandro Dalcin PetscOptionsFList(), PetscOptionsEList() 2647*2d747510SLisandro Dalcin @*/ 2648*2d747510SLisandro Dalcin PetscErrorCode PetscOptionsGetScalarArray(PetscOptions options,const char pre[],const char name[],PetscScalar dvalue[],PetscInt *nmax,PetscBool *set) 2649*2d747510SLisandro Dalcin { 2650*2d747510SLisandro Dalcin const char *svalue; 2651*2d747510SLisandro Dalcin char *value; 2652*2d747510SLisandro Dalcin PetscErrorCode ierr; 2653*2d747510SLisandro Dalcin PetscInt n = 0; 2654*2d747510SLisandro Dalcin PetscBool flag; 2655*2d747510SLisandro Dalcin PetscToken token; 2656*2d747510SLisandro Dalcin 2657*2d747510SLisandro Dalcin PetscFunctionBegin; 2658*2d747510SLisandro Dalcin PetscValidCharPointer(name,3); 2659*2d747510SLisandro Dalcin PetscValidRealPointer(dvalue,4); 2660*2d747510SLisandro Dalcin PetscValidIntPointer(nmax,5); 2661*2d747510SLisandro Dalcin 2662*2d747510SLisandro Dalcin ierr = PetscOptionsFindPair(options,pre,name,&svalue,&flag);CHKERRQ(ierr); 2663*2d747510SLisandro Dalcin if (!flag || !svalue) { if (set) *set = PETSC_FALSE; *nmax = 0; PetscFunctionReturn(0);} 2664*2d747510SLisandro Dalcin if (set) *set = PETSC_TRUE; 2665*2d747510SLisandro Dalcin ierr = PetscTokenCreate(svalue,',',&token);CHKERRQ(ierr); 2666*2d747510SLisandro Dalcin ierr = PetscTokenFind(token,&value);CHKERRQ(ierr); 2667*2d747510SLisandro Dalcin while (value && n < *nmax) { 2668*2d747510SLisandro Dalcin ierr = PetscOptionsStringToScalar(value,dvalue++);CHKERRQ(ierr); 2669*2d747510SLisandro Dalcin ierr = PetscTokenFind(token,&value);CHKERRQ(ierr); 2670*2d747510SLisandro Dalcin n++; 2671*2d747510SLisandro Dalcin } 2672*2d747510SLisandro Dalcin ierr = PetscTokenDestroy(&token);CHKERRQ(ierr); 2673*2d747510SLisandro Dalcin *nmax = n; 2674*2d747510SLisandro Dalcin PetscFunctionReturn(0); 2675*2d747510SLisandro Dalcin } 267614ce751eSBarry Smith 2677e5c89e4eSSatish Balay /*@C 2678e5c89e4eSSatish Balay PetscOptionsGetStringArray - Gets an array of string values for a particular 2679e5c89e4eSSatish Balay option in the database. The values must be separated with commas with 2680e5c89e4eSSatish Balay no intervening spaces. 2681e5c89e4eSSatish Balay 2682e5c89e4eSSatish Balay Not Collective 2683e5c89e4eSSatish Balay 2684e5c89e4eSSatish Balay Input Parameters: 26855c9cc608SHong Zhang + options - options database, use NULL for default global database 2686c5929fdfSBarry Smith . pre - string to prepend to name or NULL 2687e5c89e4eSSatish Balay . name - the option one is seeking 2688e5c89e4eSSatish Balay - nmax - maximum number of strings 2689e5c89e4eSSatish Balay 2690e5c89e4eSSatish Balay Output Parameter: 2691e5c89e4eSSatish Balay + strings - location to copy strings 269296ef3cdfSSatish Balay - set - PETSC_TRUE if found, else PETSC_FALSE 2693e5c89e4eSSatish Balay 2694e5c89e4eSSatish Balay Level: beginner 2695e5c89e4eSSatish Balay 2696e5c89e4eSSatish Balay Notes: 2697e5c89e4eSSatish Balay The user should pass in an array of pointers to char, to hold all the 2698e5c89e4eSSatish Balay strings returned by this function. 2699e5c89e4eSSatish Balay 2700e5c89e4eSSatish Balay The user is responsible for deallocating the strings that are 2701e5c89e4eSSatish Balay returned. The Fortran interface for this routine is not supported. 2702e5c89e4eSSatish Balay 2703e5c89e4eSSatish Balay Contributed by Matthew Knepley. 2704e5c89e4eSSatish Balay 2705e5c89e4eSSatish Balay Concepts: options database^array of strings 2706e5c89e4eSSatish Balay 2707e5c89e4eSSatish Balay .seealso: PetscOptionsGetInt(), PetscOptionsGetReal(), 2708acfcf0e5SJed Brown PetscOptionsHasName(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool(), 2709e5c89e4eSSatish Balay PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 2710e5c89e4eSSatish Balay PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 2711acfcf0e5SJed Brown PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 2712a264d7a6SBarry Smith PetscOptionsFList(), PetscOptionsEList() 2713e5c89e4eSSatish Balay @*/ 2714c5929fdfSBarry Smith PetscErrorCode PetscOptionsGetStringArray(PetscOptions options,const char pre[],const char name[],char *strings[],PetscInt *nmax,PetscBool *set) 2715e5c89e4eSSatish Balay { 2716*2d747510SLisandro Dalcin const char *svalue; 2717e5c89e4eSSatish Balay char *value; 2718e5c89e4eSSatish Balay PetscErrorCode ierr; 2719*2d747510SLisandro Dalcin PetscInt n = 0; 2720ace3abfcSBarry Smith PetscBool flag; 27219c9d3cfdSBarry Smith PetscToken token; 2722e5c89e4eSSatish Balay 2723e5c89e4eSSatish Balay PetscFunctionBegin; 2724*2d747510SLisandro Dalcin PetscValidCharPointer(name,3); 2725*2d747510SLisandro Dalcin PetscValidPointer(strings,4); 2726*2d747510SLisandro Dalcin PetscValidIntPointer(nmax,5); 2727e5c89e4eSSatish Balay 2728*2d747510SLisandro Dalcin ierr = PetscOptionsFindPair(options,pre,name,&svalue,&flag);CHKERRQ(ierr); 2729*2d747510SLisandro Dalcin if (!flag || !svalue) { if (set) *set = PETSC_FALSE; *nmax = 0; PetscFunctionReturn(0);} 2730*2d747510SLisandro Dalcin if (set) *set = PETSC_TRUE; 2731*2d747510SLisandro Dalcin ierr = PetscTokenCreate(svalue,',',&token);CHKERRQ(ierr); 2732e5c89e4eSSatish Balay ierr = PetscTokenFind(token,&value);CHKERRQ(ierr); 2733*2d747510SLisandro Dalcin while (value && n < *nmax) { 2734e5c89e4eSSatish Balay ierr = PetscStrallocpy(value,&strings[n]);CHKERRQ(ierr); 2735e5c89e4eSSatish Balay ierr = PetscTokenFind(token,&value);CHKERRQ(ierr); 2736e5c89e4eSSatish Balay n++; 2737e5c89e4eSSatish Balay } 27388c74ee41SBarry Smith ierr = PetscTokenDestroy(&token);CHKERRQ(ierr); 2739e5c89e4eSSatish Balay *nmax = n; 2740e5c89e4eSSatish Balay PetscFunctionReturn(0); 2741e5c89e4eSSatish Balay } 2742