xref: /petsc/src/sys/objects/aoptions.c (revision e3f729a51b5fedb1b0abeaada1fb20d38962f778)
17d0a6c19SBarry Smith 
21a1499c8SBarry Smith 
353acd3b1SBarry Smith /*
43fc1eb6aSBarry Smith    Implements the higher-level options database querying methods. These are self-documenting and can attach at runtime to
53fc1eb6aSBarry Smith    GUI code to display the options and get values from the users.
653acd3b1SBarry Smith 
753acd3b1SBarry Smith */
853acd3b1SBarry Smith 
9af0996ceSBarry Smith #include <petsc/private/petscimpl.h>        /*I  "petscsys.h"   I*/
10665c2dedSJed Brown #include <petscviewer.h>
1153acd3b1SBarry Smith 
122aa6d131SJed Brown #define ManSection(str) ((str) ? (str) : "None")
132aa6d131SJed Brown 
1453acd3b1SBarry Smith /*
1553acd3b1SBarry Smith     Keep a linked list of options that have been posted and we are waiting for
163fc1eb6aSBarry Smith    user selection. See the manual page for PetscOptionsBegin()
1753acd3b1SBarry Smith 
1853acd3b1SBarry Smith     Eventually we'll attach this beast to a MPI_Comm
1953acd3b1SBarry Smith */
20e55864a3SBarry Smith 
2153acd3b1SBarry Smith 
2253acd3b1SBarry Smith #undef __FUNCT__
2353acd3b1SBarry Smith #define __FUNCT__ "PetscOptionsBegin_Private"
2453acd3b1SBarry Smith /*
2553acd3b1SBarry Smith     Handles setting up the data structure in a call to PetscOptionsBegin()
2653acd3b1SBarry Smith */
274416b707SBarry Smith PetscErrorCode PetscOptionsBegin_Private(PetscOptionItems *PetscOptionsObject,MPI_Comm comm,const char prefix[],const char title[],const char mansec[])
2853acd3b1SBarry Smith {
2953acd3b1SBarry Smith   PetscErrorCode ierr;
3053acd3b1SBarry Smith 
3153acd3b1SBarry Smith   PetscFunctionBegin;
320eb63584SBarry Smith   if (!PetscOptionsObject->alreadyprinted) {
339de0f6ecSBarry Smith     if (!PetscOptionsHelpPrintedSingleton) {
349de0f6ecSBarry Smith       ierr = PetscOptionsHelpPrintedCreate(&PetscOptionsHelpPrintedSingleton);CHKERRQ(ierr);
359de0f6ecSBarry Smith     }
369de0f6ecSBarry Smith     ierr = PetscOptionsHelpPrintedCheck(PetscOptionsHelpPrintedSingleton,prefix,title,&PetscOptionsObject->alreadyprinted);CHKERRQ(ierr);
370eb63584SBarry Smith   }
38e55864a3SBarry Smith   PetscOptionsObject->next          = 0;
39e55864a3SBarry Smith   PetscOptionsObject->comm          = comm;
40e55864a3SBarry Smith   PetscOptionsObject->changedmethod = PETSC_FALSE;
41a297a907SKarl Rupp 
42e55864a3SBarry Smith   ierr = PetscStrallocpy(prefix,&PetscOptionsObject->prefix);CHKERRQ(ierr);
43e55864a3SBarry Smith   ierr = PetscStrallocpy(title,&PetscOptionsObject->title);CHKERRQ(ierr);
4453acd3b1SBarry Smith 
45c5929fdfSBarry Smith   ierr = PetscOptionsHasName(PetscOptionsObject->options,NULL,"-help",&PetscOptionsObject->printhelp);CHKERRQ(ierr);
46e55864a3SBarry Smith   if (PetscOptionsObject->printhelp && PetscOptionsObject->count == 1) {
47e55864a3SBarry Smith     if (!PetscOptionsObject->alreadyprinted) {
4853acd3b1SBarry Smith       ierr = (*PetscHelpPrintf)(comm,"%s -------------------------------------------------\n",title);CHKERRQ(ierr);
4953acd3b1SBarry Smith     }
5061b37b28SSatish Balay   }
5153acd3b1SBarry Smith   PetscFunctionReturn(0);
5253acd3b1SBarry Smith }
5353acd3b1SBarry Smith 
543194b578SJed Brown #undef __FUNCT__
553194b578SJed Brown #define __FUNCT__ "PetscObjectOptionsBegin_Private"
563194b578SJed Brown /*
573194b578SJed Brown     Handles setting up the data structure in a call to PetscObjectOptionsBegin()
583194b578SJed Brown */
594416b707SBarry Smith PetscErrorCode PetscObjectOptionsBegin_Private(PetscOptionItems *PetscOptionsObject,PetscObject obj)
603194b578SJed Brown {
613194b578SJed Brown   PetscErrorCode ierr;
623194b578SJed Brown   char           title[256];
633194b578SJed Brown   PetscBool      flg;
643194b578SJed Brown 
653194b578SJed Brown   PetscFunctionBegin;
663194b578SJed Brown   PetscValidHeader(obj,1);
67e55864a3SBarry Smith   PetscOptionsObject->object         = obj;
68e55864a3SBarry Smith   PetscOptionsObject->alreadyprinted = obj->optionsprinted;
69a297a907SKarl Rupp 
703194b578SJed Brown   ierr = PetscStrcmp(obj->description,obj->class_name,&flg);CHKERRQ(ierr);
713194b578SJed Brown   if (flg) {
728caf3d72SBarry Smith     ierr = PetscSNPrintf(title,sizeof(title),"%s options",obj->class_name);CHKERRQ(ierr);
733194b578SJed Brown   } else {
748caf3d72SBarry Smith     ierr = PetscSNPrintf(title,sizeof(title),"%s (%s) options",obj->description,obj->class_name);CHKERRQ(ierr);
753194b578SJed Brown   }
76e55864a3SBarry Smith   ierr = PetscOptionsBegin_Private(PetscOptionsObject,obj->comm,obj->prefix,title,obj->mansec);CHKERRQ(ierr);
773194b578SJed Brown   PetscFunctionReturn(0);
783194b578SJed Brown }
793194b578SJed Brown 
8053acd3b1SBarry Smith /*
8153acd3b1SBarry Smith      Handles adding another option to the list of options within this particular PetscOptionsBegin() PetscOptionsEnd()
8253acd3b1SBarry Smith */
8353acd3b1SBarry Smith #undef __FUNCT__
848a19d54fSBarry Smith #define __FUNCT__ "PetscOptionItemCreate_Private"
854416b707SBarry Smith static int PetscOptionItemCreate_Private(PetscOptionItems *PetscOptionsObject,const char opt[],const char text[],const char man[],PetscOptionType t,PetscOptionItem *amsopt)
8653acd3b1SBarry Smith {
8753acd3b1SBarry Smith   int             ierr;
884416b707SBarry Smith   PetscOptionItem next;
893be6e4c3SJed Brown   PetscBool       valid;
9053acd3b1SBarry Smith 
9153acd3b1SBarry Smith   PetscFunctionBegin;
923be6e4c3SJed Brown   ierr = PetscOptionsValidKey(opt,&valid);CHKERRQ(ierr);
933be6e4c3SJed Brown   if (!valid) SETERRQ1(PETSC_COMM_WORLD,PETSC_ERR_ARG_INCOMP,"The option '%s' is not a valid key",opt);
943be6e4c3SJed Brown 
95b00a9115SJed Brown   ierr            = PetscNew(amsopt);CHKERRQ(ierr);
9653acd3b1SBarry Smith   (*amsopt)->next = 0;
9753acd3b1SBarry Smith   (*amsopt)->set  = PETSC_FALSE;
986356e834SBarry Smith   (*amsopt)->type = t;
9953acd3b1SBarry Smith   (*amsopt)->data = 0;
10061b37b28SSatish Balay 
10153acd3b1SBarry Smith   ierr = PetscStrallocpy(text,&(*amsopt)->text);CHKERRQ(ierr);
10253acd3b1SBarry Smith   ierr = PetscStrallocpy(opt,&(*amsopt)->option);CHKERRQ(ierr);
1036356e834SBarry Smith   ierr = PetscStrallocpy(man,&(*amsopt)->man);CHKERRQ(ierr);
10453acd3b1SBarry Smith 
105e55864a3SBarry Smith   if (!PetscOptionsObject->next) PetscOptionsObject->next = *amsopt;
106a297a907SKarl Rupp   else {
107e55864a3SBarry Smith     next = PetscOptionsObject->next;
10853acd3b1SBarry Smith     while (next->next) next = next->next;
10953acd3b1SBarry Smith     next->next = *amsopt;
11053acd3b1SBarry Smith   }
11153acd3b1SBarry Smith   PetscFunctionReturn(0);
11253acd3b1SBarry Smith }
11353acd3b1SBarry Smith 
11453acd3b1SBarry Smith #undef __FUNCT__
115aee2cecaSBarry Smith #define __FUNCT__ "PetscScanString"
116aee2cecaSBarry Smith /*
1173fc1eb6aSBarry Smith     PetscScanString -  Gets user input via stdin from process and broadcasts to all processes
1183fc1eb6aSBarry Smith 
1193fc1eb6aSBarry Smith     Collective on MPI_Comm
1203fc1eb6aSBarry Smith 
1213fc1eb6aSBarry Smith    Input Parameters:
1223fc1eb6aSBarry Smith +     commm - communicator for the broadcast, must be PETSC_COMM_WORLD
1233fc1eb6aSBarry Smith .     n - length of the string, must be the same on all processes
1243fc1eb6aSBarry Smith -     str - location to store input
125aee2cecaSBarry Smith 
126aee2cecaSBarry Smith     Bugs:
127aee2cecaSBarry Smith .   Assumes process 0 of the given communicator has access to stdin
128aee2cecaSBarry Smith 
129aee2cecaSBarry Smith */
1303fc1eb6aSBarry Smith static PetscErrorCode PetscScanString(MPI_Comm comm,size_t n,char str[])
131aee2cecaSBarry Smith {
132330cf3c9SBarry Smith   size_t         i;
133aee2cecaSBarry Smith   char           c;
1343fc1eb6aSBarry Smith   PetscMPIInt    rank,nm;
135aee2cecaSBarry Smith   PetscErrorCode ierr;
136aee2cecaSBarry Smith 
137aee2cecaSBarry Smith   PetscFunctionBegin;
138aee2cecaSBarry Smith   ierr = MPI_Comm_rank(comm,&rank);CHKERRQ(ierr);
139aee2cecaSBarry Smith   if (!rank) {
140aee2cecaSBarry Smith     c = (char) getchar();
141aee2cecaSBarry Smith     i = 0;
142aee2cecaSBarry Smith     while (c != '\n' && i < n-1) {
143aee2cecaSBarry Smith       str[i++] = c;
144aee2cecaSBarry Smith       c = (char)getchar();
145aee2cecaSBarry Smith     }
146aee2cecaSBarry Smith     str[i] = 0;
147aee2cecaSBarry Smith   }
1484dc2109aSBarry Smith   ierr = PetscMPIIntCast(n,&nm);CHKERRQ(ierr);
1493fc1eb6aSBarry Smith   ierr = MPI_Bcast(str,nm,MPI_CHAR,0,comm);CHKERRQ(ierr);
150aee2cecaSBarry Smith   PetscFunctionReturn(0);
151aee2cecaSBarry Smith }
152aee2cecaSBarry Smith 
153ead66b60SBarry Smith #undef __FUNCT__
154ead66b60SBarry Smith #define __FUNCT__ "PetscStrdup"
1555b02f95dSBarry Smith /*
1565b02f95dSBarry Smith     This is needed because certain strings may be freed by SAWs, hence we cannot use PetscStrallocpy()
1575b02f95dSBarry Smith */
1585b02f95dSBarry Smith static PetscErrorCode  PetscStrdup(const char s[],char *t[])
1595b02f95dSBarry Smith {
1605b02f95dSBarry Smith   PetscErrorCode ierr;
1615b02f95dSBarry Smith   size_t         len;
1625b02f95dSBarry Smith   char           *tmp = 0;
1635b02f95dSBarry Smith 
1645b02f95dSBarry Smith   PetscFunctionBegin;
1655b02f95dSBarry Smith   if (s) {
1665b02f95dSBarry Smith     ierr = PetscStrlen(s,&len);CHKERRQ(ierr);
167f416af30SBarry Smith     tmp = (char*) malloc((len+1)*sizeof(char));
1685b02f95dSBarry Smith     if (!tmp) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_MEM,"No memory to duplicate string");
1695b02f95dSBarry Smith     ierr = PetscStrcpy(tmp,s);CHKERRQ(ierr);
1705b02f95dSBarry Smith   }
1715b02f95dSBarry Smith   *t = tmp;
1725b02f95dSBarry Smith   PetscFunctionReturn(0);
1735b02f95dSBarry Smith }
1745b02f95dSBarry Smith 
1755b02f95dSBarry Smith 
176aee2cecaSBarry Smith #undef __FUNCT__
177aee2cecaSBarry Smith #define __FUNCT__ "PetscOptionsGetFromTextInput"
178aee2cecaSBarry Smith /*
1793cc1e11dSBarry Smith     PetscOptionsGetFromTextInput - Presents all the PETSc Options processed by the program so the user may change them at runtime
180aee2cecaSBarry Smith 
181aee2cecaSBarry Smith     Notes: this isn't really practical, it is just to demonstrate the principle
182aee2cecaSBarry Smith 
1837781c08eSBarry Smith     A carriage return indicates no change from the default; but this like -ksp_monitor <stdout>  the default is actually not stdout the default
1847781c08eSBarry Smith     is to do nothing so to get it to use stdout you need to type stdout. This is kind of bug?
1857781c08eSBarry Smith 
186aee2cecaSBarry Smith     Bugs:
1877781c08eSBarry Smith +    All processes must traverse through the exact same set of option queries due to the call to PetscScanString()
1883cc1e11dSBarry Smith .    Internal strings have arbitrary length and string copies are not checked that they fit into string space
189aee2cecaSBarry Smith -    Only works for PetscInt == int, PetscReal == double etc
190aee2cecaSBarry Smith 
1913cc1e11dSBarry Smith     Developer Notes: Normally the GUI that presents the options the user and retrieves the values would be running in a different
1923cc1e11dSBarry Smith      address space and communicating with the PETSc program
1933cc1e11dSBarry Smith 
194aee2cecaSBarry Smith */
1954416b707SBarry Smith PetscErrorCode PetscOptionsGetFromTextInput(PetscOptionItems *PetscOptionsObject)
1966356e834SBarry Smith {
1976356e834SBarry Smith   PetscErrorCode  ierr;
1984416b707SBarry Smith   PetscOptionItem next = PetscOptionsObject->next;
1996356e834SBarry Smith   char            str[512];
2007781c08eSBarry Smith   PetscBool       bid;
201a4404d99SBarry Smith   PetscReal       ir,*valr;
202330cf3c9SBarry Smith   PetscInt        *vald;
203330cf3c9SBarry Smith   size_t          i;
2046356e834SBarry Smith 
2052a409bb0SBarry Smith   PetscFunctionBegin;
206e55864a3SBarry Smith   ierr = (*PetscPrintf)(PETSC_COMM_WORLD,"%s -------------------------------------------------\n",PetscOptionsObject->title);CHKERRQ(ierr);
2076356e834SBarry Smith   while (next) {
2086356e834SBarry Smith     switch (next->type) {
2096356e834SBarry Smith     case OPTION_HEAD:
2106356e834SBarry Smith       break;
211e26ddf31SBarry Smith     case OPTION_INT_ARRAY:
212e55864a3SBarry Smith       ierr = PetscPrintf(PETSC_COMM_WORLD,"-%s%s <",PetscOptionsObject->prefix ? PetscOptionsObject->prefix : "",next->option+1);CHKERRQ(ierr);
213e26ddf31SBarry Smith       vald = (PetscInt*) next->data;
214e26ddf31SBarry Smith       for (i=0; i<next->arraylength; i++) {
215e26ddf31SBarry Smith         ierr = PetscPrintf(PETSC_COMM_WORLD,"%d",vald[i]);CHKERRQ(ierr);
216e26ddf31SBarry Smith         if (i < next->arraylength-1) {
217e26ddf31SBarry Smith           ierr = PetscPrintf(PETSC_COMM_WORLD,",");CHKERRQ(ierr);
218e26ddf31SBarry Smith         }
219e26ddf31SBarry Smith       }
220e26ddf31SBarry Smith       ierr = PetscPrintf(PETSC_COMM_WORLD,">: %s (%s) ",next->text,next->man);CHKERRQ(ierr);
221e26ddf31SBarry Smith       ierr = PetscScanString(PETSC_COMM_WORLD,512,str);CHKERRQ(ierr);
222e26ddf31SBarry Smith       if (str[0]) {
223e26ddf31SBarry Smith         PetscToken token;
224e26ddf31SBarry Smith         PetscInt   n=0,nmax = next->arraylength,*dvalue = (PetscInt*)next->data,start,end;
225e26ddf31SBarry Smith         size_t     len;
226e26ddf31SBarry Smith         char       *value;
227ace3abfcSBarry Smith         PetscBool  foundrange;
228e26ddf31SBarry Smith 
229e26ddf31SBarry Smith         next->set = PETSC_TRUE;
230e26ddf31SBarry Smith         value     = str;
231e26ddf31SBarry Smith         ierr      = PetscTokenCreate(value,',',&token);CHKERRQ(ierr);
232e26ddf31SBarry Smith         ierr      = PetscTokenFind(token,&value);CHKERRQ(ierr);
233e26ddf31SBarry Smith         while (n < nmax) {
234e26ddf31SBarry Smith           if (!value) break;
235e26ddf31SBarry Smith 
236e26ddf31SBarry Smith           /* look for form  d-D where d and D are integers */
237e26ddf31SBarry Smith           foundrange = PETSC_FALSE;
238e26ddf31SBarry Smith           ierr       = PetscStrlen(value,&len);CHKERRQ(ierr);
239e26ddf31SBarry Smith           if (value[0] == '-') i=2;
240e26ddf31SBarry Smith           else i=1;
241330cf3c9SBarry Smith           for (;i<len; i++) {
242e26ddf31SBarry Smith             if (value[i] == '-') {
243e32f2f54SBarry Smith               if (i == len-1) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_USER,"Error in %D-th array entry %s\n",n,value);
244e26ddf31SBarry Smith               value[i] = 0;
245cfbddea1SSatish Balay               ierr     = PetscOptionsStringToInt(value,&start);CHKERRQ(ierr);
246cfbddea1SSatish Balay               ierr     = PetscOptionsStringToInt(value+i+1,&end);CHKERRQ(ierr);
247e32f2f54SBarry Smith               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);
248e32f2f54SBarry Smith               if (n + end - start - 1 >= nmax) SETERRQ4(PETSC_COMM_SELF,PETSC_ERR_USER,"Error in %D-th array entry, not enough space in left in array (%D) to contain entire range from %D to %D",n,nmax-n,start,end);
249e26ddf31SBarry Smith               for (; start<end; start++) {
250e26ddf31SBarry Smith                 *dvalue = start; dvalue++;n++;
251e26ddf31SBarry Smith               }
252e26ddf31SBarry Smith               foundrange = PETSC_TRUE;
253e26ddf31SBarry Smith               break;
254e26ddf31SBarry Smith             }
255e26ddf31SBarry Smith           }
256e26ddf31SBarry Smith           if (!foundrange) {
257cfbddea1SSatish Balay             ierr = PetscOptionsStringToInt(value,dvalue);CHKERRQ(ierr);
258e26ddf31SBarry Smith             dvalue++;
259e26ddf31SBarry Smith             n++;
260e26ddf31SBarry Smith           }
261e26ddf31SBarry Smith           ierr = PetscTokenFind(token,&value);CHKERRQ(ierr);
262e26ddf31SBarry Smith         }
2638c74ee41SBarry Smith         ierr = PetscTokenDestroy(&token);CHKERRQ(ierr);
264e26ddf31SBarry Smith       }
265e26ddf31SBarry Smith       break;
266e26ddf31SBarry Smith     case OPTION_REAL_ARRAY:
267e55864a3SBarry Smith       ierr = PetscPrintf(PETSC_COMM_WORLD,"-%s%s <",PetscOptionsObject->prefix ? PetscOptionsObject->prefix : "",next->option+1);CHKERRQ(ierr);
268e26ddf31SBarry Smith       valr = (PetscReal*) next->data;
269e26ddf31SBarry Smith       for (i=0; i<next->arraylength; i++) {
270e26ddf31SBarry Smith         ierr = PetscPrintf(PETSC_COMM_WORLD,"%g",valr[i]);CHKERRQ(ierr);
271e26ddf31SBarry Smith         if (i < next->arraylength-1) {
272e26ddf31SBarry Smith           ierr = PetscPrintf(PETSC_COMM_WORLD,",");CHKERRQ(ierr);
273e26ddf31SBarry Smith         }
274e26ddf31SBarry Smith       }
275e26ddf31SBarry Smith       ierr = PetscPrintf(PETSC_COMM_WORLD,">: %s (%s) ",next->text,next->man);CHKERRQ(ierr);
276e26ddf31SBarry Smith       ierr = PetscScanString(PETSC_COMM_WORLD,512,str);CHKERRQ(ierr);
277e26ddf31SBarry Smith       if (str[0]) {
278e26ddf31SBarry Smith         PetscToken token;
279e26ddf31SBarry Smith         PetscInt   n = 0,nmax = next->arraylength;
280e26ddf31SBarry Smith         PetscReal  *dvalue = (PetscReal*)next->data;
281e26ddf31SBarry Smith         char       *value;
282e26ddf31SBarry Smith 
283e26ddf31SBarry Smith         next->set = PETSC_TRUE;
284e26ddf31SBarry Smith         value     = str;
285e26ddf31SBarry Smith         ierr      = PetscTokenCreate(value,',',&token);CHKERRQ(ierr);
286e26ddf31SBarry Smith         ierr      = PetscTokenFind(token,&value);CHKERRQ(ierr);
287e26ddf31SBarry Smith         while (n < nmax) {
288e26ddf31SBarry Smith           if (!value) break;
289cfbddea1SSatish Balay           ierr = PetscOptionsStringToReal(value,dvalue);CHKERRQ(ierr);
290e26ddf31SBarry Smith           dvalue++;
291e26ddf31SBarry Smith           n++;
292e26ddf31SBarry Smith           ierr = PetscTokenFind(token,&value);CHKERRQ(ierr);
293e26ddf31SBarry Smith         }
2948c74ee41SBarry Smith         ierr = PetscTokenDestroy(&token);CHKERRQ(ierr);
295e26ddf31SBarry Smith       }
296e26ddf31SBarry Smith       break;
2976356e834SBarry Smith     case OPTION_INT:
298e55864a3SBarry Smith       ierr = PetscPrintf(PETSC_COMM_WORLD,"-%s%s <%d>: %s (%s) ",PetscOptionsObject->prefix ? PetscOptionsObject->prefix : "",next->option+1,*(int*)next->data,next->text,next->man);CHKERRQ(ierr);
2993fc1eb6aSBarry Smith       ierr = PetscScanString(PETSC_COMM_WORLD,512,str);CHKERRQ(ierr);
3003fc1eb6aSBarry Smith       if (str[0]) {
301d25d7f95SJed Brown #if defined(PETSC_SIZEOF_LONG_LONG)
302d25d7f95SJed Brown         long long lid;
303d25d7f95SJed Brown         sscanf(str,"%lld",&lid);
3041a1499c8SBarry Smith         if (lid > PETSC_MAX_INT || lid < PETSC_MIN_INT) SETERRQ3(PETSC_COMM_WORLD,PETSC_ERR_ARG_OUTOFRANGE,"Argument: -%s%s %lld",PetscOptionsObject->prefix ? PetscOptionsObject->prefix : "",next->option+1,lid);
305c272547aSJed Brown #else
306d25d7f95SJed Brown         long  lid;
307d25d7f95SJed Brown         sscanf(str,"%ld",&lid);
3081a1499c8SBarry Smith         if (lid > PETSC_MAX_INT || lid < PETSC_MIN_INT) SETERRQ3(PETSC_COMM_WORLD,PETSC_ERR_ARG_OUTOFRANGE,"Argument: -%s%s %ld",PetscOptionsObject->prefix ? PetscOptionsObject->prefix : "",next->option+1,lid);
309c272547aSJed Brown #endif
310a297a907SKarl Rupp 
311d25d7f95SJed Brown         next->set = PETSC_TRUE;
312d25d7f95SJed Brown         *((PetscInt*)next->data) = (PetscInt)lid;
313aee2cecaSBarry Smith       }
314aee2cecaSBarry Smith       break;
315aee2cecaSBarry Smith     case OPTION_REAL:
316e55864a3SBarry Smith       ierr = PetscPrintf(PETSC_COMM_WORLD,"-%s%s <%g>: %s (%s) ",PetscOptionsObject->prefix ? PetscOptionsObject->prefix : "",next->option+1,*(double*)next->data,next->text,next->man);CHKERRQ(ierr);
3173fc1eb6aSBarry Smith       ierr = PetscScanString(PETSC_COMM_WORLD,512,str);CHKERRQ(ierr);
3183fc1eb6aSBarry Smith       if (str[0]) {
319ce63c4c1SBarry Smith #if defined(PETSC_USE_REAL_SINGLE)
320a4404d99SBarry Smith         sscanf(str,"%e",&ir);
321ce63c4c1SBarry Smith #elif defined(PETSC_USE_REAL_DOUBLE)
322aee2cecaSBarry Smith         sscanf(str,"%le",&ir);
323ce63c4c1SBarry Smith #elif defined(PETSC_USE_REAL___FLOAT128)
324d9822059SBarry Smith         ir = strtoflt128(str,0);
325d9822059SBarry Smith #else
326513dbe71SLisandro Dalcin         SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Unknown scalar type");
327a4404d99SBarry Smith #endif
328aee2cecaSBarry Smith         next->set                 = PETSC_TRUE;
329aee2cecaSBarry Smith         *((PetscReal*)next->data) = ir;
330aee2cecaSBarry Smith       }
331aee2cecaSBarry Smith       break;
3327781c08eSBarry Smith     case OPTION_BOOL:
33383355fc5SBarry Smith       ierr = PetscPrintf(PETSC_COMM_WORLD,"-%s%s <%s>: %s (%s) ",PetscOptionsObject->prefix ? PetscOptionsObject->prefix : "",next->option+1,*(PetscBool*)next->data ? "true": "false",next->text,next->man);CHKERRQ(ierr);
3347781c08eSBarry Smith       ierr = PetscScanString(PETSC_COMM_WORLD,512,str);CHKERRQ(ierr);
3357781c08eSBarry Smith       if (str[0]) {
3367781c08eSBarry Smith         ierr = PetscOptionsStringToBool(str,&bid);CHKERRQ(ierr);
3377781c08eSBarry Smith         next->set = PETSC_TRUE;
3387781c08eSBarry Smith         *((PetscBool*)next->data) = bid;
3397781c08eSBarry Smith       }
3407781c08eSBarry Smith       break;
341aee2cecaSBarry Smith     case OPTION_STRING:
342e55864a3SBarry Smith       ierr = PetscPrintf(PETSC_COMM_WORLD,"-%s%s <%s>: %s (%s) ",PetscOptionsObject->prefix ? PetscOptionsObject->prefix : "",next->option+1,(char*)next->data,next->text,next->man);CHKERRQ(ierr);
3433fc1eb6aSBarry Smith       ierr = PetscScanString(PETSC_COMM_WORLD,512,str);CHKERRQ(ierr);
3443fc1eb6aSBarry Smith       if (str[0]) {
345aee2cecaSBarry Smith         next->set = PETSC_TRUE;
34664facd6cSBarry Smith         /* must use system malloc since SAWs may free this */
3475b02f95dSBarry Smith         ierr = PetscStrdup(str,(char**)&next->data);CHKERRQ(ierr);
3486356e834SBarry Smith       }
3496356e834SBarry Smith       break;
350a264d7a6SBarry Smith     case OPTION_FLIST:
351e55864a3SBarry Smith       ierr = PetscFunctionListPrintTypes(PETSC_COMM_WORLD,stdout,PetscOptionsObject->prefix,next->option,next->text,next->man,next->flist,(char*)next->data);CHKERRQ(ierr);
3523cc1e11dSBarry Smith       ierr = PetscScanString(PETSC_COMM_WORLD,512,str);CHKERRQ(ierr);
3533cc1e11dSBarry Smith       if (str[0]) {
354e55864a3SBarry Smith         PetscOptionsObject->changedmethod = PETSC_TRUE;
3553cc1e11dSBarry Smith         next->set = PETSC_TRUE;
35664facd6cSBarry Smith         /* must use system malloc since SAWs may free this */
3575b02f95dSBarry Smith         ierr = PetscStrdup(str,(char**)&next->data);CHKERRQ(ierr);
3583cc1e11dSBarry Smith       }
3593cc1e11dSBarry Smith       break;
360b432afdaSMatthew Knepley     default:
361b432afdaSMatthew Knepley       break;
3626356e834SBarry Smith     }
3636356e834SBarry Smith     next = next->next;
3646356e834SBarry Smith   }
3656356e834SBarry Smith   PetscFunctionReturn(0);
3666356e834SBarry Smith }
3676356e834SBarry Smith 
368e04113cfSBarry Smith #if defined(PETSC_HAVE_SAWS)
369e04113cfSBarry Smith #include <petscviewersaws.h>
370d5649816SBarry Smith 
371d5649816SBarry Smith static int count = 0;
372d5649816SBarry Smith 
373b3506946SBarry Smith #undef __FUNCT__
374e04113cfSBarry Smith #define __FUNCT__ "PetscOptionsSAWsDestroy"
375e04113cfSBarry Smith PetscErrorCode PetscOptionsSAWsDestroy(void)
376d5649816SBarry Smith {
3772657e9d9SBarry Smith   PetscFunctionBegin;
378d5649816SBarry Smith   PetscFunctionReturn(0);
379d5649816SBarry Smith }
380d5649816SBarry Smith 
3819c1e0ce8SBarry Smith static const char *OptionsHeader = "<head>\n"
38223a1ff79SBarry Smith                                    "<script type=\"text/javascript\" src=\"http://www.mcs.anl.gov/research/projects/saws/js/jquery-1.9.1.js\"></script>\n"
38323a1ff79SBarry Smith                                    "<script type=\"text/javascript\" src=\"http://www.mcs.anl.gov/research/projects/saws/js/SAWs.js\"></script>\n"
384d1fc0251SBarry Smith                                    "<script type=\"text/javascript\" src=\"js/PETSc.js\"></script>\n"
38564bbc9efSBarry Smith                                    "<script>\n"
38664bbc9efSBarry Smith                                       "jQuery(document).ready(function() {\n"
38764bbc9efSBarry Smith                                          "PETSc.getAndDisplayDirectory(null,\"#variablesInfo\")\n"
38864bbc9efSBarry Smith                                       "})\n"
38964bbc9efSBarry Smith                                   "</script>\n"
39064bbc9efSBarry Smith                                   "</head>\n";
3911423471aSBarry Smith 
3921423471aSBarry Smith /*  Determines the size and style of the scroll region where PETSc options selectable from users are displayed */
3931423471aSBarry Smith static const char *OptionsBodyBottom = "<div id=\"variablesInfo\" style=\"background-color:lightblue;height:auto;max-height:500px;overflow:scroll;\"></div>\n<br>\n</body>";
39464bbc9efSBarry Smith 
395d5649816SBarry Smith #undef __FUNCT__
3967781c08eSBarry Smith #define __FUNCT__ "PetscOptionsSAWsInput"
397b3506946SBarry Smith /*
3987781c08eSBarry Smith     PetscOptionsSAWsInput - Presents all the PETSc Options processed by the program so the user may change them at runtime using the SAWs
399b3506946SBarry Smith 
400b3506946SBarry Smith     Bugs:
401b3506946SBarry Smith +    All processes must traverse through the exact same set of option queries do to the call to PetscScanString()
402b3506946SBarry Smith .    Internal strings have arbitrary length and string copies are not checked that they fit into string space
403b3506946SBarry Smith -    Only works for PetscInt == int, PetscReal == double etc
404b3506946SBarry Smith 
405b3506946SBarry Smith 
406b3506946SBarry Smith */
4074416b707SBarry Smith PetscErrorCode PetscOptionsSAWsInput(PetscOptionItems *PetscOptionsObject)
408b3506946SBarry Smith {
409b3506946SBarry Smith   PetscErrorCode  ierr;
4104416b707SBarry Smith   PetscOptionItem next     = PetscOptionsObject->next;
411d5649816SBarry Smith   static int      mancount = 0;
412b3506946SBarry Smith   char            options[16];
4137aab2a10SBarry Smith   PetscBool       changedmethod = PETSC_FALSE;
414a23eb982SSurtai Han   PetscBool       stopasking    = PETSC_FALSE;
41588a9752cSBarry Smith   char            manname[16],textname[16];
4162657e9d9SBarry Smith   char            dir[1024];
417b3506946SBarry Smith 
4182a409bb0SBarry Smith   PetscFunctionBegin;
419b3506946SBarry Smith   /* the next line is a bug, this will only work if all processors are here, the comm passed in is ignored!!! */
420b3506946SBarry Smith   sprintf(options,"Options_%d",count++);
421a297a907SKarl Rupp 
4227325c4a4SBarry Smith   PetscOptionsObject->pprefix = PetscOptionsObject->prefix; /* SAWs will change this, so cannot pass prefix directly */
4231bc75a8dSBarry Smith 
424d50831c4SBarry Smith   ierr = PetscSNPrintf(dir,1024,"/PETSc/Options/%s","_title");CHKERRQ(ierr);
42583355fc5SBarry Smith   PetscStackCallSAWs(SAWs_Register,(dir,&PetscOptionsObject->title,1,SAWs_READ,SAWs_STRING));
4267781c08eSBarry Smith   ierr = PetscSNPrintf(dir,1024,"/PETSc/Options/%s","prefix");CHKERRQ(ierr);
42783355fc5SBarry Smith   PetscStackCallSAWs(SAWs_Register,(dir,&PetscOptionsObject->pprefix,1,SAWs_READ,SAWs_STRING));
4282657e9d9SBarry Smith   PetscStackCallSAWs(SAWs_Register,("/PETSc/Options/ChangedMethod",&changedmethod,1,SAWs_WRITE,SAWs_BOOLEAN));
429a23eb982SSurtai Han   PetscStackCallSAWs(SAWs_Register,("/PETSc/Options/StopAsking",&stopasking,1,SAWs_WRITE,SAWs_BOOLEAN));
430b3506946SBarry Smith 
431b3506946SBarry Smith   while (next) {
432d50831c4SBarry Smith     sprintf(manname,"_man_%d",mancount);
4332657e9d9SBarry Smith     ierr = PetscSNPrintf(dir,1024,"/PETSc/Options/%s",manname);CHKERRQ(ierr);
4347781c08eSBarry Smith     PetscStackCallSAWs(SAWs_Register,(dir,&next->man,1,SAWs_READ,SAWs_STRING));
435d50831c4SBarry Smith     sprintf(textname,"_text_%d",mancount++);
4367781c08eSBarry Smith     ierr = PetscSNPrintf(dir,1024,"/PETSc/Options/%s",textname);CHKERRQ(ierr);
4377781c08eSBarry Smith     PetscStackCallSAWs(SAWs_Register,(dir,&next->text,1,SAWs_READ,SAWs_STRING));
4389f32e415SBarry Smith 
439b3506946SBarry Smith     switch (next->type) {
440b3506946SBarry Smith     case OPTION_HEAD:
441b3506946SBarry Smith       break;
442b3506946SBarry Smith     case OPTION_INT_ARRAY:
4437781c08eSBarry Smith     ierr = PetscSNPrintf(dir,1024,"/PETSc/Options/%s",next->option);CHKERRQ(ierr);
4442657e9d9SBarry Smith       PetscStackCallSAWs(SAWs_Register,(dir,next->data,next->arraylength,SAWs_WRITE,SAWs_INT));
445b3506946SBarry Smith       break;
446b3506946SBarry Smith     case OPTION_REAL_ARRAY:
4477781c08eSBarry Smith     ierr = PetscSNPrintf(dir,1024,"/PETSc/Options/%s",next->option);CHKERRQ(ierr);
4482657e9d9SBarry Smith       PetscStackCallSAWs(SAWs_Register,(dir,next->data,next->arraylength,SAWs_WRITE,SAWs_DOUBLE));
449b3506946SBarry Smith       break;
450b3506946SBarry Smith     case OPTION_INT:
4517781c08eSBarry Smith     ierr = PetscSNPrintf(dir,1024,"/PETSc/Options/%s",next->option);CHKERRQ(ierr);
4522657e9d9SBarry Smith       PetscStackCallSAWs(SAWs_Register,(dir,next->data,1,SAWs_WRITE,SAWs_INT));
453b3506946SBarry Smith       break;
454b3506946SBarry Smith     case OPTION_REAL:
4557781c08eSBarry Smith     ierr = PetscSNPrintf(dir,1024,"/PETSc/Options/%s",next->option);CHKERRQ(ierr);
4562657e9d9SBarry Smith       PetscStackCallSAWs(SAWs_Register,(dir,next->data,1,SAWs_WRITE,SAWs_DOUBLE));
457b3506946SBarry Smith       break;
4587781c08eSBarry Smith     case OPTION_BOOL:
4597781c08eSBarry Smith     ierr = PetscSNPrintf(dir,1024,"/PETSc/Options/%s",next->option);CHKERRQ(ierr);
4602657e9d9SBarry Smith       PetscStackCallSAWs(SAWs_Register,(dir,next->data,1,SAWs_WRITE,SAWs_BOOLEAN));
4611ae3d29cSBarry Smith       break;
4627781c08eSBarry Smith     case OPTION_BOOL_ARRAY:
4637781c08eSBarry Smith     ierr = PetscSNPrintf(dir,1024,"/PETSc/Options/%s",next->option);CHKERRQ(ierr);
4642657e9d9SBarry Smith       PetscStackCallSAWs(SAWs_Register,(dir,next->data,next->arraylength,SAWs_WRITE,SAWs_BOOLEAN));
46571f08665SBarry Smith       break;
466b3506946SBarry Smith     case OPTION_STRING:
4677781c08eSBarry Smith     ierr = PetscSNPrintf(dir,1024,"/PETSc/Options/%s",next->option);CHKERRQ(ierr);
4687781c08eSBarry Smith       PetscStackCallSAWs(SAWs_Register,(dir,&next->data,1,SAWs_WRITE,SAWs_STRING));
4691ae3d29cSBarry Smith       break;
4701ae3d29cSBarry Smith     case OPTION_STRING_ARRAY:
4717781c08eSBarry Smith     ierr = PetscSNPrintf(dir,1024,"/PETSc/Options/%s",next->option);CHKERRQ(ierr);
4722657e9d9SBarry Smith       PetscStackCallSAWs(SAWs_Register,(dir,next->data,next->arraylength,SAWs_WRITE,SAWs_STRING));
473b3506946SBarry Smith       break;
474a264d7a6SBarry Smith     case OPTION_FLIST:
475a264d7a6SBarry Smith       {
476a264d7a6SBarry Smith       PetscInt ntext;
4777781c08eSBarry Smith       ierr = PetscSNPrintf(dir,1024,"/PETSc/Options/%s",next->option);CHKERRQ(ierr);
4787781c08eSBarry Smith       PetscStackCallSAWs(SAWs_Register,(dir,&next->data,1,SAWs_WRITE,SAWs_STRING));
479a264d7a6SBarry Smith       ierr = PetscFunctionListGet(next->flist,(const char***)&next->edata,&ntext);CHKERRQ(ierr);
480a264d7a6SBarry Smith       PetscStackCallSAWs(SAWs_Set_Legal_Variable_Values,(dir,ntext,next->edata));
481a264d7a6SBarry Smith       }
482a264d7a6SBarry Smith       break;
4831ae3d29cSBarry Smith     case OPTION_ELIST:
484a264d7a6SBarry Smith       {
485a264d7a6SBarry Smith       PetscInt ntext = next->nlist;
4867781c08eSBarry Smith       ierr = PetscSNPrintf(dir,1024,"/PETSc/Options/%s",next->option);CHKERRQ(ierr);
4877781c08eSBarry Smith       PetscStackCallSAWs(SAWs_Register,(dir,&next->data,1,SAWs_WRITE,SAWs_STRING));
488ead66b60SBarry Smith       ierr = PetscMalloc1((ntext+1),(char***)&next->edata);CHKERRQ(ierr);
4891ae3d29cSBarry Smith       ierr = PetscMemcpy(next->edata,next->list,ntext*sizeof(char*));CHKERRQ(ierr);
490a264d7a6SBarry Smith       PetscStackCallSAWs(SAWs_Set_Legal_Variable_Values,(dir,ntext,next->edata));
491a264d7a6SBarry Smith       }
492a264d7a6SBarry Smith       break;
493b3506946SBarry Smith     default:
494b3506946SBarry Smith       break;
495b3506946SBarry Smith     }
496b3506946SBarry Smith     next = next->next;
497b3506946SBarry Smith   }
498b3506946SBarry Smith 
499b3506946SBarry Smith   /* wait until accessor has unlocked the memory */
50064bbc9efSBarry Smith   PetscStackCallSAWs(SAWs_Push_Header,("index.html",OptionsHeader));
50164bbc9efSBarry Smith   PetscStackCallSAWs(SAWs_Push_Body,("index.html",2,OptionsBodyBottom));
5027aab2a10SBarry Smith   ierr = PetscSAWsBlock();CHKERRQ(ierr);
50364bbc9efSBarry Smith   PetscStackCallSAWs(SAWs_Pop_Header,("index.html"));
50464bbc9efSBarry Smith   PetscStackCallSAWs(SAWs_Pop_Body,("index.html",2));
505b3506946SBarry Smith 
50688a9752cSBarry Smith   /* determine if any values have been set in GUI */
50783355fc5SBarry Smith   next = PetscOptionsObject->next;
50888a9752cSBarry Smith   while (next) {
50988a9752cSBarry Smith     ierr = PetscSNPrintf(dir,1024,"/PETSc/Options/%s",next->option);CHKERRQ(ierr);
510f7b25cf6SBarry Smith     PetscStackCallSAWs(SAWs_Selected,(dir,(int*)&next->set));
51188a9752cSBarry Smith     next = next->next;
51288a9752cSBarry Smith   }
51388a9752cSBarry Smith 
514b3506946SBarry Smith   /* reset counter to -2; this updates the screen with the new options for the selected method */
515f7b25cf6SBarry Smith   if (changedmethod) PetscOptionsObject->count = -2;
516b3506946SBarry Smith 
517a23eb982SSurtai Han   if (stopasking) {
518a23eb982SSurtai Han     PetscOptionsPublish      = PETSC_FALSE;
51912655325SBarry Smith     PetscOptionsObject->count = 0;//do not ask for same thing again
520a23eb982SSurtai Han   }
521a23eb982SSurtai Han 
5229a492a5cSBarry Smith   PetscStackCallSAWs(SAWs_Delete,("/PETSc/Options"));
523b3506946SBarry Smith   PetscFunctionReturn(0);
524b3506946SBarry Smith }
525b3506946SBarry Smith #endif
526b3506946SBarry Smith 
5276356e834SBarry Smith #undef __FUNCT__
52853acd3b1SBarry Smith #define __FUNCT__ "PetscOptionsEnd_Private"
5294416b707SBarry Smith PetscErrorCode PetscOptionsEnd_Private(PetscOptionItems *PetscOptionsObject)
53053acd3b1SBarry Smith {
53153acd3b1SBarry Smith   PetscErrorCode  ierr;
5324416b707SBarry Smith   PetscOptionItem last;
5336356e834SBarry Smith   char            option[256],value[1024],tmp[32];
534330cf3c9SBarry Smith   size_t          j;
53553acd3b1SBarry Smith 
53653acd3b1SBarry Smith   PetscFunctionBegin;
53783355fc5SBarry Smith   if (PetscOptionsObject->next) {
53883355fc5SBarry Smith     if (!PetscOptionsObject->count) {
539a264d7a6SBarry Smith #if defined(PETSC_HAVE_SAWS)
540f7b25cf6SBarry Smith       ierr = PetscOptionsSAWsInput(PetscOptionsObject);CHKERRQ(ierr);
541b3506946SBarry Smith #else
542e55864a3SBarry Smith       ierr = PetscOptionsGetFromTextInput(PetscOptionsObject);CHKERRQ(ierr);
543b3506946SBarry Smith #endif
544aee2cecaSBarry Smith     }
545aee2cecaSBarry Smith   }
5466356e834SBarry Smith 
547e55864a3SBarry Smith   ierr = PetscFree(PetscOptionsObject->title);CHKERRQ(ierr);
5486356e834SBarry Smith 
549e26ddf31SBarry Smith   /* reset counter to -2; this updates the screen with the new options for the selected method */
550e55864a3SBarry Smith   if (PetscOptionsObject->changedmethod) PetscOptionsObject->count = -2;
5517a72a596SBarry Smith   /* reset alreadyprinted flag */
552e55864a3SBarry Smith   PetscOptionsObject->alreadyprinted = PETSC_FALSE;
553e55864a3SBarry Smith   if (PetscOptionsObject->object) PetscOptionsObject->object->optionsprinted = PETSC_TRUE;
554e55864a3SBarry Smith   PetscOptionsObject->object = NULL;
55553acd3b1SBarry Smith 
556e55864a3SBarry Smith   while (PetscOptionsObject->next) {
557e55864a3SBarry Smith     if (PetscOptionsObject->next->set) {
558e55864a3SBarry Smith       if (PetscOptionsObject->prefix) {
55953acd3b1SBarry Smith         ierr = PetscStrcpy(option,"-");CHKERRQ(ierr);
560e55864a3SBarry Smith         ierr = PetscStrcat(option,PetscOptionsObject->prefix);CHKERRQ(ierr);
561e55864a3SBarry Smith         ierr = PetscStrcat(option,PetscOptionsObject->next->option+1);CHKERRQ(ierr);
5626356e834SBarry Smith       } else {
563e55864a3SBarry Smith         ierr = PetscStrcpy(option,PetscOptionsObject->next->option);CHKERRQ(ierr);
5646356e834SBarry Smith       }
5656356e834SBarry Smith 
566e55864a3SBarry Smith       switch (PetscOptionsObject->next->type) {
5676356e834SBarry Smith       case OPTION_HEAD:
5686356e834SBarry Smith         break;
5696356e834SBarry Smith       case OPTION_INT_ARRAY:
570e55864a3SBarry Smith         sprintf(value,"%d",(int)((PetscInt*)PetscOptionsObject->next->data)[0]);
571e55864a3SBarry Smith         for (j=1; j<PetscOptionsObject->next->arraylength; j++) {
572e55864a3SBarry Smith           sprintf(tmp,"%d",(int)((PetscInt*)PetscOptionsObject->next->data)[j]);
5736356e834SBarry Smith           ierr = PetscStrcat(value,",");CHKERRQ(ierr);
5746356e834SBarry Smith           ierr = PetscStrcat(value,tmp);CHKERRQ(ierr);
5756356e834SBarry Smith         }
5766356e834SBarry Smith         break;
5776356e834SBarry Smith       case OPTION_INT:
578e55864a3SBarry Smith         sprintf(value,"%d",(int) *(PetscInt*)PetscOptionsObject->next->data);
5796356e834SBarry Smith         break;
5806356e834SBarry Smith       case OPTION_REAL:
581e55864a3SBarry Smith         sprintf(value,"%g",(double) *(PetscReal*)PetscOptionsObject->next->data);
5826356e834SBarry Smith         break;
5836356e834SBarry Smith       case OPTION_REAL_ARRAY:
584e55864a3SBarry Smith         sprintf(value,"%g",(double)((PetscReal*)PetscOptionsObject->next->data)[0]);
585e55864a3SBarry Smith         for (j=1; j<PetscOptionsObject->next->arraylength; j++) {
586e55864a3SBarry Smith           sprintf(tmp,"%g",(double)((PetscReal*)PetscOptionsObject->next->data)[j]);
5876356e834SBarry Smith           ierr = PetscStrcat(value,",");CHKERRQ(ierr);
5886356e834SBarry Smith           ierr = PetscStrcat(value,tmp);CHKERRQ(ierr);
5896356e834SBarry Smith         }
5906356e834SBarry Smith         break;
591050cccc3SHong Zhang       case OPTION_SCALAR_ARRAY:
59295f3a755SJose E. Roman         sprintf(value,"%g+%gi",(double)PetscRealPart(((PetscScalar*)PetscOptionsObject->next->data)[0]),(double)PetscImaginaryPart(((PetscScalar*)PetscOptionsObject->next->data)[0]));
593050cccc3SHong Zhang         for (j=1; j<PetscOptionsObject->next->arraylength; j++) {
59495f3a755SJose E. Roman           sprintf(tmp,"%g+%gi",(double)PetscRealPart(((PetscScalar*)PetscOptionsObject->next->data)[j]),(double)PetscImaginaryPart(((PetscScalar*)PetscOptionsObject->next->data)[j]));
595050cccc3SHong Zhang           ierr = PetscStrcat(value,",");CHKERRQ(ierr);
596050cccc3SHong Zhang           ierr = PetscStrcat(value,tmp);CHKERRQ(ierr);
597050cccc3SHong Zhang         }
598050cccc3SHong Zhang         break;
5997781c08eSBarry Smith       case OPTION_BOOL:
600e55864a3SBarry Smith         sprintf(value,"%d",*(int*)PetscOptionsObject->next->data);
6016356e834SBarry Smith         break;
6027781c08eSBarry Smith       case OPTION_BOOL_ARRAY:
603e55864a3SBarry Smith         sprintf(value,"%d",(int)((PetscBool*)PetscOptionsObject->next->data)[0]);
604e55864a3SBarry Smith         for (j=1; j<PetscOptionsObject->next->arraylength; j++) {
605e55864a3SBarry Smith           sprintf(tmp,"%d",(int)((PetscBool*)PetscOptionsObject->next->data)[j]);
6061ae3d29cSBarry Smith           ierr = PetscStrcat(value,",");CHKERRQ(ierr);
6071ae3d29cSBarry Smith           ierr = PetscStrcat(value,tmp);CHKERRQ(ierr);
6081ae3d29cSBarry Smith         }
6091ae3d29cSBarry Smith         break;
610a264d7a6SBarry Smith       case OPTION_FLIST:
6116991f827SBarry Smith         ierr = PetscStrcpy(value,(char*)PetscOptionsObject->next->data);CHKERRQ(ierr);
6126991f827SBarry Smith         break;
6131ae3d29cSBarry Smith       case OPTION_ELIST:
614e55864a3SBarry Smith         ierr = PetscStrcpy(value,(char*)PetscOptionsObject->next->data);CHKERRQ(ierr);
6156356e834SBarry Smith         break;
6161ae3d29cSBarry Smith       case OPTION_STRING:
617e55864a3SBarry Smith         ierr = PetscStrcpy(value,(char*)PetscOptionsObject->next->data);CHKERRQ(ierr);
618d51da6bfSBarry Smith         break;
6191ae3d29cSBarry Smith       case OPTION_STRING_ARRAY:
620e55864a3SBarry Smith         sprintf(value,"%s",((char**)PetscOptionsObject->next->data)[0]);
621e55864a3SBarry Smith         for (j=1; j<PetscOptionsObject->next->arraylength; j++) {
622e55864a3SBarry Smith           sprintf(tmp,"%s",((char**)PetscOptionsObject->next->data)[j]);
6231ae3d29cSBarry Smith           ierr = PetscStrcat(value,",");CHKERRQ(ierr);
6241ae3d29cSBarry Smith           ierr = PetscStrcat(value,tmp);CHKERRQ(ierr);
6251ae3d29cSBarry Smith         }
6266356e834SBarry Smith         break;
6276356e834SBarry Smith       }
628c5929fdfSBarry Smith       ierr = PetscOptionsSetValue(PetscOptionsObject->options,option,value);CHKERRQ(ierr);
6296356e834SBarry Smith     }
6306991f827SBarry Smith     if (PetscOptionsObject->next->type == OPTION_ELIST) {
6316991f827SBarry Smith       ierr = PetscStrNArrayDestroy(PetscOptionsObject->next->nlist,(char ***)&PetscOptionsObject->next->list);CHKERRQ(ierr);
6326991f827SBarry Smith     }
633e55864a3SBarry Smith     ierr   = PetscFree(PetscOptionsObject->next->text);CHKERRQ(ierr);
634e55864a3SBarry Smith     ierr   = PetscFree(PetscOptionsObject->next->option);CHKERRQ(ierr);
635e55864a3SBarry Smith     ierr   = PetscFree(PetscOptionsObject->next->man);CHKERRQ(ierr);
636e55864a3SBarry Smith     ierr   = PetscFree(PetscOptionsObject->next->edata);CHKERRQ(ierr);
637c979a496SBarry Smith 
63883355fc5SBarry Smith     if ((PetscOptionsObject->next->type == OPTION_STRING) || (PetscOptionsObject->next->type == OPTION_FLIST) || (PetscOptionsObject->next->type == OPTION_ELIST)){
63983355fc5SBarry Smith       free(PetscOptionsObject->next->data);
640c979a496SBarry Smith     } else {
64183355fc5SBarry Smith       ierr   = PetscFree(PetscOptionsObject->next->data);CHKERRQ(ierr);
642c979a496SBarry Smith     }
6437781c08eSBarry Smith 
64483355fc5SBarry Smith     last                    = PetscOptionsObject->next;
64583355fc5SBarry Smith     PetscOptionsObject->next = PetscOptionsObject->next->next;
6466356e834SBarry Smith     ierr                    = PetscFree(last);CHKERRQ(ierr);
6476356e834SBarry Smith   }
648f59f755dSBarry Smith   ierr = PetscFree(PetscOptionsObject->prefix);CHKERRQ(ierr);
649e55864a3SBarry Smith   PetscOptionsObject->next = 0;
65053acd3b1SBarry Smith   PetscFunctionReturn(0);
65153acd3b1SBarry Smith }
65253acd3b1SBarry Smith 
65353acd3b1SBarry Smith #undef __FUNCT__
654e55864a3SBarry Smith #define __FUNCT__ "PetscOptionsEnum_Private"
65553acd3b1SBarry Smith /*@C
65653acd3b1SBarry Smith    PetscOptionsEnum - Gets the enum value for a particular option in the database.
65753acd3b1SBarry Smith 
6583f9fe445SBarry Smith    Logically Collective on the communicator passed in PetscOptionsBegin()
65953acd3b1SBarry Smith 
66053acd3b1SBarry Smith    Input Parameters:
66153acd3b1SBarry Smith +  opt - option name
66253acd3b1SBarry Smith .  text - short string that describes the option
66353acd3b1SBarry Smith .  man - manual page with additional information on option
66453acd3b1SBarry Smith .  list - array containing the list of choices, followed by the enum name, followed by the enum prefix, followed by a null
6650fdccdaeSBarry Smith -  currentvalue - the current value; caller is responsible for setting this value correctly. Normally this is done with either
6660fdccdaeSBarry Smith $                 PetscOptionsEnum(..., obj->value,&object->value,...) or
6670fdccdaeSBarry Smith $                 value = defaultvalue
6680fdccdaeSBarry Smith $                 PetscOptionsEnum(..., value,&value,&flg);
6690fdccdaeSBarry Smith $                 if (flg) {
67053acd3b1SBarry Smith 
67153acd3b1SBarry Smith    Output Parameter:
67253acd3b1SBarry Smith +  value - the  value to return
673b32e0204SMatthew G Knepley -  set - PETSC_TRUE if found, else PETSC_FALSE
67453acd3b1SBarry Smith 
67553acd3b1SBarry Smith    Level: beginner
67653acd3b1SBarry Smith 
67753acd3b1SBarry Smith    Concepts: options database
67853acd3b1SBarry Smith 
67953acd3b1SBarry Smith    Notes: Must be between a PetscOptionsBegin() and a PetscOptionsEnd()
68053acd3b1SBarry Smith 
68153acd3b1SBarry Smith           list is usually something like PCASMTypes or some other predefined list of enum names
68253acd3b1SBarry Smith 
68353acd3b1SBarry Smith .seealso: PetscOptionsGetReal(), PetscOptionsHasName(), PetscOptionsGetString(), PetscOptionsGetInt(),
684acfcf0e5SJed Brown           PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool()
685acfcf0e5SJed Brown           PetscOptionsInt(), PetscOptionsString(), PetscOptionsReal(), PetscOptionsBool(),
68653acd3b1SBarry Smith           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
68753acd3b1SBarry Smith           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
688acfcf0e5SJed Brown           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
689a264d7a6SBarry Smith           PetscOptionsFList(), PetscOptionsEList()
69053acd3b1SBarry Smith @*/
6914416b707SBarry Smith PetscErrorCode  PetscOptionsEnum_Private(PetscOptionItems *PetscOptionsObject,const char opt[],const char text[],const char man[],const char *const *list,PetscEnum currentvalue,PetscEnum *value,PetscBool  *set)
69253acd3b1SBarry Smith {
69353acd3b1SBarry Smith   PetscErrorCode ierr;
69453acd3b1SBarry Smith   PetscInt       ntext = 0;
695aa5bb8c0SSatish Balay   PetscInt       tval;
696ace3abfcSBarry Smith   PetscBool      tflg;
69753acd3b1SBarry Smith 
69853acd3b1SBarry Smith   PetscFunctionBegin;
69953acd3b1SBarry Smith   while (list[ntext++]) {
700e32f2f54SBarry Smith     if (ntext > 50) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"List argument appears to be wrong or have more than 50 entries");
70153acd3b1SBarry Smith   }
702e32f2f54SBarry Smith   if (ntext < 3) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"List argument must have at least two entries: typename and type prefix");
70353acd3b1SBarry Smith   ntext -= 3;
704e55864a3SBarry Smith   ierr   = PetscOptionsEList_Private(PetscOptionsObject,opt,text,man,list,ntext,list[currentvalue],&tval,&tflg);CHKERRQ(ierr);
705aa5bb8c0SSatish Balay   /* with PETSC_USE_64BIT_INDICES sizeof(PetscInt) != sizeof(PetscEnum) */
706aa5bb8c0SSatish Balay   if (tflg) *value = (PetscEnum)tval;
707aa5bb8c0SSatish Balay   if (set)  *set   = tflg;
70853acd3b1SBarry Smith   PetscFunctionReturn(0);
70953acd3b1SBarry Smith }
71053acd3b1SBarry Smith 
711d3e47460SLisandro Dalcin #undef __FUNCT__
712d3e47460SLisandro Dalcin #define __FUNCT__ "PetscOptionsEnumArray_Private"
713d3e47460SLisandro Dalcin /*@C
714d3e47460SLisandro Dalcin    PetscOptionsEnumArray - Gets an array of enum values for a particular
715d3e47460SLisandro Dalcin    option in the database.
716d3e47460SLisandro Dalcin 
717d3e47460SLisandro Dalcin    Logically Collective on the communicator passed in PetscOptionsBegin()
718d3e47460SLisandro Dalcin 
719d3e47460SLisandro Dalcin    Input Parameters:
720d3e47460SLisandro Dalcin +  opt - the option one is seeking
721d3e47460SLisandro Dalcin .  text - short string describing option
722d3e47460SLisandro Dalcin .  man - manual page for option
723d3e47460SLisandro Dalcin -  n - maximum number of values
724d3e47460SLisandro Dalcin 
725d3e47460SLisandro Dalcin    Output Parameter:
726d3e47460SLisandro Dalcin +  value - location to copy values
727d3e47460SLisandro Dalcin .  n - actual number of values found
728d3e47460SLisandro Dalcin -  set - PETSC_TRUE if found, else PETSC_FALSE
729d3e47460SLisandro Dalcin 
730d3e47460SLisandro Dalcin    Level: beginner
731d3e47460SLisandro Dalcin 
732d3e47460SLisandro Dalcin    Notes:
733d3e47460SLisandro Dalcin    The array must be passed as a comma separated list.
734d3e47460SLisandro Dalcin 
735d3e47460SLisandro Dalcin    There must be no intervening spaces between the values.
736d3e47460SLisandro Dalcin 
737d3e47460SLisandro Dalcin    Must be between a PetscOptionsBegin() and a PetscOptionsEnd()
738d3e47460SLisandro Dalcin 
739d3e47460SLisandro Dalcin    Concepts: options database^array of enums
740d3e47460SLisandro Dalcin 
741d3e47460SLisandro Dalcin .seealso: PetscOptionsGetInt(), PetscOptionsGetReal(),
742d3e47460SLisandro Dalcin           PetscOptionsHasName(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool(),
743d3e47460SLisandro Dalcin           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
744d3e47460SLisandro Dalcin           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
745d3e47460SLisandro Dalcin           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
746d3e47460SLisandro Dalcin           PetscOptionsFList(), PetscOptionsEList(), PetscOptionsRealArray()
747d3e47460SLisandro Dalcin @*/
7484416b707SBarry Smith PetscErrorCode  PetscOptionsEnumArray_Private(PetscOptionItems *PetscOptionsObject,const char opt[],const char text[],const char man[],const char *const *list,PetscEnum value[],PetscInt *n,PetscBool  *set)
749d3e47460SLisandro Dalcin {
750d3e47460SLisandro Dalcin   PetscInt        i,nlist = 0;
7514416b707SBarry Smith   PetscOptionItem amsopt;
752d3e47460SLisandro Dalcin   PetscErrorCode  ierr;
753d3e47460SLisandro Dalcin 
754d3e47460SLisandro Dalcin   PetscFunctionBegin;
755d3e47460SLisandro Dalcin   while (list[nlist++]) if (nlist > 50) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"List argument appears to be wrong or have more than 50 entries");
756d3e47460SLisandro Dalcin   if (nlist < 3) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"List argument must have at least two entries: typename and type prefix");
757d3e47460SLisandro Dalcin   nlist -= 3; /* drop enum name, prefix, and null termination */
758d3e47460SLisandro Dalcin   if (0 && !PetscOptionsObject->count) { /* XXX Requires additional support */
759d3e47460SLisandro Dalcin     PetscEnum *vals;
7604416b707SBarry Smith     ierr = PetscOptionItemCreate_Private(PetscOptionsObject,opt,text,man,OPTION_INT_ARRAY/*XXX OPTION_ENUM_ARRAY*/,&amsopt);CHKERRQ(ierr);
761d3e47460SLisandro Dalcin     ierr = PetscStrNArrayallocpy(nlist,list,(char***)&amsopt->list);CHKERRQ(ierr);
762d3e47460SLisandro Dalcin     amsopt->nlist = nlist;
763d3e47460SLisandro Dalcin     ierr = PetscMalloc1(*n,(PetscEnum**)&amsopt->data);CHKERRQ(ierr);
764d3e47460SLisandro Dalcin     amsopt->arraylength = *n;
765d3e47460SLisandro Dalcin     vals = (PetscEnum*)amsopt->data;
766d3e47460SLisandro Dalcin     for (i=0; i<*n; i++) vals[i] = value[i];
767d3e47460SLisandro Dalcin   }
768c5929fdfSBarry Smith   ierr = PetscOptionsGetEnumArray(PetscOptionsObject->options,PetscOptionsObject->prefix,opt,list,value,n,set);CHKERRQ(ierr);
769d3e47460SLisandro Dalcin   if (PetscOptionsObject->printhelp && PetscOptionsObject->count == 1 && !PetscOptionsObject->alreadyprinted) {
770d3e47460SLisandro Dalcin     ierr = (*PetscHelpPrintf)(PetscOptionsObject->comm,"  -%s%s <%s",PetscOptionsObject->prefix ? PetscOptionsObject->prefix : "",opt+1,list[value[0]]);CHKERRQ(ierr);
771d3e47460SLisandro Dalcin     for (i=1; i<*n; i++) {ierr = (*PetscHelpPrintf)(PetscOptionsObject->comm,",%s",list[value[i]]);CHKERRQ(ierr);}
772d3e47460SLisandro Dalcin     ierr = (*PetscHelpPrintf)(PetscOptionsObject->comm,">: %s (choose from)",text);CHKERRQ(ierr);
773d3e47460SLisandro Dalcin     for (i=0; i<nlist; i++) {ierr = (*PetscHelpPrintf)(PetscOptionsObject->comm," %s",list[i]);CHKERRQ(ierr);}
774d3e47460SLisandro Dalcin     ierr = (*PetscHelpPrintf)(PetscOptionsObject->comm," (%s)\n",ManSection(man));CHKERRQ(ierr);
775d3e47460SLisandro Dalcin   }
776d3e47460SLisandro Dalcin   PetscFunctionReturn(0);
777d3e47460SLisandro Dalcin }
778d3e47460SLisandro Dalcin 
77953acd3b1SBarry Smith /* -------------------------------------------------------------------------------------------------------------*/
78053acd3b1SBarry Smith #undef __FUNCT__
781e55864a3SBarry Smith #define __FUNCT__ "PetscOptionsInt_Private"
78253acd3b1SBarry Smith /*@C
78353acd3b1SBarry Smith    PetscOptionsInt - Gets the integer value for a particular option in the database.
78453acd3b1SBarry Smith 
7853f9fe445SBarry Smith    Logically Collective on the communicator passed in PetscOptionsBegin()
78653acd3b1SBarry Smith 
78753acd3b1SBarry Smith    Input Parameters:
78853acd3b1SBarry Smith +  opt - option name
78953acd3b1SBarry Smith .  text - short string that describes the option
79053acd3b1SBarry Smith .  man - manual page with additional information on option
7910fdccdaeSBarry Smith -  currentvalue - the current value; caller is responsible for setting this value correctly. Normally this is done with either
7920fdccdaeSBarry Smith $                 PetscOptionsInt(..., obj->value,&object->value,...) or
7930fdccdaeSBarry Smith $                 value = defaultvalue
7940fdccdaeSBarry Smith $                 PetscOptionsInt(..., value,&value,&flg);
7950fdccdaeSBarry Smith $                 if (flg) {
79653acd3b1SBarry Smith 
79753acd3b1SBarry Smith    Output Parameter:
79853acd3b1SBarry Smith +  value - the integer value to return
79953acd3b1SBarry Smith -  flg - PETSC_TRUE if found, else PETSC_FALSE
80053acd3b1SBarry Smith 
80153acd3b1SBarry Smith    Level: beginner
80253acd3b1SBarry Smith 
80353acd3b1SBarry Smith    Concepts: options database^has int
80453acd3b1SBarry Smith 
80553acd3b1SBarry Smith    Notes: Must be between a PetscOptionsBegin() and a PetscOptionsEnd()
80653acd3b1SBarry Smith 
80753acd3b1SBarry Smith .seealso: PetscOptionsGetReal(), PetscOptionsHasName(), PetscOptionsGetString(), PetscOptionsGetInt(),
808acfcf0e5SJed Brown           PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool()
809acfcf0e5SJed Brown           PetscOptionsInt(), PetscOptionsString(), PetscOptionsReal(), PetscOptionsBool(),
81053acd3b1SBarry Smith           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
81153acd3b1SBarry Smith           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
812acfcf0e5SJed Brown           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
813a264d7a6SBarry Smith           PetscOptionsFList(), PetscOptionsEList()
81453acd3b1SBarry Smith @*/
8154416b707SBarry Smith PetscErrorCode  PetscOptionsInt_Private(PetscOptionItems *PetscOptionsObject,const char opt[],const char text[],const char man[],PetscInt currentvalue,PetscInt *value,PetscBool  *set)
81653acd3b1SBarry Smith {
81753acd3b1SBarry Smith   PetscErrorCode  ierr;
8184416b707SBarry Smith   PetscOptionItem amsopt;
81912655325SBarry Smith   PetscBool       wasset;
82053acd3b1SBarry Smith 
82153acd3b1SBarry Smith   PetscFunctionBegin;
822e55864a3SBarry Smith   if (!PetscOptionsObject->count) {
8234416b707SBarry Smith     ierr = PetscOptionItemCreate_Private(PetscOptionsObject,opt,text,man,OPTION_INT,&amsopt);CHKERRQ(ierr);
8246356e834SBarry Smith     ierr = PetscMalloc(sizeof(PetscInt),&amsopt->data);CHKERRQ(ierr);
82512655325SBarry Smith     *(PetscInt*)amsopt->data = currentvalue;
8263e211508SBarry Smith 
827c5929fdfSBarry Smith     ierr = PetscOptionsGetInt(PetscOptionsObject->options,PetscOptionsObject->prefix,opt,&currentvalue,&wasset);CHKERRQ(ierr);
8283e211508SBarry Smith     if (wasset) {
82912655325SBarry Smith       *(PetscInt*)amsopt->data = currentvalue;
8303e211508SBarry Smith     }
831af6d86caSBarry Smith   }
832c5929fdfSBarry Smith   ierr = PetscOptionsGetInt(NULL,PetscOptionsObject->prefix,opt,value,set);CHKERRQ(ierr);
833e55864a3SBarry Smith   if (PetscOptionsObject->printhelp && PetscOptionsObject->count == 1 && !PetscOptionsObject->alreadyprinted) {
8341a1499c8SBarry Smith     ierr = (*PetscHelpPrintf)(PetscOptionsObject->comm,"  -%s%s <%d>: %s (%s)\n",PetscOptionsObject->prefix ? PetscOptionsObject->prefix : "",opt+1,currentvalue,text,ManSection(man));CHKERRQ(ierr);
83553acd3b1SBarry Smith   }
83653acd3b1SBarry Smith   PetscFunctionReturn(0);
83753acd3b1SBarry Smith }
83853acd3b1SBarry Smith 
83953acd3b1SBarry Smith #undef __FUNCT__
840e55864a3SBarry Smith #define __FUNCT__ "PetscOptionsString_Private"
84153acd3b1SBarry Smith /*@C
84253acd3b1SBarry Smith    PetscOptionsString - Gets the string value for a particular option in the database.
84353acd3b1SBarry Smith 
8443f9fe445SBarry Smith    Logically Collective on the communicator passed in PetscOptionsBegin()
84553acd3b1SBarry Smith 
84653acd3b1SBarry Smith    Input Parameters:
84753acd3b1SBarry Smith +  opt - option name
84853acd3b1SBarry Smith .  text - short string that describes the option
84953acd3b1SBarry Smith .  man - manual page with additional information on option
8500fdccdaeSBarry Smith .  currentvalue - the current value; caller is responsible for setting this value correctly. This is not used to set value
851bcbf2dc5SJed Brown -  len - length of the result string including null terminator
85253acd3b1SBarry Smith 
85353acd3b1SBarry Smith    Output Parameter:
85453acd3b1SBarry Smith +  value - the value to return
85553acd3b1SBarry Smith -  flg - PETSC_TRUE if found, else PETSC_FALSE
85653acd3b1SBarry Smith 
85753acd3b1SBarry Smith    Level: beginner
85853acd3b1SBarry Smith 
85953acd3b1SBarry Smith    Concepts: options database^has int
86053acd3b1SBarry Smith 
86153acd3b1SBarry Smith    Notes: Must be between a PetscOptionsBegin() and a PetscOptionsEnd()
86253acd3b1SBarry Smith 
8637fccdfe4SBarry 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).
8647fccdfe4SBarry Smith 
865c5929fdfSBarry Smith .seealso: PetscOptionsGetReal(), PetscOptionsHasName(), PetscOptionsGetString(), PetscOptionsGetInt(NULL,),
866acfcf0e5SJed Brown           PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool()
867acfcf0e5SJed Brown           PetscOptionsInt(), PetscOptionsReal(), PetscOptionsBool(),
86853acd3b1SBarry Smith           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
86953acd3b1SBarry Smith           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
870acfcf0e5SJed Brown           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
871a264d7a6SBarry Smith           PetscOptionsFList(), PetscOptionsEList()
87253acd3b1SBarry Smith @*/
8734416b707SBarry Smith PetscErrorCode  PetscOptionsString_Private(PetscOptionItems *PetscOptionsObject,const char opt[],const char text[],const char man[],const char currentvalue[],char value[],size_t len,PetscBool  *set)
87453acd3b1SBarry Smith {
87553acd3b1SBarry Smith   PetscErrorCode  ierr;
8764416b707SBarry Smith   PetscOptionItem amsopt;
87753acd3b1SBarry Smith 
87853acd3b1SBarry Smith   PetscFunctionBegin;
8791a1499c8SBarry Smith   if (!PetscOptionsObject->count) {
8804416b707SBarry Smith     ierr = PetscOptionItemCreate_Private(PetscOptionsObject,opt,text,man,OPTION_STRING,&amsopt);CHKERRQ(ierr);
88164facd6cSBarry Smith     /* must use system malloc since SAWs may free this */
8820fdccdaeSBarry Smith     ierr = PetscStrdup(currentvalue ? currentvalue : "",(char**)&amsopt->data);CHKERRQ(ierr);
883af6d86caSBarry Smith   }
884c5929fdfSBarry Smith   ierr = PetscOptionsGetString(PetscOptionsObject->options,PetscOptionsObject->prefix,opt,value,len,set);CHKERRQ(ierr);
885e55864a3SBarry Smith   if (PetscOptionsObject->printhelp && PetscOptionsObject->count == 1 && !PetscOptionsObject->alreadyprinted) {
8861a1499c8SBarry Smith     ierr = (*PetscHelpPrintf)(PetscOptionsObject->comm,"  -%s%s <%s>: %s (%s)\n",PetscOptionsObject->prefix ? PetscOptionsObject->prefix : "",opt+1,currentvalue,text,ManSection(man));CHKERRQ(ierr);
88753acd3b1SBarry Smith   }
88853acd3b1SBarry Smith   PetscFunctionReturn(0);
88953acd3b1SBarry Smith }
89053acd3b1SBarry Smith 
89153acd3b1SBarry Smith #undef __FUNCT__
892e55864a3SBarry Smith #define __FUNCT__ "PetscOptionsReal_Private"
89353acd3b1SBarry Smith /*@C
89453acd3b1SBarry Smith    PetscOptionsReal - Gets the PetscReal value for a particular option in the database.
89553acd3b1SBarry Smith 
8963f9fe445SBarry Smith    Logically Collective on the communicator passed in PetscOptionsBegin()
89753acd3b1SBarry Smith 
89853acd3b1SBarry Smith    Input Parameters:
89953acd3b1SBarry Smith +  opt - option name
90053acd3b1SBarry Smith .  text - short string that describes the option
90153acd3b1SBarry Smith .  man - manual page with additional information on option
9020fdccdaeSBarry Smith -  currentvalue - the current value; caller is responsible for setting this value correctly. Normally this is done with either
9030fdccdaeSBarry Smith $                 PetscOptionsReal(..., obj->value,&object->value,...) or
9040fdccdaeSBarry Smith $                 value = defaultvalue
9050fdccdaeSBarry Smith $                 PetscOptionsReal(..., value,&value,&flg);
9060fdccdaeSBarry Smith $                 if (flg) {
90753acd3b1SBarry Smith 
90853acd3b1SBarry Smith    Output Parameter:
90953acd3b1SBarry Smith +  value - the value to return
91053acd3b1SBarry Smith -  flg - PETSC_TRUE if found, else PETSC_FALSE
91153acd3b1SBarry Smith 
91253acd3b1SBarry Smith    Level: beginner
91353acd3b1SBarry Smith 
91453acd3b1SBarry Smith    Concepts: options database^has int
91553acd3b1SBarry Smith 
91653acd3b1SBarry Smith    Notes: Must be between a PetscOptionsBegin() and a PetscOptionsEnd()
91753acd3b1SBarry Smith 
918c5929fdfSBarry Smith .seealso: PetscOptionsGetReal(), PetscOptionsHasName(), PetscOptionsGetString(), PetscOptionsGetInt(NULL,),
919acfcf0e5SJed Brown           PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool()
920acfcf0e5SJed Brown           PetscOptionsInt(), PetscOptionsString(), PetscOptionsReal(), PetscOptionsBool(),
92153acd3b1SBarry Smith           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
92253acd3b1SBarry Smith           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
923acfcf0e5SJed Brown           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
924a264d7a6SBarry Smith           PetscOptionsFList(), PetscOptionsEList()
92553acd3b1SBarry Smith @*/
9264416b707SBarry Smith PetscErrorCode  PetscOptionsReal_Private(PetscOptionItems *PetscOptionsObject,const char opt[],const char text[],const char man[],PetscReal currentvalue,PetscReal *value,PetscBool  *set)
92753acd3b1SBarry Smith {
92853acd3b1SBarry Smith   PetscErrorCode  ierr;
9294416b707SBarry Smith   PetscOptionItem amsopt;
93053acd3b1SBarry Smith 
93153acd3b1SBarry Smith   PetscFunctionBegin;
932e55864a3SBarry Smith   if (!PetscOptionsObject->count) {
9334416b707SBarry Smith     ierr = PetscOptionItemCreate_Private(PetscOptionsObject,opt,text,man,OPTION_REAL,&amsopt);CHKERRQ(ierr);
934538aa990SBarry Smith     ierr = PetscMalloc(sizeof(PetscReal),&amsopt->data);CHKERRQ(ierr);
935a297a907SKarl Rupp 
9360fdccdaeSBarry Smith     *(PetscReal*)amsopt->data = currentvalue;
937538aa990SBarry Smith   }
938c5929fdfSBarry Smith   ierr = PetscOptionsGetReal(PetscOptionsObject->options,PetscOptionsObject->prefix,opt,value,set);CHKERRQ(ierr);
9391a1499c8SBarry Smith   if (PetscOptionsObject->printhelp && PetscOptionsObject->count == 1 && !PetscOptionsObject->alreadyprinted) {
9401a1499c8SBarry Smith     ierr = (*PetscHelpPrintf)(PetscOptionsObject->comm,"  -%s%s <%g>: %s (%s)\n",PetscOptionsObject->prefix ? PetscOptionsObject->prefix : "",opt+1,(double)currentvalue,text,ManSection(man));CHKERRQ(ierr);
94153acd3b1SBarry Smith   }
94253acd3b1SBarry Smith   PetscFunctionReturn(0);
94353acd3b1SBarry Smith }
94453acd3b1SBarry Smith 
94553acd3b1SBarry Smith #undef __FUNCT__
946e55864a3SBarry Smith #define __FUNCT__ "PetscOptionsScalar_Private"
94753acd3b1SBarry Smith /*@C
94853acd3b1SBarry Smith    PetscOptionsScalar - Gets the scalar value for a particular option in the database.
94953acd3b1SBarry Smith 
9503f9fe445SBarry Smith    Logically Collective on the communicator passed in PetscOptionsBegin()
95153acd3b1SBarry Smith 
95253acd3b1SBarry Smith    Input Parameters:
95353acd3b1SBarry Smith +  opt - option name
95453acd3b1SBarry Smith .  text - short string that describes the option
95553acd3b1SBarry Smith .  man - manual page with additional information on option
9560fdccdaeSBarry Smith -  currentvalue - the current value; caller is responsible for setting this value correctly. Normally this is done with either
9570fdccdaeSBarry Smith $                 PetscOptionsScalar(..., obj->value,&object->value,...) or
9580fdccdaeSBarry Smith $                 value = defaultvalue
9590fdccdaeSBarry Smith $                 PetscOptionsScalar(..., value,&value,&flg);
9600fdccdaeSBarry Smith $                 if (flg) {
9610fdccdaeSBarry Smith 
96253acd3b1SBarry Smith 
96353acd3b1SBarry Smith    Output Parameter:
96453acd3b1SBarry Smith +  value - the value to return
96553acd3b1SBarry Smith -  flg - PETSC_TRUE if found, else PETSC_FALSE
96653acd3b1SBarry Smith 
96753acd3b1SBarry Smith    Level: beginner
96853acd3b1SBarry Smith 
96953acd3b1SBarry Smith    Concepts: options database^has int
97053acd3b1SBarry Smith 
97153acd3b1SBarry Smith    Notes: Must be between a PetscOptionsBegin() and a PetscOptionsEnd()
97253acd3b1SBarry Smith 
973c5929fdfSBarry Smith .seealso: PetscOptionsGetReal(), PetscOptionsHasName(), PetscOptionsGetString(), PetscOptionsGetInt(NULL,),
974acfcf0e5SJed Brown           PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool()
975acfcf0e5SJed Brown           PetscOptionsInt(), PetscOptionsString(), PetscOptionsReal(), PetscOptionsBool(),
97653acd3b1SBarry Smith           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
97753acd3b1SBarry Smith           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
978acfcf0e5SJed Brown           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
979a264d7a6SBarry Smith           PetscOptionsFList(), PetscOptionsEList()
98053acd3b1SBarry Smith @*/
9814416b707SBarry Smith PetscErrorCode  PetscOptionsScalar_Private(PetscOptionItems *PetscOptionsObject,const char opt[],const char text[],const char man[],PetscScalar currentvalue,PetscScalar *value,PetscBool  *set)
98253acd3b1SBarry Smith {
98353acd3b1SBarry Smith   PetscErrorCode ierr;
98453acd3b1SBarry Smith 
98553acd3b1SBarry Smith   PetscFunctionBegin;
98653acd3b1SBarry Smith #if !defined(PETSC_USE_COMPLEX)
9870fdccdaeSBarry Smith   ierr = PetscOptionsReal(opt,text,man,currentvalue,value,set);CHKERRQ(ierr);
98853acd3b1SBarry Smith #else
989c5929fdfSBarry Smith   ierr = PetscOptionsGetScalar(PetscOptionsObject->options,PetscOptionsObject->prefix,opt,value,set);CHKERRQ(ierr);
99053acd3b1SBarry Smith #endif
99153acd3b1SBarry Smith   PetscFunctionReturn(0);
99253acd3b1SBarry Smith }
99353acd3b1SBarry Smith 
99453acd3b1SBarry Smith #undef __FUNCT__
995e55864a3SBarry Smith #define __FUNCT__ "PetscOptionsName_Private"
99653acd3b1SBarry Smith /*@C
99790d69ab7SBarry Smith    PetscOptionsName - Determines if a particular option has been set in the database. This returns true whether the option is a number, string or boolean, even
99890d69ab7SBarry Smith                       its value is set to false.
99953acd3b1SBarry Smith 
10003f9fe445SBarry Smith    Logically Collective on the communicator passed in PetscOptionsBegin()
100153acd3b1SBarry Smith 
100253acd3b1SBarry Smith    Input Parameters:
100353acd3b1SBarry Smith +  opt - option name
100453acd3b1SBarry Smith .  text - short string that describes the option
100553acd3b1SBarry Smith -  man - manual page with additional information on option
100653acd3b1SBarry Smith 
100753acd3b1SBarry Smith    Output Parameter:
100853acd3b1SBarry Smith .  flg - PETSC_TRUE if found, else PETSC_FALSE
100953acd3b1SBarry Smith 
101053acd3b1SBarry Smith    Level: beginner
101153acd3b1SBarry Smith 
101253acd3b1SBarry Smith    Concepts: options database^has int
101353acd3b1SBarry Smith 
101453acd3b1SBarry Smith    Notes: Must be between a PetscOptionsBegin() and a PetscOptionsEnd()
101553acd3b1SBarry Smith 
1016c5929fdfSBarry Smith .seealso: PetscOptionsGetReal(), PetscOptionsHasName(), PetscOptionsGetString(), PetscOptionsGetInt(NULL,),
1017acfcf0e5SJed Brown           PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool()
1018acfcf0e5SJed Brown           PetscOptionsInt(), PetscOptionsString(), PetscOptionsReal(), PetscOptionsBool(),
101953acd3b1SBarry Smith           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
102053acd3b1SBarry Smith           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
1021acfcf0e5SJed Brown           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
1022a264d7a6SBarry Smith           PetscOptionsFList(), PetscOptionsEList()
102353acd3b1SBarry Smith @*/
10244416b707SBarry Smith PetscErrorCode  PetscOptionsName_Private(PetscOptionItems *PetscOptionsObject,const char opt[],const char text[],const char man[],PetscBool  *flg)
102553acd3b1SBarry Smith {
102653acd3b1SBarry Smith   PetscErrorCode  ierr;
10274416b707SBarry Smith   PetscOptionItem amsopt;
102853acd3b1SBarry Smith 
102953acd3b1SBarry Smith   PetscFunctionBegin;
1030e55864a3SBarry Smith   if (!PetscOptionsObject->count) {
10314416b707SBarry Smith     ierr = PetscOptionItemCreate_Private(PetscOptionsObject,opt,text,man,OPTION_BOOL,&amsopt);CHKERRQ(ierr);
1032ace3abfcSBarry Smith     ierr = PetscMalloc(sizeof(PetscBool),&amsopt->data);CHKERRQ(ierr);
1033a297a907SKarl Rupp 
1034ace3abfcSBarry Smith     *(PetscBool*)amsopt->data = PETSC_FALSE;
10351ae3d29cSBarry Smith   }
1036c5929fdfSBarry Smith   ierr = PetscOptionsHasName(PetscOptionsObject->options,PetscOptionsObject->prefix,opt,flg);CHKERRQ(ierr);
1037e55864a3SBarry Smith   if (PetscOptionsObject->printhelp && PetscOptionsObject->count == 1 && !PetscOptionsObject->alreadyprinted) {
1038e55864a3SBarry Smith     ierr = (*PetscHelpPrintf)(PetscOptionsObject->comm,"  -%s%s: %s (%s)\n",PetscOptionsObject->prefix ? PetscOptionsObject->prefix : "",opt+1,text,ManSection(man));CHKERRQ(ierr);
103953acd3b1SBarry Smith   }
104053acd3b1SBarry Smith   PetscFunctionReturn(0);
104153acd3b1SBarry Smith }
104253acd3b1SBarry Smith 
104353acd3b1SBarry Smith #undef __FUNCT__
1044e55864a3SBarry Smith #define __FUNCT__ "PetscOptionsFList_Private"
104553acd3b1SBarry Smith /*@C
1046a264d7a6SBarry Smith      PetscOptionsFList - Puts a list of option values that a single one may be selected from
104753acd3b1SBarry Smith 
10483f9fe445SBarry Smith    Logically Collective on the communicator passed in PetscOptionsBegin()
104953acd3b1SBarry Smith 
105053acd3b1SBarry Smith    Input Parameters:
105153acd3b1SBarry Smith +  opt - option name
105253acd3b1SBarry Smith .  text - short string that describes the option
105353acd3b1SBarry Smith .  man - manual page with additional information on option
105453acd3b1SBarry Smith .  list - the possible choices
10550fdccdaeSBarry Smith .  currentvalue - the current value; caller is responsible for setting this value correctly. Normally this is done with
10560fdccdaeSBarry Smith $                 PetscOptionsFlist(..., obj->value,value,len,&flg);
10570fdccdaeSBarry Smith $                 if (flg) {
10583cc1e11dSBarry Smith -  len - the length of the character array value
105953acd3b1SBarry Smith 
106053acd3b1SBarry Smith    Output Parameter:
106153acd3b1SBarry Smith +  value - the value to return
106253acd3b1SBarry Smith -  set - PETSC_TRUE if found, else PETSC_FALSE
106353acd3b1SBarry Smith 
106453acd3b1SBarry Smith    Level: intermediate
106553acd3b1SBarry Smith 
106653acd3b1SBarry Smith    Notes: Must be between a PetscOptionsBegin() and a PetscOptionsEnd()
106753acd3b1SBarry Smith 
106853acd3b1SBarry Smith    See PetscOptionsEList() for when the choices are given in a string array
106953acd3b1SBarry Smith 
107053acd3b1SBarry Smith    To get a listing of all currently specified options,
107188c29154SBarry Smith     see PetscOptionsView() or PetscOptionsGetAll()
107253acd3b1SBarry Smith 
1073eabe10d7SBarry Smith    Developer Note: This cannot check for invalid selection because of things like MATAIJ that are not included in the list
1074eabe10d7SBarry Smith 
107553acd3b1SBarry Smith    Concepts: options database^list
107653acd3b1SBarry Smith 
1077c5929fdfSBarry Smith .seealso: PetscOptionsGetInt(NULL,), PetscOptionsGetReal(),
1078acfcf0e5SJed Brown            PetscOptionsHasName(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool(),
107953acd3b1SBarry Smith           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
108053acd3b1SBarry Smith           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
1081acfcf0e5SJed Brown           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
1082a264d7a6SBarry Smith           PetscOptionsFList(), PetscOptionsEList(), PetscOptionsEnum()
108353acd3b1SBarry Smith @*/
10844416b707SBarry Smith PetscErrorCode  PetscOptionsFList_Private(PetscOptionItems *PetscOptionsObject,const char opt[],const char ltext[],const char man[],PetscFunctionList list,const char currentvalue[],char value[],size_t len,PetscBool  *set)
108553acd3b1SBarry Smith {
108653acd3b1SBarry Smith   PetscErrorCode  ierr;
10874416b707SBarry Smith   PetscOptionItem amsopt;
108853acd3b1SBarry Smith 
108953acd3b1SBarry Smith   PetscFunctionBegin;
10901a1499c8SBarry Smith   if (!PetscOptionsObject->count) {
10914416b707SBarry Smith     ierr = PetscOptionItemCreate_Private(PetscOptionsObject,opt,ltext,man,OPTION_FLIST,&amsopt);CHKERRQ(ierr);
109264facd6cSBarry Smith     /* must use system malloc since SAWs may free this */
10930fdccdaeSBarry Smith     ierr = PetscStrdup(currentvalue ? currentvalue : "",(char**)&amsopt->data);CHKERRQ(ierr);
10943cc1e11dSBarry Smith     amsopt->flist = list;
10953cc1e11dSBarry Smith   }
1096c5929fdfSBarry Smith   ierr = PetscOptionsGetString(PetscOptionsObject->options,PetscOptionsObject->prefix,opt,value,len,set);CHKERRQ(ierr);
10971a1499c8SBarry Smith   if (PetscOptionsObject->printhelp && PetscOptionsObject->count == 1 && !PetscOptionsObject->alreadyprinted) {
10981a1499c8SBarry Smith     ierr = PetscFunctionListPrintTypes(PetscOptionsObject->comm,stdout,PetscOptionsObject->prefix,opt,ltext,man,list,currentvalue);CHKERRQ(ierr);CHKERRQ(ierr);
109953acd3b1SBarry Smith   }
110053acd3b1SBarry Smith   PetscFunctionReturn(0);
110153acd3b1SBarry Smith }
110253acd3b1SBarry Smith 
110353acd3b1SBarry Smith #undef __FUNCT__
1104e55864a3SBarry Smith #define __FUNCT__ "PetscOptionsEList_Private"
110553acd3b1SBarry Smith /*@C
110653acd3b1SBarry Smith      PetscOptionsEList - Puts a list of option values that a single one may be selected from
110753acd3b1SBarry Smith 
11083f9fe445SBarry Smith    Logically Collective on the communicator passed in PetscOptionsBegin()
110953acd3b1SBarry Smith 
111053acd3b1SBarry Smith    Input Parameters:
111153acd3b1SBarry Smith +  opt - option name
111253acd3b1SBarry Smith .  ltext - short string that describes the option
111353acd3b1SBarry Smith .  man - manual page with additional information on option
1114a264d7a6SBarry Smith .  list - the possible choices (one of these must be selected, anything else is invalid)
111553acd3b1SBarry Smith .  ntext - number of choices
11160fdccdaeSBarry Smith -  currentvalue - the current value; caller is responsible for setting this value correctly. Normally this is done with
11170fdccdaeSBarry Smith $                 PetscOptionsElist(..., obj->value,&value,&flg);
11180fdccdaeSBarry Smith $                 if (flg) {
11190fdccdaeSBarry Smith 
112053acd3b1SBarry Smith 
112153acd3b1SBarry Smith    Output Parameter:
112253acd3b1SBarry Smith +  value - the index of the value to return
112353acd3b1SBarry Smith -  set - PETSC_TRUE if found, else PETSC_FALSE
112453acd3b1SBarry Smith 
112553acd3b1SBarry Smith    Level: intermediate
112653acd3b1SBarry Smith 
112753acd3b1SBarry Smith    Notes: Must be between a PetscOptionsBegin() and a PetscOptionsEnd()
112853acd3b1SBarry Smith 
1129a264d7a6SBarry Smith    See PetscOptionsFList() for when the choices are given in a PetscFunctionList()
113053acd3b1SBarry Smith 
113153acd3b1SBarry Smith    Concepts: options database^list
113253acd3b1SBarry Smith 
1133c5929fdfSBarry Smith .seealso: PetscOptionsGetInt(NULL,), PetscOptionsGetReal(),
1134acfcf0e5SJed Brown            PetscOptionsHasName(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool(),
113553acd3b1SBarry Smith           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
113653acd3b1SBarry Smith           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
1137acfcf0e5SJed Brown           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
1138a264d7a6SBarry Smith           PetscOptionsFList(), PetscOptionsEnum()
113953acd3b1SBarry Smith @*/
11404416b707SBarry Smith PetscErrorCode  PetscOptionsEList_Private(PetscOptionItems *PetscOptionsObject,const char opt[],const char ltext[],const char man[],const char *const *list,PetscInt ntext,const char currentvalue[],PetscInt *value,PetscBool  *set)
114153acd3b1SBarry Smith {
114253acd3b1SBarry Smith   PetscErrorCode  ierr;
114353acd3b1SBarry Smith   PetscInt        i;
11444416b707SBarry Smith   PetscOptionItem amsopt;
114553acd3b1SBarry Smith 
114653acd3b1SBarry Smith   PetscFunctionBegin;
11471a1499c8SBarry Smith   if (!PetscOptionsObject->count) {
11484416b707SBarry Smith     ierr = PetscOptionItemCreate_Private(PetscOptionsObject,opt,ltext,man,OPTION_ELIST,&amsopt);CHKERRQ(ierr);
114964facd6cSBarry Smith     /* must use system malloc since SAWs may free this */
11500fdccdaeSBarry Smith     ierr = PetscStrdup(currentvalue ? currentvalue : "",(char**)&amsopt->data);CHKERRQ(ierr);
11516991f827SBarry Smith     ierr = PetscStrNArrayallocpy(ntext,list,(char***)&amsopt->list);CHKERRQ(ierr);
11521ae3d29cSBarry Smith     amsopt->nlist = ntext;
11531ae3d29cSBarry Smith   }
1154c5929fdfSBarry Smith   ierr = PetscOptionsGetEList(PetscOptionsObject->options,PetscOptionsObject->prefix,opt,list,ntext,value,set);CHKERRQ(ierr);
11551a1499c8SBarry Smith   if (PetscOptionsObject->printhelp && PetscOptionsObject->count == 1 && !PetscOptionsObject->alreadyprinted) {
1156*e3f729a5SBarry Smith     ierr = (*PetscHelpPrintf)(PetscOptionsObject->comm,"  -%s%s <%s> %s (choose one of)",PetscOptionsObject->prefix?PetscOptionsObject->prefix:"",opt+1,currentvalue,ltext);CHKERRQ(ierr);
115753acd3b1SBarry Smith     for (i=0; i<ntext; i++) {
1158e55864a3SBarry Smith       ierr = (*PetscHelpPrintf)(PetscOptionsObject->comm," %s",list[i]);CHKERRQ(ierr);
115953acd3b1SBarry Smith     }
1160e55864a3SBarry Smith     ierr = (*PetscHelpPrintf)(PetscOptionsObject->comm," (%s)\n",ManSection(man));CHKERRQ(ierr);
116153acd3b1SBarry Smith   }
116253acd3b1SBarry Smith   PetscFunctionReturn(0);
116353acd3b1SBarry Smith }
116453acd3b1SBarry Smith 
116553acd3b1SBarry Smith #undef __FUNCT__
1166e55864a3SBarry Smith #define __FUNCT__ "PetscOptionsBoolGroupBegin_Private"
116753acd3b1SBarry Smith /*@C
1168acfcf0e5SJed Brown      PetscOptionsBoolGroupBegin - First in a series of logical queries on the options database for
1169d5649816SBarry Smith        which at most a single value can be true.
117053acd3b1SBarry Smith 
11713f9fe445SBarry Smith    Logically Collective on the communicator passed in PetscOptionsBegin()
117253acd3b1SBarry Smith 
117353acd3b1SBarry Smith    Input Parameters:
117453acd3b1SBarry Smith +  opt - option name
117553acd3b1SBarry Smith .  text - short string that describes the option
117653acd3b1SBarry Smith -  man - manual page with additional information on option
117753acd3b1SBarry Smith 
117853acd3b1SBarry Smith    Output Parameter:
117953acd3b1SBarry Smith .  flg - whether that option was set or not
118053acd3b1SBarry Smith 
118153acd3b1SBarry Smith    Level: intermediate
118253acd3b1SBarry Smith 
118353acd3b1SBarry Smith    Notes: Must be between a PetscOptionsBegin() and a PetscOptionsEnd()
118453acd3b1SBarry Smith 
1185acfcf0e5SJed Brown    Must be followed by 0 or more PetscOptionsBoolGroup()s and PetscOptionsBoolGroupEnd()
118653acd3b1SBarry Smith 
118753acd3b1SBarry Smith     Concepts: options database^logical group
118853acd3b1SBarry Smith 
1189c5929fdfSBarry Smith .seealso: PetscOptionsGetInt(NULL,), PetscOptionsGetReal(),
1190acfcf0e5SJed Brown            PetscOptionsHasName(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool(),
119153acd3b1SBarry Smith           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
119253acd3b1SBarry Smith           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
1193acfcf0e5SJed Brown           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
1194a264d7a6SBarry Smith           PetscOptionsFList(), PetscOptionsEList()
119553acd3b1SBarry Smith @*/
11964416b707SBarry Smith PetscErrorCode  PetscOptionsBoolGroupBegin_Private(PetscOptionItems *PetscOptionsObject,const char opt[],const char text[],const char man[],PetscBool  *flg)
119753acd3b1SBarry Smith {
119853acd3b1SBarry Smith   PetscErrorCode  ierr;
11994416b707SBarry Smith   PetscOptionItem amsopt;
120053acd3b1SBarry Smith 
120153acd3b1SBarry Smith   PetscFunctionBegin;
1202e55864a3SBarry Smith   if (!PetscOptionsObject->count) {
12034416b707SBarry Smith     ierr = PetscOptionItemCreate_Private(PetscOptionsObject,opt,text,man,OPTION_BOOL,&amsopt);CHKERRQ(ierr);
1204ace3abfcSBarry Smith     ierr = PetscMalloc(sizeof(PetscBool),&amsopt->data);CHKERRQ(ierr);
1205a297a907SKarl Rupp 
1206ace3abfcSBarry Smith     *(PetscBool*)amsopt->data = PETSC_FALSE;
12071ae3d29cSBarry Smith   }
120868b16fdaSBarry Smith   *flg = PETSC_FALSE;
1209c5929fdfSBarry Smith   ierr = PetscOptionsGetBool(PetscOptionsObject->options,PetscOptionsObject->prefix,opt,flg,NULL);CHKERRQ(ierr);
1210e55864a3SBarry Smith   if (PetscOptionsObject->printhelp && PetscOptionsObject->count == 1 && !PetscOptionsObject->alreadyprinted) {
1211e55864a3SBarry Smith     ierr = (*PetscHelpPrintf)(PetscOptionsObject->comm,"  Pick at most one of -------------\n");CHKERRQ(ierr);
1212e55864a3SBarry Smith     ierr = (*PetscHelpPrintf)(PetscOptionsObject->comm,"    -%s%s: %s (%s)\n",PetscOptionsObject->prefix ? PetscOptionsObject->prefix : "",opt+1,text,ManSection(man));CHKERRQ(ierr);
121353acd3b1SBarry Smith   }
121453acd3b1SBarry Smith   PetscFunctionReturn(0);
121553acd3b1SBarry Smith }
121653acd3b1SBarry Smith 
121753acd3b1SBarry Smith #undef __FUNCT__
1218e55864a3SBarry Smith #define __FUNCT__ "PetscOptionsBoolGroup_Private"
121953acd3b1SBarry Smith /*@C
1220acfcf0e5SJed Brown      PetscOptionsBoolGroup - One in a series of logical queries on the options database for
1221d5649816SBarry Smith        which at most a single value can be true.
122253acd3b1SBarry Smith 
12233f9fe445SBarry Smith    Logically Collective on the communicator passed in PetscOptionsBegin()
122453acd3b1SBarry Smith 
122553acd3b1SBarry Smith    Input Parameters:
122653acd3b1SBarry Smith +  opt - option name
122753acd3b1SBarry Smith .  text - short string that describes the option
122853acd3b1SBarry Smith -  man - manual page with additional information on option
122953acd3b1SBarry Smith 
123053acd3b1SBarry Smith    Output Parameter:
123153acd3b1SBarry Smith .  flg - PETSC_TRUE if found, else PETSC_FALSE
123253acd3b1SBarry Smith 
123353acd3b1SBarry Smith    Level: intermediate
123453acd3b1SBarry Smith 
123553acd3b1SBarry Smith    Notes: Must be between a PetscOptionsBegin() and a PetscOptionsEnd()
123653acd3b1SBarry Smith 
1237acfcf0e5SJed Brown    Must follow a PetscOptionsBoolGroupBegin() and preceded a PetscOptionsBoolGroupEnd()
123853acd3b1SBarry Smith 
123953acd3b1SBarry Smith     Concepts: options database^logical group
124053acd3b1SBarry Smith 
1241c5929fdfSBarry Smith .seealso: PetscOptionsGetInt(NULL,), PetscOptionsGetReal(),
1242acfcf0e5SJed Brown            PetscOptionsHasName(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool(),
124353acd3b1SBarry Smith           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
124453acd3b1SBarry Smith           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
1245acfcf0e5SJed Brown           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
1246a264d7a6SBarry Smith           PetscOptionsFList(), PetscOptionsEList()
124753acd3b1SBarry Smith @*/
12484416b707SBarry Smith PetscErrorCode  PetscOptionsBoolGroup_Private(PetscOptionItems *PetscOptionsObject,const char opt[],const char text[],const char man[],PetscBool  *flg)
124953acd3b1SBarry Smith {
125053acd3b1SBarry Smith   PetscErrorCode  ierr;
12514416b707SBarry Smith   PetscOptionItem amsopt;
125253acd3b1SBarry Smith 
125353acd3b1SBarry Smith   PetscFunctionBegin;
1254e55864a3SBarry Smith   if (!PetscOptionsObject->count) {
12554416b707SBarry Smith     ierr = PetscOptionItemCreate_Private(PetscOptionsObject,opt,text,man,OPTION_BOOL,&amsopt);CHKERRQ(ierr);
1256ace3abfcSBarry Smith     ierr = PetscMalloc(sizeof(PetscBool),&amsopt->data);CHKERRQ(ierr);
1257a297a907SKarl Rupp 
1258ace3abfcSBarry Smith     *(PetscBool*)amsopt->data = PETSC_FALSE;
12591ae3d29cSBarry Smith   }
126017326d04SJed Brown   *flg = PETSC_FALSE;
1261c5929fdfSBarry Smith   ierr = PetscOptionsGetBool(PetscOptionsObject->options,PetscOptionsObject->prefix,opt,flg,NULL);CHKERRQ(ierr);
1262e55864a3SBarry Smith   if (PetscOptionsObject->printhelp && PetscOptionsObject->count == 1 && !PetscOptionsObject->alreadyprinted) {
1263e55864a3SBarry Smith     ierr = (*PetscHelpPrintf)(PetscOptionsObject->comm,"    -%s%s: %s (%s)\n",PetscOptionsObject->prefix ? PetscOptionsObject->prefix : "",opt+1,text,ManSection(man));CHKERRQ(ierr);
126453acd3b1SBarry Smith   }
126553acd3b1SBarry Smith   PetscFunctionReturn(0);
126653acd3b1SBarry Smith }
126753acd3b1SBarry Smith 
126853acd3b1SBarry Smith #undef __FUNCT__
1269e55864a3SBarry Smith #define __FUNCT__ "PetscOptionsBoolGroupEnd_Private"
127053acd3b1SBarry Smith /*@C
1271acfcf0e5SJed Brown      PetscOptionsBoolGroupEnd - Last in a series of logical queries on the options database for
1272d5649816SBarry Smith        which at most a single value can be true.
127353acd3b1SBarry Smith 
12743f9fe445SBarry Smith    Logically Collective on the communicator passed in PetscOptionsBegin()
127553acd3b1SBarry Smith 
127653acd3b1SBarry Smith    Input Parameters:
127753acd3b1SBarry Smith +  opt - option name
127853acd3b1SBarry Smith .  text - short string that describes the option
127953acd3b1SBarry Smith -  man - manual page with additional information on option
128053acd3b1SBarry Smith 
128153acd3b1SBarry Smith    Output Parameter:
128253acd3b1SBarry Smith .  flg - PETSC_TRUE if found, else PETSC_FALSE
128353acd3b1SBarry Smith 
128453acd3b1SBarry Smith    Level: intermediate
128553acd3b1SBarry Smith 
128653acd3b1SBarry Smith    Notes: Must be between a PetscOptionsBegin() and a PetscOptionsEnd()
128753acd3b1SBarry Smith 
1288acfcf0e5SJed Brown    Must follow a PetscOptionsBoolGroupBegin()
128953acd3b1SBarry Smith 
129053acd3b1SBarry Smith     Concepts: options database^logical group
129153acd3b1SBarry Smith 
1292c5929fdfSBarry Smith .seealso: PetscOptionsGetInt(NULL,), PetscOptionsGetReal(),
1293acfcf0e5SJed Brown            PetscOptionsHasName(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool(),
129453acd3b1SBarry Smith           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
129553acd3b1SBarry Smith           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
1296acfcf0e5SJed Brown           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
1297a264d7a6SBarry Smith           PetscOptionsFList(), PetscOptionsEList()
129853acd3b1SBarry Smith @*/
12994416b707SBarry Smith PetscErrorCode  PetscOptionsBoolGroupEnd_Private(PetscOptionItems *PetscOptionsObject,const char opt[],const char text[],const char man[],PetscBool  *flg)
130053acd3b1SBarry Smith {
130153acd3b1SBarry Smith   PetscErrorCode  ierr;
13024416b707SBarry Smith   PetscOptionItem amsopt;
130353acd3b1SBarry Smith 
130453acd3b1SBarry Smith   PetscFunctionBegin;
1305e55864a3SBarry Smith   if (!PetscOptionsObject->count) {
13064416b707SBarry Smith     ierr = PetscOptionItemCreate_Private(PetscOptionsObject,opt,text,man,OPTION_BOOL,&amsopt);CHKERRQ(ierr);
1307ace3abfcSBarry Smith     ierr = PetscMalloc(sizeof(PetscBool),&amsopt->data);CHKERRQ(ierr);
1308a297a907SKarl Rupp 
1309ace3abfcSBarry Smith     *(PetscBool*)amsopt->data = PETSC_FALSE;
13101ae3d29cSBarry Smith   }
131117326d04SJed Brown   *flg = PETSC_FALSE;
1312c5929fdfSBarry Smith   ierr = PetscOptionsGetBool(PetscOptionsObject->options,PetscOptionsObject->prefix,opt,flg,NULL);CHKERRQ(ierr);
1313e55864a3SBarry Smith   if (PetscOptionsObject->printhelp && PetscOptionsObject->count == 1 && !PetscOptionsObject->alreadyprinted) {
1314e55864a3SBarry Smith     ierr = (*PetscHelpPrintf)(PetscOptionsObject->comm,"    -%s%s: %s (%s)\n",PetscOptionsObject->prefix ? PetscOptionsObject->prefix : "",opt+1,text,ManSection(man));CHKERRQ(ierr);
131553acd3b1SBarry Smith   }
131653acd3b1SBarry Smith   PetscFunctionReturn(0);
131753acd3b1SBarry Smith }
131853acd3b1SBarry Smith 
131953acd3b1SBarry Smith #undef __FUNCT__
1320e55864a3SBarry Smith #define __FUNCT__ "PetscOptionsBool_Private"
132153acd3b1SBarry Smith /*@C
1322acfcf0e5SJed Brown    PetscOptionsBool - Determines if a particular option is in the database with a true or false
132353acd3b1SBarry Smith 
13243f9fe445SBarry Smith    Logically Collective on the communicator passed in PetscOptionsBegin()
132553acd3b1SBarry Smith 
132653acd3b1SBarry Smith    Input Parameters:
132753acd3b1SBarry Smith +  opt - option name
132853acd3b1SBarry Smith .  text - short string that describes the option
1329868c398cSBarry Smith .  man - manual page with additional information on option
133094ae4db5SBarry Smith -  currentvalue - the current value
133153acd3b1SBarry Smith 
133253acd3b1SBarry Smith    Output Parameter:
133353acd3b1SBarry Smith .  flg - PETSC_TRUE or PETSC_FALSE
133453acd3b1SBarry Smith .  set - PETSC_TRUE if found, else PETSC_FALSE
133553acd3b1SBarry Smith 
133653acd3b1SBarry Smith    Level: beginner
133753acd3b1SBarry Smith 
133853acd3b1SBarry Smith    Concepts: options database^logical
133953acd3b1SBarry Smith 
134053acd3b1SBarry Smith    Notes: Must be between a PetscOptionsBegin() and a PetscOptionsEnd()
134153acd3b1SBarry Smith 
1342c5929fdfSBarry Smith .seealso: PetscOptionsGetReal(), PetscOptionsHasName(), PetscOptionsGetString(), PetscOptionsGetInt(NULL,),
1343acfcf0e5SJed Brown           PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool()
1344acfcf0e5SJed Brown           PetscOptionsInt(), PetscOptionsString(), PetscOptionsReal(), PetscOptionsBool(),
134553acd3b1SBarry Smith           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
134653acd3b1SBarry Smith           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
1347acfcf0e5SJed Brown           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
1348a264d7a6SBarry Smith           PetscOptionsFList(), PetscOptionsEList()
134953acd3b1SBarry Smith @*/
13504416b707SBarry Smith PetscErrorCode  PetscOptionsBool_Private(PetscOptionItems *PetscOptionsObject,const char opt[],const char text[],const char man[],PetscBool currentvalue,PetscBool  *flg,PetscBool  *set)
135153acd3b1SBarry Smith {
135253acd3b1SBarry Smith   PetscErrorCode  ierr;
1353ace3abfcSBarry Smith   PetscBool       iset;
13544416b707SBarry Smith   PetscOptionItem amsopt;
135553acd3b1SBarry Smith 
135653acd3b1SBarry Smith   PetscFunctionBegin;
1357e55864a3SBarry Smith   if (!PetscOptionsObject->count) {
13584416b707SBarry Smith     ierr = PetscOptionItemCreate_Private(PetscOptionsObject,opt,text,man,OPTION_BOOL,&amsopt);CHKERRQ(ierr);
1359ace3abfcSBarry Smith     ierr = PetscMalloc(sizeof(PetscBool),&amsopt->data);CHKERRQ(ierr);
1360a297a907SKarl Rupp 
136194ae4db5SBarry Smith     *(PetscBool*)amsopt->data = currentvalue;
1362af6d86caSBarry Smith   }
1363c5929fdfSBarry Smith   ierr = PetscOptionsGetBool(PetscOptionsObject->options,PetscOptionsObject->prefix,opt,flg,&iset);CHKERRQ(ierr);
136453acd3b1SBarry Smith   if (set) *set = iset;
13651a1499c8SBarry Smith   if (PetscOptionsObject->printhelp && PetscOptionsObject->count == 1 && !PetscOptionsObject->alreadyprinted) {
136694ae4db5SBarry Smith     const char *v = PetscBools[currentvalue];
13671a1499c8SBarry Smith     ierr = (*PetscHelpPrintf)(PetscOptionsObject->comm,"  -%s%s: <%s> %s (%s)\n",PetscOptionsObject->prefix?PetscOptionsObject->prefix:"",opt+1,v,text,ManSection(man));CHKERRQ(ierr);
136853acd3b1SBarry Smith   }
136953acd3b1SBarry Smith   PetscFunctionReturn(0);
137053acd3b1SBarry Smith }
137153acd3b1SBarry Smith 
137253acd3b1SBarry Smith #undef __FUNCT__
1373e55864a3SBarry Smith #define __FUNCT__ "PetscOptionsRealArray_Private"
137453acd3b1SBarry Smith /*@C
137553acd3b1SBarry Smith    PetscOptionsRealArray - Gets an array of double values for a particular
137653acd3b1SBarry Smith    option in the database. The values must be separated with commas with
137753acd3b1SBarry Smith    no intervening spaces.
137853acd3b1SBarry Smith 
13793f9fe445SBarry Smith    Logically Collective on the communicator passed in PetscOptionsBegin()
138053acd3b1SBarry Smith 
138153acd3b1SBarry Smith    Input Parameters:
138253acd3b1SBarry Smith +  opt - the option one is seeking
138353acd3b1SBarry Smith .  text - short string describing option
138453acd3b1SBarry Smith .  man - manual page for option
138553acd3b1SBarry Smith -  nmax - maximum number of values
138653acd3b1SBarry Smith 
138753acd3b1SBarry Smith    Output Parameter:
138853acd3b1SBarry Smith +  value - location to copy values
138953acd3b1SBarry Smith .  nmax - actual number of values found
139053acd3b1SBarry Smith -  set - PETSC_TRUE if found, else PETSC_FALSE
139153acd3b1SBarry Smith 
139253acd3b1SBarry Smith    Level: beginner
139353acd3b1SBarry Smith 
139453acd3b1SBarry Smith    Notes:
139553acd3b1SBarry Smith    The user should pass in an array of doubles
139653acd3b1SBarry Smith 
139753acd3b1SBarry Smith    Must be between a PetscOptionsBegin() and a PetscOptionsEnd()
139853acd3b1SBarry Smith 
139953acd3b1SBarry Smith    Concepts: options database^array of strings
140053acd3b1SBarry Smith 
1401c5929fdfSBarry Smith .seealso: PetscOptionsGetInt(NULL,), PetscOptionsGetReal(),
1402acfcf0e5SJed Brown            PetscOptionsHasName(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool(),
140353acd3b1SBarry Smith           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
140453acd3b1SBarry Smith           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
1405acfcf0e5SJed Brown           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
1406a264d7a6SBarry Smith           PetscOptionsFList(), PetscOptionsEList()
140753acd3b1SBarry Smith @*/
14084416b707SBarry Smith PetscErrorCode PetscOptionsRealArray_Private(PetscOptionItems *PetscOptionsObject,const char opt[],const char text[],const char man[],PetscReal value[],PetscInt *n,PetscBool  *set)
140953acd3b1SBarry Smith {
141053acd3b1SBarry Smith   PetscErrorCode  ierr;
141153acd3b1SBarry Smith   PetscInt        i;
14124416b707SBarry Smith   PetscOptionItem amsopt;
141353acd3b1SBarry Smith 
141453acd3b1SBarry Smith   PetscFunctionBegin;
1415e55864a3SBarry Smith   if (!PetscOptionsObject->count) {
1416e26ddf31SBarry Smith     PetscReal *vals;
1417e26ddf31SBarry Smith 
14184416b707SBarry Smith     ierr = PetscOptionItemCreate_Private(PetscOptionsObject,opt,text,man,OPTION_REAL_ARRAY,&amsopt);CHKERRQ(ierr);
1419e55864a3SBarry Smith     ierr = PetscMalloc((*n)*sizeof(PetscReal),&amsopt->data);CHKERRQ(ierr);
1420e26ddf31SBarry Smith     vals = (PetscReal*)amsopt->data;
1421e26ddf31SBarry Smith     for (i=0; i<*n; i++) vals[i] = value[i];
1422e26ddf31SBarry Smith     amsopt->arraylength = *n;
1423e26ddf31SBarry Smith   }
1424c5929fdfSBarry Smith   ierr = PetscOptionsGetRealArray(PetscOptionsObject->options,PetscOptionsObject->prefix,opt,value,n,set);CHKERRQ(ierr);
1425e55864a3SBarry Smith   if (PetscOptionsObject->printhelp && PetscOptionsObject->count == 1 && !PetscOptionsObject->alreadyprinted) {
1426a519f713SBarry Smith     ierr = (*PetscHelpPrintf)(PetscOptionsObject->comm,"  -%s%s <%g",PetscOptionsObject->prefix?PetscOptionsObject->prefix:"",opt+1,(double)value[0]);CHKERRQ(ierr);
142753acd3b1SBarry Smith     for (i=1; i<*n; i++) {
1428e55864a3SBarry Smith       ierr = (*PetscHelpPrintf)(PetscOptionsObject->comm,",%g",(double)value[i]);CHKERRQ(ierr);
142953acd3b1SBarry Smith     }
1430e55864a3SBarry Smith     ierr = (*PetscHelpPrintf)(PetscOptionsObject->comm,">: %s (%s)\n",text,ManSection(man));CHKERRQ(ierr);
143153acd3b1SBarry Smith   }
143253acd3b1SBarry Smith   PetscFunctionReturn(0);
143353acd3b1SBarry Smith }
143453acd3b1SBarry Smith 
1435050cccc3SHong Zhang #undef __FUNCT__
1436050cccc3SHong Zhang #define __FUNCT__ "PetscOptionsScalarArray_Private"
1437050cccc3SHong Zhang /*@C
1438050cccc3SHong Zhang    PetscOptionsScalarArray - Gets an array of Scalar values for a particular
1439050cccc3SHong Zhang    option in the database. The values must be separated with commas with
1440050cccc3SHong Zhang    no intervening spaces.
1441050cccc3SHong Zhang 
1442050cccc3SHong Zhang    Logically Collective on the communicator passed in PetscOptionsBegin()
1443050cccc3SHong Zhang 
1444050cccc3SHong Zhang    Input Parameters:
1445050cccc3SHong Zhang +  opt - the option one is seeking
1446050cccc3SHong Zhang .  text - short string describing option
1447050cccc3SHong Zhang .  man - manual page for option
1448050cccc3SHong Zhang -  nmax - maximum number of values
1449050cccc3SHong Zhang 
1450050cccc3SHong Zhang    Output Parameter:
1451050cccc3SHong Zhang +  value - location to copy values
1452050cccc3SHong Zhang .  nmax - actual number of values found
1453050cccc3SHong Zhang -  set - PETSC_TRUE if found, else PETSC_FALSE
1454050cccc3SHong Zhang 
1455050cccc3SHong Zhang    Level: beginner
1456050cccc3SHong Zhang 
1457050cccc3SHong Zhang    Notes:
1458050cccc3SHong Zhang    The user should pass in an array of doubles
1459050cccc3SHong Zhang 
1460050cccc3SHong Zhang    Must be between a PetscOptionsBegin() and a PetscOptionsEnd()
1461050cccc3SHong Zhang 
1462050cccc3SHong Zhang    Concepts: options database^array of strings
1463050cccc3SHong Zhang 
1464c5929fdfSBarry Smith .seealso: PetscOptionsGetInt(NULL,), PetscOptionsGetReal(),
1465050cccc3SHong Zhang           PetscOptionsHasName(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool(),
1466050cccc3SHong Zhang           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
1467050cccc3SHong Zhang           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
1468050cccc3SHong Zhang           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
1469050cccc3SHong Zhang           PetscOptionsFList(), PetscOptionsEList()
1470050cccc3SHong Zhang @*/
14714416b707SBarry Smith PetscErrorCode PetscOptionsScalarArray_Private(PetscOptionItems *PetscOptionsObject,const char opt[],const char text[],const char man[],PetscScalar value[],PetscInt *n,PetscBool  *set)
1472050cccc3SHong Zhang {
1473050cccc3SHong Zhang   PetscErrorCode  ierr;
1474050cccc3SHong Zhang   PetscInt        i;
14754416b707SBarry Smith   PetscOptionItem amsopt;
1476050cccc3SHong Zhang 
1477050cccc3SHong Zhang   PetscFunctionBegin;
1478050cccc3SHong Zhang   if (!PetscOptionsObject->count) {
1479050cccc3SHong Zhang     PetscScalar *vals;
1480050cccc3SHong Zhang 
14814416b707SBarry Smith     ierr = PetscOptionItemCreate_Private(PetscOptionsObject,opt,text,man,OPTION_SCALAR_ARRAY,&amsopt);CHKERRQ(ierr);
1482050cccc3SHong Zhang     ierr = PetscMalloc((*n)*sizeof(PetscScalar),&amsopt->data);CHKERRQ(ierr);
1483050cccc3SHong Zhang     vals = (PetscScalar*)amsopt->data;
1484050cccc3SHong Zhang     for (i=0; i<*n; i++) vals[i] = value[i];
1485050cccc3SHong Zhang     amsopt->arraylength = *n;
1486050cccc3SHong Zhang   }
1487c5929fdfSBarry Smith   ierr = PetscOptionsGetScalarArray(PetscOptionsObject->options,PetscOptionsObject->prefix,opt,value,n,set);CHKERRQ(ierr);
1488050cccc3SHong Zhang   if (PetscOptionsObject->printhelp && PetscOptionsObject->count == 1 && !PetscOptionsObject->alreadyprinted) {
148995f3a755SJose E. Roman     ierr = (*PetscHelpPrintf)(PetscOptionsObject->comm,"  -%s%s <%g+%gi",PetscOptionsObject->prefix?PetscOptionsObject->prefix:"",opt+1,(double)PetscRealPart(value[0]),(double)PetscImaginaryPart(value[0]));CHKERRQ(ierr);
1490050cccc3SHong Zhang     for (i=1; i<*n; i++) {
149195f3a755SJose E. Roman       ierr = (*PetscHelpPrintf)(PetscOptionsObject->comm,",%g+%gi",(double)PetscRealPart(value[i]),(double)PetscImaginaryPart(value[i]));CHKERRQ(ierr);
1492050cccc3SHong Zhang     }
1493050cccc3SHong Zhang     ierr = (*PetscHelpPrintf)(PetscOptionsObject->comm,">: %s (%s)\n",text,ManSection(man));CHKERRQ(ierr);
1494050cccc3SHong Zhang   }
1495050cccc3SHong Zhang   PetscFunctionReturn(0);
1496050cccc3SHong Zhang }
149753acd3b1SBarry Smith 
149853acd3b1SBarry Smith #undef __FUNCT__
1499e55864a3SBarry Smith #define __FUNCT__ "PetscOptionsIntArray_Private"
150053acd3b1SBarry Smith /*@C
150153acd3b1SBarry Smith    PetscOptionsIntArray - Gets an array of integers for a particular
1502b32a342fSShri Abhyankar    option in the database.
150353acd3b1SBarry Smith 
15043f9fe445SBarry Smith    Logically Collective on the communicator passed in PetscOptionsBegin()
150553acd3b1SBarry Smith 
150653acd3b1SBarry Smith    Input Parameters:
150753acd3b1SBarry Smith +  opt - the option one is seeking
150853acd3b1SBarry Smith .  text - short string describing option
150953acd3b1SBarry Smith .  man - manual page for option
1510f8a50e2bSBarry Smith -  n - maximum number of values
151153acd3b1SBarry Smith 
151253acd3b1SBarry Smith    Output Parameter:
151353acd3b1SBarry Smith +  value - location to copy values
1514f8a50e2bSBarry Smith .  n - actual number of values found
151553acd3b1SBarry Smith -  set - PETSC_TRUE if found, else PETSC_FALSE
151653acd3b1SBarry Smith 
151753acd3b1SBarry Smith    Level: beginner
151853acd3b1SBarry Smith 
151953acd3b1SBarry Smith    Notes:
1520b32a342fSShri Abhyankar    The array can be passed as
1521bebe2cf6SSatish Balay    a comma separated list:                                 0,1,2,3,4,5,6,7
15220fd488f5SShri Abhyankar    a range (start-end+1):                                  0-8
15230fd488f5SShri Abhyankar    a range with given increment (start-end+1:inc):         0-7:2
1524bebe2cf6SSatish Balay    a combination of values and ranges separated by commas: 0,1-8,8-15:2
1525b32a342fSShri Abhyankar 
1526b32a342fSShri Abhyankar    There must be no intervening spaces between the values.
152753acd3b1SBarry Smith 
152853acd3b1SBarry Smith    Must be between a PetscOptionsBegin() and a PetscOptionsEnd()
152953acd3b1SBarry Smith 
1530b32a342fSShri Abhyankar    Concepts: options database^array of ints
153153acd3b1SBarry Smith 
1532c5929fdfSBarry Smith .seealso: PetscOptionsGetInt(NULL,), PetscOptionsGetReal(),
1533acfcf0e5SJed Brown            PetscOptionsHasName(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool(),
153453acd3b1SBarry Smith           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
153553acd3b1SBarry Smith           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
1536acfcf0e5SJed Brown           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
1537a264d7a6SBarry Smith           PetscOptionsFList(), PetscOptionsEList(), PetscOptionsRealArray()
153853acd3b1SBarry Smith @*/
15394416b707SBarry Smith PetscErrorCode  PetscOptionsIntArray_Private(PetscOptionItems *PetscOptionsObject,const char opt[],const char text[],const char man[],PetscInt value[],PetscInt *n,PetscBool  *set)
154053acd3b1SBarry Smith {
154153acd3b1SBarry Smith   PetscErrorCode ierr;
154253acd3b1SBarry Smith   PetscInt        i;
15434416b707SBarry Smith   PetscOptionItem amsopt;
154453acd3b1SBarry Smith 
154553acd3b1SBarry Smith   PetscFunctionBegin;
1546e55864a3SBarry Smith   if (!PetscOptionsObject->count) {
1547e26ddf31SBarry Smith     PetscInt *vals;
1548e26ddf31SBarry Smith 
15494416b707SBarry Smith     ierr = PetscOptionItemCreate_Private(PetscOptionsObject,opt,text,man,OPTION_INT_ARRAY,&amsopt);CHKERRQ(ierr);
1550854ce69bSBarry Smith     ierr = PetscMalloc1(*n,(PetscInt**)&amsopt->data);CHKERRQ(ierr);
1551e26ddf31SBarry Smith     vals = (PetscInt*)amsopt->data;
1552e26ddf31SBarry Smith     for (i=0; i<*n; i++) vals[i] = value[i];
1553e26ddf31SBarry Smith     amsopt->arraylength = *n;
1554e26ddf31SBarry Smith   }
1555c5929fdfSBarry Smith   ierr = PetscOptionsGetIntArray(PetscOptionsObject->options,PetscOptionsObject->prefix,opt,value,n,set);CHKERRQ(ierr);
1556e55864a3SBarry Smith   if (PetscOptionsObject->printhelp && PetscOptionsObject->count == 1 && !PetscOptionsObject->alreadyprinted) {
1557e55864a3SBarry Smith     ierr = (*PetscHelpPrintf)(PetscOptionsObject->comm,"  -%s%s <%d",PetscOptionsObject->prefix ? PetscOptionsObject->prefix : "",opt+1,value[0]);CHKERRQ(ierr);
155853acd3b1SBarry Smith     for (i=1; i<*n; i++) {
1559e55864a3SBarry Smith       ierr = (*PetscHelpPrintf)(PetscOptionsObject->comm,",%d",value[i]);CHKERRQ(ierr);
156053acd3b1SBarry Smith     }
1561e55864a3SBarry Smith     ierr = (*PetscHelpPrintf)(PetscOptionsObject->comm,">: %s (%s)\n",text,ManSection(man));CHKERRQ(ierr);
156253acd3b1SBarry Smith   }
156353acd3b1SBarry Smith   PetscFunctionReturn(0);
156453acd3b1SBarry Smith }
156553acd3b1SBarry Smith 
156653acd3b1SBarry Smith #undef __FUNCT__
1567e55864a3SBarry Smith #define __FUNCT__ "PetscOptionsStringArray_Private"
156853acd3b1SBarry Smith /*@C
156953acd3b1SBarry Smith    PetscOptionsStringArray - Gets an array of string values for a particular
157053acd3b1SBarry Smith    option in the database. The values must be separated with commas with
157153acd3b1SBarry Smith    no intervening spaces.
157253acd3b1SBarry Smith 
15733f9fe445SBarry Smith    Logically Collective on the communicator passed in PetscOptionsBegin()
157453acd3b1SBarry Smith 
157553acd3b1SBarry Smith    Input Parameters:
157653acd3b1SBarry Smith +  opt - the option one is seeking
157753acd3b1SBarry Smith .  text - short string describing option
157853acd3b1SBarry Smith .  man - manual page for option
157953acd3b1SBarry Smith -  nmax - maximum number of strings
158053acd3b1SBarry Smith 
158153acd3b1SBarry Smith    Output Parameter:
158253acd3b1SBarry Smith +  value - location to copy strings
158353acd3b1SBarry Smith .  nmax - actual number of strings found
158453acd3b1SBarry Smith -  set - PETSC_TRUE if found, else PETSC_FALSE
158553acd3b1SBarry Smith 
158653acd3b1SBarry Smith    Level: beginner
158753acd3b1SBarry Smith 
158853acd3b1SBarry Smith    Notes:
158953acd3b1SBarry Smith    The user should pass in an array of pointers to char, to hold all the
159053acd3b1SBarry Smith    strings returned by this function.
159153acd3b1SBarry Smith 
159253acd3b1SBarry Smith    The user is responsible for deallocating the strings that are
159353acd3b1SBarry Smith    returned. The Fortran interface for this routine is not supported.
159453acd3b1SBarry Smith 
159553acd3b1SBarry Smith    Must be between a PetscOptionsBegin() and a PetscOptionsEnd()
159653acd3b1SBarry Smith 
159753acd3b1SBarry Smith    Concepts: options database^array of strings
159853acd3b1SBarry Smith 
1599c5929fdfSBarry Smith .seealso: PetscOptionsGetInt(NULL,), PetscOptionsGetReal(),
1600acfcf0e5SJed Brown            PetscOptionsHasName(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool(),
160153acd3b1SBarry Smith           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
160253acd3b1SBarry Smith           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
1603acfcf0e5SJed Brown           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
1604a264d7a6SBarry Smith           PetscOptionsFList(), PetscOptionsEList()
160553acd3b1SBarry Smith @*/
16064416b707SBarry Smith PetscErrorCode  PetscOptionsStringArray_Private(PetscOptionItems *PetscOptionsObject,const char opt[],const char text[],const char man[],char *value[],PetscInt *nmax,PetscBool  *set)
160753acd3b1SBarry Smith {
160853acd3b1SBarry Smith   PetscErrorCode  ierr;
16094416b707SBarry Smith   PetscOptionItem amsopt;
161053acd3b1SBarry Smith 
161153acd3b1SBarry Smith   PetscFunctionBegin;
1612e55864a3SBarry Smith   if (!PetscOptionsObject->count) {
16134416b707SBarry Smith     ierr = PetscOptionItemCreate_Private(PetscOptionsObject,opt,text,man,OPTION_STRING_ARRAY,&amsopt);CHKERRQ(ierr);
1614854ce69bSBarry Smith     ierr = PetscMalloc1(*nmax,(char**)&amsopt->data);CHKERRQ(ierr);
1615a297a907SKarl Rupp 
16161ae3d29cSBarry Smith     amsopt->arraylength = *nmax;
16171ae3d29cSBarry Smith   }
1618c5929fdfSBarry Smith   ierr = PetscOptionsGetStringArray(PetscOptionsObject->options,PetscOptionsObject->prefix,opt,value,nmax,set);CHKERRQ(ierr);
1619e55864a3SBarry Smith   if (PetscOptionsObject->printhelp && PetscOptionsObject->count == 1 && !PetscOptionsObject->alreadyprinted) {
1620e55864a3SBarry Smith     ierr = (*PetscHelpPrintf)(PetscOptionsObject->comm,"  -%s%s <string1,string2,...>: %s (%s)\n",PetscOptionsObject->prefix ? PetscOptionsObject->prefix : "",opt+1,text,ManSection(man));CHKERRQ(ierr);
162153acd3b1SBarry Smith   }
162253acd3b1SBarry Smith   PetscFunctionReturn(0);
162353acd3b1SBarry Smith }
162453acd3b1SBarry Smith 
1625e2446a98SMatthew Knepley #undef __FUNCT__
1626e55864a3SBarry Smith #define __FUNCT__ "PetscOptionsBoolArray_Private"
1627e2446a98SMatthew Knepley /*@C
1628acfcf0e5SJed Brown    PetscOptionsBoolArray - Gets an array of logical values (true or false) for a particular
1629e2446a98SMatthew Knepley    option in the database. The values must be separated with commas with
1630e2446a98SMatthew Knepley    no intervening spaces.
1631e2446a98SMatthew Knepley 
16323f9fe445SBarry Smith    Logically Collective on the communicator passed in PetscOptionsBegin()
1633e2446a98SMatthew Knepley 
1634e2446a98SMatthew Knepley    Input Parameters:
1635e2446a98SMatthew Knepley +  opt - the option one is seeking
1636e2446a98SMatthew Knepley .  text - short string describing option
1637e2446a98SMatthew Knepley .  man - manual page for option
1638e2446a98SMatthew Knepley -  nmax - maximum number of values
1639e2446a98SMatthew Knepley 
1640e2446a98SMatthew Knepley    Output Parameter:
1641e2446a98SMatthew Knepley +  value - location to copy values
1642e2446a98SMatthew Knepley .  nmax - actual number of values found
1643e2446a98SMatthew Knepley -  set - PETSC_TRUE if found, else PETSC_FALSE
1644e2446a98SMatthew Knepley 
1645e2446a98SMatthew Knepley    Level: beginner
1646e2446a98SMatthew Knepley 
1647e2446a98SMatthew Knepley    Notes:
1648e2446a98SMatthew Knepley    The user should pass in an array of doubles
1649e2446a98SMatthew Knepley 
1650e2446a98SMatthew Knepley    Must be between a PetscOptionsBegin() and a PetscOptionsEnd()
1651e2446a98SMatthew Knepley 
1652e2446a98SMatthew Knepley    Concepts: options database^array of strings
1653e2446a98SMatthew Knepley 
1654c5929fdfSBarry Smith .seealso: PetscOptionsGetInt(NULL,), PetscOptionsGetReal(),
1655acfcf0e5SJed Brown            PetscOptionsHasName(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool(),
1656e2446a98SMatthew Knepley           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
1657e2446a98SMatthew Knepley           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
1658acfcf0e5SJed Brown           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
1659a264d7a6SBarry Smith           PetscOptionsFList(), PetscOptionsEList()
1660e2446a98SMatthew Knepley @*/
16614416b707SBarry Smith PetscErrorCode  PetscOptionsBoolArray_Private(PetscOptionItems *PetscOptionsObject,const char opt[],const char text[],const char man[],PetscBool value[],PetscInt *n,PetscBool *set)
1662e2446a98SMatthew Knepley {
1663e2446a98SMatthew Knepley   PetscErrorCode   ierr;
1664e2446a98SMatthew Knepley   PetscInt         i;
16654416b707SBarry Smith   PetscOptionItem  amsopt;
1666e2446a98SMatthew Knepley 
1667e2446a98SMatthew Knepley   PetscFunctionBegin;
1668e55864a3SBarry Smith   if (!PetscOptionsObject->count) {
1669ace3abfcSBarry Smith     PetscBool *vals;
16701ae3d29cSBarry Smith 
16714416b707SBarry Smith     ierr = PetscOptionItemCreate_Private(PetscOptionsObject,opt,text,man,OPTION_BOOL_ARRAY,&amsopt);CHKERRQ(ierr);
16721a1499c8SBarry Smith     ierr = PetscMalloc1(*n,(PetscBool**)&amsopt->data);CHKERRQ(ierr);
1673ace3abfcSBarry Smith     vals = (PetscBool*)amsopt->data;
16741ae3d29cSBarry Smith     for (i=0; i<*n; i++) vals[i] = value[i];
16751ae3d29cSBarry Smith     amsopt->arraylength = *n;
16761ae3d29cSBarry Smith   }
1677c5929fdfSBarry Smith   ierr = PetscOptionsGetBoolArray(PetscOptionsObject->options,PetscOptionsObject->prefix,opt,value,n,set);CHKERRQ(ierr);
1678e55864a3SBarry Smith   if (PetscOptionsObject->printhelp && PetscOptionsObject->count == 1 && !PetscOptionsObject->alreadyprinted) {
1679e55864a3SBarry Smith     ierr = (*PetscHelpPrintf)(PetscOptionsObject->comm,"  -%s%s <%d",PetscOptionsObject->prefix ? PetscOptionsObject->prefix : "",opt+1,value[0]);CHKERRQ(ierr);
1680e2446a98SMatthew Knepley     for (i=1; i<*n; i++) {
1681e55864a3SBarry Smith       ierr = (*PetscHelpPrintf)(PetscOptionsObject->comm,",%d",value[i]);CHKERRQ(ierr);
1682e2446a98SMatthew Knepley     }
1683e55864a3SBarry Smith     ierr = (*PetscHelpPrintf)(PetscOptionsObject->comm,">: %s (%s)\n",text,ManSection(man));CHKERRQ(ierr);
1684e2446a98SMatthew Knepley   }
1685e2446a98SMatthew Knepley   PetscFunctionReturn(0);
1686e2446a98SMatthew Knepley }
1687e2446a98SMatthew Knepley 
16888cc676e6SMatthew G Knepley #undef __FUNCT__
1689e55864a3SBarry Smith #define __FUNCT__ "PetscOptionsViewer_Private"
16908cc676e6SMatthew G Knepley /*@C
1691d1da0b69SBarry Smith    PetscOptionsViewer - Gets a viewer appropriate for the type indicated by the user
16928cc676e6SMatthew G Knepley 
16938cc676e6SMatthew G Knepley    Logically Collective on the communicator passed in PetscOptionsBegin()
16948cc676e6SMatthew G Knepley 
16958cc676e6SMatthew G Knepley    Input Parameters:
16968cc676e6SMatthew G Knepley +  opt - option name
16978cc676e6SMatthew G Knepley .  text - short string that describes the option
16988cc676e6SMatthew G Knepley -  man - manual page with additional information on option
16998cc676e6SMatthew G Knepley 
17008cc676e6SMatthew G Knepley    Output Parameter:
17018cc676e6SMatthew G Knepley +  viewer - the viewer
17028cc676e6SMatthew G Knepley -  set - PETSC_TRUE if found, else PETSC_FALSE
17038cc676e6SMatthew G Knepley 
17048cc676e6SMatthew G Knepley    Level: beginner
17058cc676e6SMatthew G Knepley 
17068cc676e6SMatthew G Knepley    Concepts: options database^has int
17078cc676e6SMatthew G Knepley 
17088cc676e6SMatthew G Knepley    Notes: Must be between a PetscOptionsBegin() and a PetscOptionsEnd()
17098cc676e6SMatthew G Knepley 
17105a7113b9SPatrick Sanan    See PetscOptionsGetViewer() for the format of the supplied viewer and its options
17118cc676e6SMatthew G Knepley 
1712c5929fdfSBarry Smith .seealso: PetscOptionsGetViewer(), PetscOptionsHasName(), PetscOptionsGetString(), PetscOptionsGetInt(NULL,),
17138cc676e6SMatthew G Knepley           PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool()
17148cc676e6SMatthew G Knepley           PetscOptionsInt(), PetscOptionsString(), PetscOptionsReal(), PetscOptionsBool(),
17158cc676e6SMatthew G Knepley           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
17168cc676e6SMatthew G Knepley           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
17178cc676e6SMatthew G Knepley           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
1718a264d7a6SBarry Smith           PetscOptionsFList(), PetscOptionsEList()
17198cc676e6SMatthew G Knepley @*/
17204416b707SBarry Smith PetscErrorCode  PetscOptionsViewer_Private(PetscOptionItems *PetscOptionsObject,const char opt[],const char text[],const char man[],PetscViewer *viewer,PetscViewerFormat *format,PetscBool  *set)
17218cc676e6SMatthew G Knepley {
17228cc676e6SMatthew G Knepley   PetscErrorCode  ierr;
17234416b707SBarry Smith   PetscOptionItem amsopt;
17248cc676e6SMatthew G Knepley 
17258cc676e6SMatthew G Knepley   PetscFunctionBegin;
17261a1499c8SBarry Smith   if (!PetscOptionsObject->count) {
17274416b707SBarry Smith     ierr = PetscOptionItemCreate_Private(PetscOptionsObject,opt,text,man,OPTION_STRING,&amsopt);CHKERRQ(ierr);
172864facd6cSBarry Smith     /* must use system malloc since SAWs may free this */
17295b02f95dSBarry Smith     ierr = PetscStrdup("",(char**)&amsopt->data);CHKERRQ(ierr);
17308cc676e6SMatthew G Knepley   }
1731e55864a3SBarry Smith   ierr = PetscOptionsGetViewer(PetscOptionsObject->comm,PetscOptionsObject->prefix,opt,viewer,format,set);CHKERRQ(ierr);
1732e55864a3SBarry Smith   if (PetscOptionsObject->printhelp && PetscOptionsObject->count == 1 && !PetscOptionsObject->alreadyprinted) {
1733e55864a3SBarry Smith     ierr = (*PetscHelpPrintf)(PetscOptionsObject->comm,"  -%s%s <%s>: %s (%s)\n",PetscOptionsObject->prefix ? PetscOptionsObject->prefix : "",opt+1,"",text,ManSection(man));CHKERRQ(ierr);
17348cc676e6SMatthew G Knepley   }
17358cc676e6SMatthew G Knepley   PetscFunctionReturn(0);
17368cc676e6SMatthew G Knepley }
17378cc676e6SMatthew G Knepley 
173853acd3b1SBarry Smith 
173953acd3b1SBarry Smith #undef __FUNCT__
174053acd3b1SBarry Smith #define __FUNCT__ "PetscOptionsHead"
174153acd3b1SBarry Smith /*@C
1742b52f573bSBarry Smith      PetscOptionsHead - Puts a heading before listing any more published options. Used, for example,
174353acd3b1SBarry Smith             in KSPSetFromOptions_GMRES().
174453acd3b1SBarry Smith 
17453f9fe445SBarry Smith    Logically Collective on the communicator passed in PetscOptionsBegin()
174653acd3b1SBarry Smith 
174753acd3b1SBarry Smith    Input Parameter:
174853acd3b1SBarry Smith .   head - the heading text
174953acd3b1SBarry Smith 
175053acd3b1SBarry Smith 
175153acd3b1SBarry Smith    Level: intermediate
175253acd3b1SBarry Smith 
175353acd3b1SBarry Smith    Notes: Must be between a PetscOptionsBegin() and a PetscOptionsEnd()
175453acd3b1SBarry Smith 
1755b52f573bSBarry Smith           Can be followed by a call to PetscOptionsTail() in the same function.
175653acd3b1SBarry Smith 
175753acd3b1SBarry Smith    Concepts: options database^subheading
175853acd3b1SBarry Smith 
1759c5929fdfSBarry Smith .seealso: PetscOptionsGetInt(NULL,), PetscOptionsGetReal(),
1760acfcf0e5SJed Brown            PetscOptionsHasName(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool(),
176153acd3b1SBarry Smith           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
176253acd3b1SBarry Smith           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
1763acfcf0e5SJed Brown           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
1764a264d7a6SBarry Smith           PetscOptionsFList(), PetscOptionsEList()
176553acd3b1SBarry Smith @*/
17664416b707SBarry Smith PetscErrorCode  PetscOptionsHead(PetscOptionItems *PetscOptionsObject,const char head[])
176753acd3b1SBarry Smith {
176853acd3b1SBarry Smith   PetscErrorCode ierr;
176953acd3b1SBarry Smith 
177053acd3b1SBarry Smith   PetscFunctionBegin;
1771e55864a3SBarry Smith   if (PetscOptionsObject->printhelp && PetscOptionsObject->count == 1 && !PetscOptionsObject->alreadyprinted) {
1772e55864a3SBarry Smith     ierr = (*PetscHelpPrintf)(PetscOptionsObject->comm,"  %s\n",head);CHKERRQ(ierr);
177353acd3b1SBarry Smith   }
177453acd3b1SBarry Smith   PetscFunctionReturn(0);
177553acd3b1SBarry Smith }
177653acd3b1SBarry Smith 
177753acd3b1SBarry Smith 
177853acd3b1SBarry Smith 
177953acd3b1SBarry Smith 
178053acd3b1SBarry Smith 
178153acd3b1SBarry Smith 
1782