153acd3b1SBarry Smith #define PETSC_DLL 253acd3b1SBarry Smith /* 353acd3b1SBarry Smith These routines simplify the use of command line, file options, etc., 453acd3b1SBarry Smith and are used to manipulate the options database. 553acd3b1SBarry Smith 653acd3b1SBarry Smith This file uses regular malloc and free because it cannot know 753acd3b1SBarry Smith what malloc is being used until it has already processed the input. 853acd3b1SBarry Smith */ 953acd3b1SBarry Smith 1053acd3b1SBarry Smith #include "petsc.h" /*I "petsc.h" I*/ 1153acd3b1SBarry Smith #include "petscsys.h" 1253acd3b1SBarry Smith #if defined(PETSC_HAVE_STDLIB_H) 1353acd3b1SBarry Smith #include <stdlib.h> 1453acd3b1SBarry Smith #endif 1553acd3b1SBarry Smith 1653acd3b1SBarry Smith /* 1753acd3b1SBarry Smith Keep a linked list of options that have been posted and we are waiting for 1853acd3b1SBarry Smith user selection 1953acd3b1SBarry Smith 2053acd3b1SBarry Smith Eventually we'll attach this beast to a MPI_Comm 2153acd3b1SBarry Smith */ 2253acd3b1SBarry Smith typedef enum {OPTION_INT,OPTION_LOGICAL,OPTION_REAL,OPTION_LIST,OPTION_STRING,OPTION_REAL_ARRAY,OPTION_HEAD} OptionType; 2353acd3b1SBarry Smith typedef struct _p_Options* PetscOptions; 2453acd3b1SBarry Smith struct _p_Options { 2553acd3b1SBarry Smith char *option; 2653acd3b1SBarry Smith char *text; 2753acd3b1SBarry Smith void *data; 2853acd3b1SBarry Smith void *edata; 296356e834SBarry Smith char *man; 3053acd3b1SBarry Smith int arraylength; 3153acd3b1SBarry Smith PetscTruth set; 3253acd3b1SBarry Smith OptionType type; 3353acd3b1SBarry Smith PetscOptions next; 3453acd3b1SBarry Smith }; 3553acd3b1SBarry Smith 3653acd3b1SBarry Smith static struct { 3753acd3b1SBarry Smith PetscOptions next; 3853acd3b1SBarry Smith char *prefix,*mprefix; 3953acd3b1SBarry Smith char *title; 4053acd3b1SBarry Smith MPI_Comm comm; 416356e834SBarry Smith PetscTruth printhelp,changedmethod; 4253acd3b1SBarry Smith } PetscOptionsObject; 4353acd3b1SBarry Smith PetscInt PetscOptionsPublishCount = 0; 4453acd3b1SBarry Smith 4553acd3b1SBarry Smith #undef __FUNCT__ 4653acd3b1SBarry Smith #define __FUNCT__ "PetscOptionsBegin_Private" 4753acd3b1SBarry Smith /* 4853acd3b1SBarry Smith Handles setting up the data structure in a call to PetscOptionsBegin() 4953acd3b1SBarry Smith */ 5053acd3b1SBarry Smith PetscErrorCode PetscOptionsBegin_Private(MPI_Comm comm,const char prefix[],const char title[],const char mansec[]) 5153acd3b1SBarry Smith { 5253acd3b1SBarry Smith PetscErrorCode ierr; 5353acd3b1SBarry Smith 5453acd3b1SBarry Smith PetscFunctionBegin; 5553acd3b1SBarry Smith PetscOptionsObject.next = 0; 5653acd3b1SBarry Smith PetscOptionsObject.comm = comm; 576356e834SBarry Smith PetscOptionsObject.changedmethod = PETSC_FALSE; 5853acd3b1SBarry Smith ierr = PetscStrallocpy(prefix,&PetscOptionsObject.prefix);CHKERRQ(ierr); 5953acd3b1SBarry Smith ierr = PetscStrallocpy(title,&PetscOptionsObject.title);CHKERRQ(ierr); 6053acd3b1SBarry Smith 6153acd3b1SBarry Smith ierr = PetscOptionsHasName(PETSC_NULL,"-help",&PetscOptionsObject.printhelp);CHKERRQ(ierr); 6253acd3b1SBarry Smith if (PetscOptionsObject.printhelp && PetscOptionsPublishCount == 1) { 6353acd3b1SBarry Smith ierr = (*PetscHelpPrintf)(comm,"%s -------------------------------------------------\n",title);CHKERRQ(ierr); 6453acd3b1SBarry Smith } 6553acd3b1SBarry Smith PetscFunctionReturn(0); 6653acd3b1SBarry Smith } 6753acd3b1SBarry Smith 6853acd3b1SBarry Smith /* 6953acd3b1SBarry Smith Handles adding another option to the list of options within this particular PetscOptionsBegin() PetscOptionsEnd() 7053acd3b1SBarry Smith */ 7153acd3b1SBarry Smith #undef __FUNCT__ 7253acd3b1SBarry Smith #define __FUNCT__ "PetscOptionsCreate_Private" 736356e834SBarry Smith static int PetscOptionsCreate_Private(const char opt[],const char text[],const char man[],OptionType t,PetscOptions *amsopt) 7453acd3b1SBarry Smith { 7553acd3b1SBarry Smith int ierr; 7653acd3b1SBarry Smith PetscOptions next; 7753acd3b1SBarry Smith 7853acd3b1SBarry Smith PetscFunctionBegin; 7953acd3b1SBarry Smith ierr = PetscNew(struct _p_Options,amsopt);CHKERRQ(ierr); 8053acd3b1SBarry Smith (*amsopt)->next = 0; 8153acd3b1SBarry Smith (*amsopt)->set = PETSC_FALSE; 826356e834SBarry Smith (*amsopt)->type = t; 8353acd3b1SBarry Smith (*amsopt)->data = 0; 8453acd3b1SBarry Smith (*amsopt)->edata = 0; 8553acd3b1SBarry Smith ierr = PetscStrallocpy(text,&(*amsopt)->text);CHKERRQ(ierr); 8653acd3b1SBarry Smith ierr = PetscStrallocpy(opt,&(*amsopt)->option);CHKERRQ(ierr); 876356e834SBarry Smith ierr = PetscStrallocpy(man,&(*amsopt)->man);CHKERRQ(ierr); 8853acd3b1SBarry Smith 8953acd3b1SBarry Smith if (!PetscOptionsObject.next) { 9053acd3b1SBarry Smith PetscOptionsObject.next = *amsopt; 9153acd3b1SBarry Smith } else { 9253acd3b1SBarry Smith next = PetscOptionsObject.next; 9353acd3b1SBarry Smith while (next->next) next = next->next; 9453acd3b1SBarry Smith next->next = *amsopt; 9553acd3b1SBarry Smith } 9653acd3b1SBarry Smith PetscFunctionReturn(0); 9753acd3b1SBarry Smith } 9853acd3b1SBarry Smith 9953acd3b1SBarry Smith #undef __FUNCT__ 1006356e834SBarry Smith #define __FUNCT__ "PetscOptionsGetFromGui" 1016356e834SBarry Smith static PetscErrorCode PetscOptionsGetFromGUI() 1026356e834SBarry Smith { 1036356e834SBarry Smith PetscErrorCode ierr; 1046356e834SBarry Smith PetscOptions next = PetscOptionsObject.next; 1056356e834SBarry Smith char str[512]; 1066356e834SBarry Smith 1076356e834SBarry Smith ierr = (*PetscPrintf)(PetscOptionsObject.comm,"%s -------------------------------------------------\n",PetscOptionsObject.title);CHKERRQ(ierr); 1086356e834SBarry Smith while (next) { 1096356e834SBarry Smith switch (next->type) { 1106356e834SBarry Smith case OPTION_HEAD: 1116356e834SBarry Smith break; 1126356e834SBarry Smith case OPTION_INT: 1136356e834SBarry Smith ierr = PetscPrintf(PetscOptionsObject.comm,"-%s%s <%d>: %s (%s)\n",PetscOptionsObject.prefix?PetscOptionsObject.prefix:"",next->option,*(int*)next->data,next->text,next->man);CHKERRQ(ierr); 1146356e834SBarry Smith scanf("%s\n",str); 1156356e834SBarry Smith if (str[0] != '\n') { 116*b432afdaSMatthew Knepley printf("changing value\n"); 1176356e834SBarry Smith } 1186356e834SBarry Smith break; 119*b432afdaSMatthew Knepley default: 120*b432afdaSMatthew Knepley break; 1216356e834SBarry Smith } 1226356e834SBarry Smith next = next->next; 1236356e834SBarry Smith } 1246356e834SBarry Smith PetscFunctionReturn(0); 1256356e834SBarry Smith } 1266356e834SBarry Smith 1276356e834SBarry Smith #undef __FUNCT__ 12853acd3b1SBarry Smith #define __FUNCT__ "PetscOptionsEnd_Private" 12953acd3b1SBarry Smith PetscErrorCode PetscOptionsEnd_Private(void) 13053acd3b1SBarry Smith { 13153acd3b1SBarry Smith PetscErrorCode ierr; 1326356e834SBarry Smith PetscOptions last; 1336356e834SBarry Smith char option[256],value[1024],tmp[32]; 1346356e834SBarry Smith PetscInt j; 13553acd3b1SBarry Smith 13653acd3b1SBarry Smith PetscFunctionBegin; 1376356e834SBarry Smith 1386356e834SBarry Smith if (PetscOptionsObject.next) { 1396356e834SBarry Smith ierr = PetscOptionsGetFromGUI(); 1406356e834SBarry Smith } 1416356e834SBarry Smith 14253acd3b1SBarry Smith ierr = PetscStrfree(PetscOptionsObject.title);CHKERRQ(ierr); PetscOptionsObject.title = 0; 14353acd3b1SBarry Smith ierr = PetscStrfree(PetscOptionsObject.prefix);CHKERRQ(ierr); PetscOptionsObject.prefix = 0; 1446356e834SBarry Smith 1456356e834SBarry Smith /* reset counter to -2; this updates the screen with the new options for the selected method */ 1466356e834SBarry Smith if (PetscOptionsObject.changedmethod) PetscOptionsPublishCount = -2; 1476356e834SBarry Smith 1486356e834SBarry Smith while (PetscOptionsObject.next) { 1496356e834SBarry Smith if (PetscOptionsObject.next->set) { 1506356e834SBarry Smith if (PetscOptionsObject.prefix) { 1516356e834SBarry Smith ierr = PetscStrcpy(option,"-");CHKERRQ(ierr); 1526356e834SBarry Smith ierr = PetscStrcat(option,PetscOptionsObject.prefix);CHKERRQ(ierr); 1536356e834SBarry Smith ierr = PetscStrcat(option,PetscOptionsObject.next->option+1);CHKERRQ(ierr); 1546356e834SBarry Smith } else { 1556356e834SBarry Smith ierr = PetscStrcpy(option,PetscOptionsObject.next->option);CHKERRQ(ierr); 1566356e834SBarry Smith } 1576356e834SBarry Smith 1586356e834SBarry Smith switch (PetscOptionsObject.next->type) { 1596356e834SBarry Smith case OPTION_HEAD: 1606356e834SBarry Smith break; 1616356e834SBarry Smith case OPTION_INT: 1626356e834SBarry Smith sprintf(value,"%d",*(PetscInt*)PetscOptionsObject.next->data); 1636356e834SBarry Smith break; 1646356e834SBarry Smith case OPTION_REAL: 1656356e834SBarry Smith sprintf(value,"%g",*(PetscReal*)PetscOptionsObject.next->data); 1666356e834SBarry Smith break; 1676356e834SBarry Smith case OPTION_REAL_ARRAY: 1686356e834SBarry Smith sprintf(value,"%g",((PetscReal*)PetscOptionsObject.next->data)[0]); 1696356e834SBarry Smith for (j=1; j<PetscOptionsObject.next->arraylength; j++) { 1706356e834SBarry Smith sprintf(tmp,"%g",((PetscReal*)PetscOptionsObject.next->data)[j]); 1716356e834SBarry Smith ierr = PetscStrcat(value,",");CHKERRQ(ierr); 1726356e834SBarry Smith ierr = PetscStrcat(value,tmp);CHKERRQ(ierr); 1736356e834SBarry Smith } 1746356e834SBarry Smith break; 1756356e834SBarry Smith case OPTION_LOGICAL: 1766356e834SBarry Smith sprintf(value,"%d",*(PetscInt*)PetscOptionsObject.next->data); 1776356e834SBarry Smith break; 1786356e834SBarry Smith case OPTION_LIST: 1796356e834SBarry Smith ierr = PetscStrcpy(value,*(char**)PetscOptionsObject.next->data);CHKERRQ(ierr); 1806356e834SBarry Smith break; 1816356e834SBarry Smith case OPTION_STRING: /* also handles string arrays */ 1826356e834SBarry Smith ierr = PetscStrcpy(value,*(char**)PetscOptionsObject.next->data);CHKERRQ(ierr); 1836356e834SBarry Smith break; 1846356e834SBarry Smith } 1856356e834SBarry Smith ierr = PetscOptionsSetValue(option,value);CHKERRQ(ierr); 1866356e834SBarry Smith } 1876356e834SBarry Smith ierr = PetscStrfree(PetscOptionsObject.next->text);CHKERRQ(ierr); 1886356e834SBarry Smith ierr = PetscStrfree(PetscOptionsObject.next->option);CHKERRQ(ierr); 1896356e834SBarry Smith ierr = PetscFree(PetscOptionsObject.next->man);CHKERRQ(ierr); 1906356e834SBarry Smith if (PetscOptionsObject.next->data) {ierr = PetscFree(PetscOptionsObject.next->data);CHKERRQ(ierr);} 1916356e834SBarry Smith if (PetscOptionsObject.next->edata) {ierr = PetscFree(PetscOptionsObject.next->edata);CHKERRQ(ierr);} 1926356e834SBarry Smith last = PetscOptionsObject.next; 1936356e834SBarry Smith PetscOptionsObject.next = PetscOptionsObject.next->next; 1946356e834SBarry Smith ierr = PetscFree(last);CHKERRQ(ierr); 1956356e834SBarry Smith } 1966356e834SBarry Smith PetscOptionsObject.next = 0; 19753acd3b1SBarry Smith PetscFunctionReturn(0); 19853acd3b1SBarry Smith } 19953acd3b1SBarry Smith 20053acd3b1SBarry Smith #undef __FUNCT__ 20153acd3b1SBarry Smith #define __FUNCT__ "PetscOptionsEnum" 20253acd3b1SBarry Smith /*@C 20353acd3b1SBarry Smith PetscOptionsEnum - Gets the enum value for a particular option in the database. 20453acd3b1SBarry Smith 20553acd3b1SBarry Smith Collective on the communicator passed in PetscOptionsBegin() 20653acd3b1SBarry Smith 20753acd3b1SBarry Smith Input Parameters: 20853acd3b1SBarry Smith + opt - option name 20953acd3b1SBarry Smith . text - short string that describes the option 21053acd3b1SBarry Smith . man - manual page with additional information on option 21153acd3b1SBarry Smith . list - array containing the list of choices, followed by the enum name, followed by the enum prefix, followed by a null 21253acd3b1SBarry Smith - defaultv - the default (current) value 21353acd3b1SBarry Smith 21453acd3b1SBarry Smith Output Parameter: 21553acd3b1SBarry Smith + value - the value to return 21653acd3b1SBarry Smith - flg - PETSC_TRUE if found, else PETSC_FALSE 21753acd3b1SBarry Smith 21853acd3b1SBarry Smith Level: beginner 21953acd3b1SBarry Smith 22053acd3b1SBarry Smith Concepts: options database 22153acd3b1SBarry Smith 22253acd3b1SBarry Smith Notes: Must be between a PetscOptionsBegin() and a PetscOptionsEnd() 22353acd3b1SBarry Smith 22453acd3b1SBarry Smith list is usually something like PCASMTypes or some other predefined list of enum names 22553acd3b1SBarry Smith 22653acd3b1SBarry Smith .seealso: PetscOptionsGetReal(), PetscOptionsHasName(), PetscOptionsGetString(), PetscOptionsGetInt(), 22753acd3b1SBarry Smith PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsTruth() 22853acd3b1SBarry Smith PetscOptionsInt(), PetscOptionsString(), PetscOptionsReal(), PetscOptionsTruth(), 22953acd3b1SBarry Smith PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 23053acd3b1SBarry Smith PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 23153acd3b1SBarry Smith PetscOptionsTruthGroupBegin(), PetscOptionsTruthGroup(), PetscOptionsTruthGroupEnd(), 23253acd3b1SBarry Smith PetscOptionsList(), PetscOptionsEList() 23353acd3b1SBarry Smith @*/ 23453acd3b1SBarry Smith PetscErrorCode PETSC_DLLEXPORT PetscOptionsEnum(const char opt[],const char text[],const char man[],const char **list,PetscEnum defaultv,PetscEnum *value,PetscTruth *set) 23553acd3b1SBarry Smith { 23653acd3b1SBarry Smith PetscErrorCode ierr; 23753acd3b1SBarry Smith PetscInt ntext = 0; 23853acd3b1SBarry Smith 23953acd3b1SBarry Smith PetscFunctionBegin; 24053acd3b1SBarry Smith while (list[ntext++]) { 24153acd3b1SBarry Smith if (ntext > 50) SETERRQ(PETSC_ERR_ARG_WRONG,"List argument appears to be wrong or have more than 50 entries"); 24253acd3b1SBarry Smith } 24353acd3b1SBarry Smith if (ntext < 3) SETERRQ(PETSC_ERR_ARG_WRONG,"List argument must have at least two entries: typename and type prefix"); 24453acd3b1SBarry Smith ntext -= 3; 24553acd3b1SBarry Smith ierr = PetscOptionsEList(opt,text,man,list,ntext,list[defaultv],(PetscInt*)value,set);CHKERRQ(ierr); 24653acd3b1SBarry Smith PetscFunctionReturn(0); 24753acd3b1SBarry Smith } 24853acd3b1SBarry Smith 24953acd3b1SBarry Smith /* -------------------------------------------------------------------------------------------------------------*/ 25053acd3b1SBarry Smith #undef __FUNCT__ 25153acd3b1SBarry Smith #define __FUNCT__ "PetscOptionsInt" 25253acd3b1SBarry Smith /*@C 25353acd3b1SBarry Smith PetscOptionsInt - Gets the integer value for a particular option in the database. 25453acd3b1SBarry Smith 25553acd3b1SBarry Smith Collective on the communicator passed in PetscOptionsBegin() 25653acd3b1SBarry Smith 25753acd3b1SBarry Smith Input Parameters: 25853acd3b1SBarry Smith + opt - option name 25953acd3b1SBarry Smith . text - short string that describes the option 26053acd3b1SBarry Smith . man - manual page with additional information on option 26153acd3b1SBarry Smith - defaultv - the default (current) value 26253acd3b1SBarry Smith 26353acd3b1SBarry Smith Output Parameter: 26453acd3b1SBarry Smith + value - the integer value to return 26553acd3b1SBarry Smith - flg - PETSC_TRUE if found, else PETSC_FALSE 26653acd3b1SBarry Smith 26753acd3b1SBarry Smith Level: beginner 26853acd3b1SBarry Smith 26953acd3b1SBarry Smith Concepts: options database^has int 27053acd3b1SBarry Smith 27153acd3b1SBarry Smith Notes: Must be between a PetscOptionsBegin() and a PetscOptionsEnd() 27253acd3b1SBarry Smith 27353acd3b1SBarry Smith .seealso: PetscOptionsGetReal(), PetscOptionsHasName(), PetscOptionsGetString(), PetscOptionsGetInt(), 27453acd3b1SBarry Smith PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsTruth() 27553acd3b1SBarry Smith PetscOptionsInt(), PetscOptionsString(), PetscOptionsReal(), PetscOptionsTruth(), 27653acd3b1SBarry Smith PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 27753acd3b1SBarry Smith PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 27853acd3b1SBarry Smith PetscOptionsTruthGroupBegin(), PetscOptionsTruthGroup(), PetscOptionsTruthGroupEnd(), 27953acd3b1SBarry Smith PetscOptionsList(), PetscOptionsEList() 28053acd3b1SBarry Smith @*/ 28153acd3b1SBarry Smith PetscErrorCode PETSC_DLLEXPORT PetscOptionsInt(const char opt[],const char text[],const char man[],PetscInt defaultv,PetscInt *value,PetscTruth *set) 28253acd3b1SBarry Smith { 28353acd3b1SBarry Smith PetscErrorCode ierr; 2846356e834SBarry Smith PetscOptions amsopt; 28553acd3b1SBarry Smith 28653acd3b1SBarry Smith PetscFunctionBegin; 2876356e834SBarry Smith if (PetscOptionsPublishCount == 1) { 2886356e834SBarry Smith ierr = PetscOptionsCreate_Private(opt,text,man,OPTION_INT,&amsopt);CHKERRQ(ierr); 2896356e834SBarry Smith ierr = PetscMalloc(sizeof(PetscInt),&amsopt->data);CHKERRQ(ierr); 2906356e834SBarry Smith *(PetscInt*)amsopt->data = defaultv; 2916356e834SBarry Smith } 29253acd3b1SBarry Smith ierr = PetscOptionsGetInt(PetscOptionsObject.prefix,opt,value,set);CHKERRQ(ierr); 29353acd3b1SBarry Smith if (PetscOptionsObject.printhelp && PetscOptionsPublishCount == 1) { 29453acd3b1SBarry Smith ierr = (*PetscHelpPrintf)(PetscOptionsObject.comm," -%s%s <%d>: %s (%s)\n",PetscOptionsObject.prefix?PetscOptionsObject.prefix:"",opt+1,defaultv,text,man);CHKERRQ(ierr); 29553acd3b1SBarry Smith } 29653acd3b1SBarry Smith PetscFunctionReturn(0); 29753acd3b1SBarry Smith } 29853acd3b1SBarry Smith 29953acd3b1SBarry Smith #undef __FUNCT__ 30053acd3b1SBarry Smith #define __FUNCT__ "PetscOptionsString" 30153acd3b1SBarry Smith /*@C 30253acd3b1SBarry Smith PetscOptionsString - Gets the string value for a particular option in the database. 30353acd3b1SBarry Smith 30453acd3b1SBarry Smith Collective on the communicator passed in PetscOptionsBegin() 30553acd3b1SBarry Smith 30653acd3b1SBarry Smith Input Parameters: 30753acd3b1SBarry Smith + opt - option name 30853acd3b1SBarry Smith . text - short string that describes the option 30953acd3b1SBarry Smith . man - manual page with additional information on option 31053acd3b1SBarry Smith - defaultv - the default (current) value 31153acd3b1SBarry Smith 31253acd3b1SBarry Smith Output Parameter: 31353acd3b1SBarry Smith + value - the value to return 31453acd3b1SBarry Smith - flg - PETSC_TRUE if found, else PETSC_FALSE 31553acd3b1SBarry Smith 31653acd3b1SBarry Smith Level: beginner 31753acd3b1SBarry Smith 31853acd3b1SBarry Smith Concepts: options database^has int 31953acd3b1SBarry Smith 32053acd3b1SBarry Smith Notes: Must be between a PetscOptionsBegin() and a PetscOptionsEnd() 32153acd3b1SBarry Smith 32253acd3b1SBarry Smith .seealso: PetscOptionsGetReal(), PetscOptionsHasName(), PetscOptionsGetString(), PetscOptionsGetInt(), 32353acd3b1SBarry Smith PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsTruth() 32453acd3b1SBarry Smith PetscOptionsInt(), PetscOptionsString(), PetscOptionsReal(), PetscOptionsTruth(), 32553acd3b1SBarry Smith PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 32653acd3b1SBarry Smith PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 32753acd3b1SBarry Smith PetscOptionsTruthGroupBegin(), PetscOptionsTruthGroup(), PetscOptionsTruthGroupEnd(), 32853acd3b1SBarry Smith PetscOptionsList(), PetscOptionsEList() 32953acd3b1SBarry Smith @*/ 33053acd3b1SBarry Smith PetscErrorCode PETSC_DLLEXPORT PetscOptionsString(const char opt[],const char text[],const char man[],const char defaultv[],char value[],size_t len,PetscTruth *set) 33153acd3b1SBarry Smith { 33253acd3b1SBarry Smith PetscErrorCode ierr; 33353acd3b1SBarry Smith 33453acd3b1SBarry Smith PetscFunctionBegin; 33553acd3b1SBarry Smith ierr = PetscOptionsGetString(PetscOptionsObject.prefix,opt,value,len,set);CHKERRQ(ierr); 33653acd3b1SBarry Smith if (PetscOptionsObject.printhelp && PetscOptionsPublishCount == 1) { 33753acd3b1SBarry Smith ierr = (*PetscHelpPrintf)(PetscOptionsObject.comm," -%s%s <%s>: %s (%s)\n",PetscOptionsObject.prefix?PetscOptionsObject.prefix:"",opt+1,defaultv,text,man);CHKERRQ(ierr); 33853acd3b1SBarry Smith } 33953acd3b1SBarry Smith PetscFunctionReturn(0); 34053acd3b1SBarry Smith } 34153acd3b1SBarry Smith 34253acd3b1SBarry Smith /* 34353acd3b1SBarry Smith Publishes an AMS double field (with the default value in it) and with a name 34453acd3b1SBarry Smith given by the text string 34553acd3b1SBarry Smith */ 34653acd3b1SBarry Smith #undef __FUNCT__ 34753acd3b1SBarry Smith #define __FUNCT__ "PetscOptionsReal" 34853acd3b1SBarry Smith /*@C 34953acd3b1SBarry Smith PetscOptionsReal - Gets the PetscReal value for a particular option in the database. 35053acd3b1SBarry Smith 35153acd3b1SBarry Smith Collective on the communicator passed in PetscOptionsBegin() 35253acd3b1SBarry Smith 35353acd3b1SBarry Smith Input Parameters: 35453acd3b1SBarry Smith + opt - option name 35553acd3b1SBarry Smith . text - short string that describes the option 35653acd3b1SBarry Smith . man - manual page with additional information on option 35753acd3b1SBarry Smith - defaultv - the default (current) value 35853acd3b1SBarry Smith 35953acd3b1SBarry Smith Output Parameter: 36053acd3b1SBarry Smith + value - the value to return 36153acd3b1SBarry Smith - flg - PETSC_TRUE if found, else PETSC_FALSE 36253acd3b1SBarry Smith 36353acd3b1SBarry Smith Level: beginner 36453acd3b1SBarry Smith 36553acd3b1SBarry Smith Concepts: options database^has int 36653acd3b1SBarry Smith 36753acd3b1SBarry Smith Notes: Must be between a PetscOptionsBegin() and a PetscOptionsEnd() 36853acd3b1SBarry Smith 36953acd3b1SBarry Smith .seealso: PetscOptionsGetReal(), PetscOptionsHasName(), PetscOptionsGetString(), PetscOptionsGetInt(), 37053acd3b1SBarry Smith PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsTruth() 37153acd3b1SBarry Smith PetscOptionsInt(), PetscOptionsString(), PetscOptionsReal(), PetscOptionsTruth(), 37253acd3b1SBarry Smith PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 37353acd3b1SBarry Smith PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 37453acd3b1SBarry Smith PetscOptionsTruthGroupBegin(), PetscOptionsTruthGroup(), PetscOptionsTruthGroupEnd(), 37553acd3b1SBarry Smith PetscOptionsList(), PetscOptionsEList() 37653acd3b1SBarry Smith @*/ 37753acd3b1SBarry Smith PetscErrorCode PETSC_DLLEXPORT PetscOptionsReal(const char opt[],const char text[],const char man[],PetscReal defaultv,PetscReal *value,PetscTruth *set) 37853acd3b1SBarry Smith { 37953acd3b1SBarry Smith PetscErrorCode ierr; 38053acd3b1SBarry Smith 38153acd3b1SBarry Smith PetscFunctionBegin; 38253acd3b1SBarry Smith ierr = PetscOptionsGetReal(PetscOptionsObject.prefix,opt,value,set);CHKERRQ(ierr); 38353acd3b1SBarry Smith if (PetscOptionsObject.printhelp && PetscOptionsPublishCount == 1) { 38453acd3b1SBarry Smith ierr = (*PetscHelpPrintf)(PetscOptionsObject.comm," -%s%s <%g>: %s (%s)\n",PetscOptionsObject.prefix?PetscOptionsObject.prefix:"",opt+1,defaultv,text,man);CHKERRQ(ierr); 38553acd3b1SBarry Smith } 38653acd3b1SBarry Smith PetscFunctionReturn(0); 38753acd3b1SBarry Smith } 38853acd3b1SBarry Smith 38953acd3b1SBarry Smith #undef __FUNCT__ 39053acd3b1SBarry Smith #define __FUNCT__ "PetscOptionsScalar" 39153acd3b1SBarry Smith /*@C 39253acd3b1SBarry Smith PetscOptionsScalar - Gets the scalar value for a particular option in the database. 39353acd3b1SBarry Smith 39453acd3b1SBarry Smith Collective on the communicator passed in PetscOptionsBegin() 39553acd3b1SBarry Smith 39653acd3b1SBarry Smith Input Parameters: 39753acd3b1SBarry Smith + opt - option name 39853acd3b1SBarry Smith . text - short string that describes the option 39953acd3b1SBarry Smith . man - manual page with additional information on option 40053acd3b1SBarry Smith - defaultv - the default (current) value 40153acd3b1SBarry Smith 40253acd3b1SBarry Smith Output Parameter: 40353acd3b1SBarry Smith + value - the value to return 40453acd3b1SBarry Smith - flg - PETSC_TRUE if found, else PETSC_FALSE 40553acd3b1SBarry Smith 40653acd3b1SBarry Smith Level: beginner 40753acd3b1SBarry Smith 40853acd3b1SBarry Smith Concepts: options database^has int 40953acd3b1SBarry Smith 41053acd3b1SBarry Smith Notes: Must be between a PetscOptionsBegin() and a PetscOptionsEnd() 41153acd3b1SBarry Smith 41253acd3b1SBarry Smith .seealso: PetscOptionsGetReal(), PetscOptionsHasName(), PetscOptionsGetString(), PetscOptionsGetInt(), 41353acd3b1SBarry Smith PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsTruth() 41453acd3b1SBarry Smith PetscOptionsInt(), PetscOptionsString(), PetscOptionsReal(), PetscOptionsTruth(), 41553acd3b1SBarry Smith PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 41653acd3b1SBarry Smith PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 41753acd3b1SBarry Smith PetscOptionsTruthGroupBegin(), PetscOptionsTruthGroup(), PetscOptionsTruthGroupEnd(), 41853acd3b1SBarry Smith PetscOptionsList(), PetscOptionsEList() 41953acd3b1SBarry Smith @*/ 42053acd3b1SBarry Smith PetscErrorCode PETSC_DLLEXPORT PetscOptionsScalar(const char opt[],const char text[],const char man[],PetscScalar defaultv,PetscScalar *value,PetscTruth *set) 42153acd3b1SBarry Smith { 42253acd3b1SBarry Smith PetscErrorCode ierr; 42353acd3b1SBarry Smith 42453acd3b1SBarry Smith PetscFunctionBegin; 42553acd3b1SBarry Smith #if !defined(PETSC_USE_COMPLEX) 42653acd3b1SBarry Smith ierr = PetscOptionsReal(opt,text,man,defaultv,value,set);CHKERRQ(ierr); 42753acd3b1SBarry Smith #else 42853acd3b1SBarry Smith ierr = PetscOptionsGetScalar(PetscOptionsObject.prefix,opt,value,set);CHKERRQ(ierr); 42953acd3b1SBarry Smith #endif 43053acd3b1SBarry Smith PetscFunctionReturn(0); 43153acd3b1SBarry Smith } 43253acd3b1SBarry Smith 43353acd3b1SBarry Smith /* 43453acd3b1SBarry Smith Publishes an AMS logical field (with the default value in it) and with a name 43553acd3b1SBarry Smith given by the text string 43653acd3b1SBarry Smith */ 43753acd3b1SBarry Smith #undef __FUNCT__ 43853acd3b1SBarry Smith #define __FUNCT__ "PetscOptionsName" 43953acd3b1SBarry Smith /*@C 44053acd3b1SBarry Smith PetscOptionsName - Determines if a particular option is in the database 44153acd3b1SBarry Smith 44253acd3b1SBarry Smith Collective on the communicator passed in PetscOptionsBegin() 44353acd3b1SBarry Smith 44453acd3b1SBarry Smith Input Parameters: 44553acd3b1SBarry Smith + opt - option name 44653acd3b1SBarry Smith . text - short string that describes the option 44753acd3b1SBarry Smith - man - manual page with additional information on option 44853acd3b1SBarry Smith 44953acd3b1SBarry Smith Output Parameter: 45053acd3b1SBarry Smith . flg - PETSC_TRUE if found, else PETSC_FALSE 45153acd3b1SBarry Smith 45253acd3b1SBarry Smith Level: beginner 45353acd3b1SBarry Smith 45453acd3b1SBarry Smith Concepts: options database^has int 45553acd3b1SBarry Smith 45653acd3b1SBarry Smith Notes: Must be between a PetscOptionsBegin() and a PetscOptionsEnd() 45753acd3b1SBarry Smith 45853acd3b1SBarry Smith .seealso: PetscOptionsGetReal(), PetscOptionsHasName(), PetscOptionsGetString(), PetscOptionsGetInt(), 45953acd3b1SBarry Smith PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsTruth() 46053acd3b1SBarry Smith PetscOptionsInt(), PetscOptionsString(), PetscOptionsReal(), PetscOptionsTruth(), 46153acd3b1SBarry Smith PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 46253acd3b1SBarry Smith PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 46353acd3b1SBarry Smith PetscOptionsTruthGroupBegin(), PetscOptionsTruthGroup(), PetscOptionsTruthGroupEnd(), 46453acd3b1SBarry Smith PetscOptionsList(), PetscOptionsEList() 46553acd3b1SBarry Smith @*/ 46653acd3b1SBarry Smith PetscErrorCode PETSC_DLLEXPORT PetscOptionsName(const char opt[],const char text[],const char man[],PetscTruth *flg) 46753acd3b1SBarry Smith { 46853acd3b1SBarry Smith PetscErrorCode ierr; 46953acd3b1SBarry Smith 47053acd3b1SBarry Smith PetscFunctionBegin; 47153acd3b1SBarry Smith ierr = PetscOptionsHasName(PetscOptionsObject.prefix,opt,flg);CHKERRQ(ierr); 47253acd3b1SBarry Smith if (PetscOptionsObject.printhelp && PetscOptionsPublishCount == 1) { 47353acd3b1SBarry Smith ierr = (*PetscHelpPrintf)(PetscOptionsObject.comm," -%s%s: %s (%s)\n",PetscOptionsObject.prefix?PetscOptionsObject.prefix:"",opt+1,text,man);CHKERRQ(ierr); 47453acd3b1SBarry Smith } 47553acd3b1SBarry Smith PetscFunctionReturn(0); 47653acd3b1SBarry Smith } 47753acd3b1SBarry Smith 47853acd3b1SBarry Smith #undef __FUNCT__ 47953acd3b1SBarry Smith #define __FUNCT__ "PetscOptionsList" 48053acd3b1SBarry Smith /*@C 48153acd3b1SBarry Smith PetscOptionsList - Puts a list of option values that a single one may be selected from 48253acd3b1SBarry Smith 48353acd3b1SBarry Smith Collective on the communicator passed in PetscOptionsBegin() 48453acd3b1SBarry Smith 48553acd3b1SBarry Smith Input Parameters: 48653acd3b1SBarry Smith + opt - option name 48753acd3b1SBarry Smith . text - short string that describes the option 48853acd3b1SBarry Smith . man - manual page with additional information on option 48953acd3b1SBarry Smith . list - the possible choices 49053acd3b1SBarry Smith - defaultv - the default (current) value 49153acd3b1SBarry Smith 49253acd3b1SBarry Smith Output Parameter: 49353acd3b1SBarry Smith + value - the value to return 49453acd3b1SBarry Smith - set - PETSC_TRUE if found, else PETSC_FALSE 49553acd3b1SBarry Smith 49653acd3b1SBarry Smith Level: intermediate 49753acd3b1SBarry Smith 49853acd3b1SBarry Smith Notes: Must be between a PetscOptionsBegin() and a PetscOptionsEnd() 49953acd3b1SBarry Smith 50053acd3b1SBarry Smith See PetscOptionsEList() for when the choices are given in a string array 50153acd3b1SBarry Smith 50253acd3b1SBarry Smith To get a listing of all currently specified options, 50353acd3b1SBarry Smith see PetscOptionsPrint() or PetscOptionsGetAll() 50453acd3b1SBarry Smith 50553acd3b1SBarry Smith Concepts: options database^list 50653acd3b1SBarry Smith 50753acd3b1SBarry Smith .seealso: PetscOptionsGetInt(), PetscOptionsGetReal(), 50853acd3b1SBarry Smith PetscOptionsHasName(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsTruth(), 50953acd3b1SBarry Smith PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 51053acd3b1SBarry Smith PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 51153acd3b1SBarry Smith PetscOptionsTruthGroupBegin(), PetscOptionsTruthGroup(), PetscOptionsTruthGroupEnd(), 51253acd3b1SBarry Smith PetscOptionsList(), PetscOptionsEList() 51353acd3b1SBarry Smith @*/ 51453acd3b1SBarry Smith PetscErrorCode PETSC_DLLEXPORT PetscOptionsList(const char opt[],const char ltext[],const char man[],PetscFList list,const char defaultv[],char value[],PetscInt len,PetscTruth *set) 51553acd3b1SBarry Smith { 51653acd3b1SBarry Smith PetscErrorCode ierr; 51753acd3b1SBarry Smith 51853acd3b1SBarry Smith PetscFunctionBegin; 51953acd3b1SBarry Smith ierr = PetscOptionsGetString(PetscOptionsObject.prefix,opt,value,len,set);CHKERRQ(ierr); 52053acd3b1SBarry Smith if (PetscOptionsObject.printhelp && PetscOptionsPublishCount == 1) { 52153acd3b1SBarry Smith ierr = PetscFListPrintTypes(PetscOptionsObject.comm,stdout,PetscOptionsObject.prefix,opt,ltext,man,list);CHKERRQ(ierr);CHKERRQ(ierr); 52253acd3b1SBarry Smith } 52353acd3b1SBarry Smith PetscFunctionReturn(0); 52453acd3b1SBarry Smith } 52553acd3b1SBarry Smith 52653acd3b1SBarry Smith #undef __FUNCT__ 52753acd3b1SBarry Smith #define __FUNCT__ "PetscOptionsEList" 52853acd3b1SBarry Smith /*@C 52953acd3b1SBarry Smith PetscOptionsEList - Puts a list of option values that a single one may be selected from 53053acd3b1SBarry Smith 53153acd3b1SBarry Smith Collective on the communicator passed in PetscOptionsBegin() 53253acd3b1SBarry Smith 53353acd3b1SBarry Smith Input Parameters: 53453acd3b1SBarry Smith + opt - option name 53553acd3b1SBarry Smith . ltext - short string that describes the option 53653acd3b1SBarry Smith . man - manual page with additional information on option 53753acd3b1SBarry Smith . list - the possible choices 53853acd3b1SBarry Smith . ntext - number of choices 53953acd3b1SBarry Smith - defaultv - the default (current) value 54053acd3b1SBarry Smith 54153acd3b1SBarry Smith Output Parameter: 54253acd3b1SBarry Smith + value - the index of the value to return 54353acd3b1SBarry Smith - set - PETSC_TRUE if found, else PETSC_FALSE 54453acd3b1SBarry Smith 54553acd3b1SBarry Smith Level: intermediate 54653acd3b1SBarry Smith 54753acd3b1SBarry Smith Notes: Must be between a PetscOptionsBegin() and a PetscOptionsEnd() 54853acd3b1SBarry Smith 54953acd3b1SBarry Smith See PetscOptionsList() for when the choices are given in a PetscFList() 55053acd3b1SBarry Smith 55153acd3b1SBarry Smith Concepts: options database^list 55253acd3b1SBarry Smith 55353acd3b1SBarry Smith .seealso: PetscOptionsGetInt(), PetscOptionsGetReal(), 55453acd3b1SBarry Smith PetscOptionsHasName(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsTruth(), 55553acd3b1SBarry Smith PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 55653acd3b1SBarry Smith PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 55753acd3b1SBarry Smith PetscOptionsTruthGroupBegin(), PetscOptionsTruthGroup(), PetscOptionsTruthGroupEnd(), 55853acd3b1SBarry Smith PetscOptionsList(), PetscOptionsEList() 55953acd3b1SBarry Smith @*/ 56053acd3b1SBarry Smith PetscErrorCode PETSC_DLLEXPORT PetscOptionsEList(const char opt[],const char ltext[],const char man[],const char **list,PetscInt ntext,const char defaultv[],PetscInt *value,PetscTruth *set) 56153acd3b1SBarry Smith { 56253acd3b1SBarry Smith PetscErrorCode ierr; 56353acd3b1SBarry Smith PetscInt i; 56453acd3b1SBarry Smith 56553acd3b1SBarry Smith PetscFunctionBegin; 56653acd3b1SBarry Smith ierr = PetscOptionsGetEList(PetscOptionsObject.prefix,opt,list,ntext,value,set);CHKERRQ(ierr); 56753acd3b1SBarry Smith if (PetscOptionsObject.printhelp && PetscOptionsPublishCount == 1) { 56853acd3b1SBarry Smith ierr = (*PetscHelpPrintf)(PetscOptionsObject.comm," -%s%s <%s> (choose one of)",PetscOptionsObject.prefix?PetscOptionsObject.prefix:"",opt+1,defaultv);CHKERRQ(ierr); 56953acd3b1SBarry Smith for (i=0; i<ntext; i++){ 57053acd3b1SBarry Smith ierr = (*PetscHelpPrintf)(PetscOptionsObject.comm," %s",list[i]);CHKERRQ(ierr); 57153acd3b1SBarry Smith } 57253acd3b1SBarry Smith ierr = (*PetscHelpPrintf)(PetscOptionsObject.comm,"\n");CHKERRQ(ierr); 57353acd3b1SBarry Smith } 57453acd3b1SBarry Smith PetscFunctionReturn(0); 57553acd3b1SBarry Smith } 57653acd3b1SBarry Smith 57753acd3b1SBarry Smith #undef __FUNCT__ 57853acd3b1SBarry Smith #define __FUNCT__ "PetscOptionsTruthGroupBegin" 57953acd3b1SBarry Smith /*@C 58053acd3b1SBarry Smith PetscOptionsTruthGroupBegin - First in a series of logical queries on the options database for 58153acd3b1SBarry Smith which only a single value can be true. 58253acd3b1SBarry Smith 58353acd3b1SBarry Smith Collective on the communicator passed in PetscOptionsBegin() 58453acd3b1SBarry Smith 58553acd3b1SBarry Smith Input Parameters: 58653acd3b1SBarry Smith + opt - option name 58753acd3b1SBarry Smith . text - short string that describes the option 58853acd3b1SBarry Smith - man - manual page with additional information on option 58953acd3b1SBarry Smith 59053acd3b1SBarry Smith Output Parameter: 59153acd3b1SBarry Smith . flg - whether that option was set or not 59253acd3b1SBarry Smith 59353acd3b1SBarry Smith Level: intermediate 59453acd3b1SBarry Smith 59553acd3b1SBarry Smith Notes: Must be between a PetscOptionsBegin() and a PetscOptionsEnd() 59653acd3b1SBarry Smith 59753acd3b1SBarry Smith Must be followed by 0 or more PetscOptionsTruthGroup()s and PetscOptionsTruthGroupEnd() 59853acd3b1SBarry Smith 59953acd3b1SBarry Smith Concepts: options database^logical group 60053acd3b1SBarry Smith 60153acd3b1SBarry Smith .seealso: PetscOptionsGetInt(), PetscOptionsGetReal(), 60253acd3b1SBarry Smith PetscOptionsHasName(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsTruth(), 60353acd3b1SBarry Smith PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 60453acd3b1SBarry Smith PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 60553acd3b1SBarry Smith PetscOptionsTruthGroupBegin(), PetscOptionsTruthGroup(), PetscOptionsTruthGroupEnd(), 60653acd3b1SBarry Smith PetscOptionsList(), PetscOptionsEList() 60753acd3b1SBarry Smith @*/ 60853acd3b1SBarry Smith PetscErrorCode PETSC_DLLEXPORT PetscOptionsTruthGroupBegin(const char opt[],const char text[],const char man[],PetscTruth *flg) 60953acd3b1SBarry Smith { 61053acd3b1SBarry Smith PetscErrorCode ierr; 61153acd3b1SBarry Smith 61253acd3b1SBarry Smith PetscFunctionBegin; 61353acd3b1SBarry Smith ierr = PetscOptionsHasName(PetscOptionsObject.prefix,opt,flg);CHKERRQ(ierr); 61453acd3b1SBarry Smith if (PetscOptionsObject.printhelp && PetscOptionsPublishCount == 1) { 61553acd3b1SBarry Smith ierr = (*PetscHelpPrintf)(PetscOptionsObject.comm," Pick at most one of -------------\n");CHKERRQ(ierr); 61653acd3b1SBarry Smith ierr = (*PetscHelpPrintf)(PetscOptionsObject.comm," -%s%s: %s (%s)\n",PetscOptionsObject.prefix?PetscOptionsObject.prefix:"",opt+1,text,man);CHKERRQ(ierr); 61753acd3b1SBarry Smith } 61853acd3b1SBarry Smith PetscFunctionReturn(0); 61953acd3b1SBarry Smith } 62053acd3b1SBarry Smith 62153acd3b1SBarry Smith #undef __FUNCT__ 62253acd3b1SBarry Smith #define __FUNCT__ "PetscOptionsTruthGroup" 62353acd3b1SBarry Smith /*@C 62453acd3b1SBarry Smith PetscOptionsTruthGroup - One in a series of logical queries on the options database for 62553acd3b1SBarry Smith which only a single value can be true. 62653acd3b1SBarry Smith 62753acd3b1SBarry Smith Collective on the communicator passed in PetscOptionsBegin() 62853acd3b1SBarry Smith 62953acd3b1SBarry Smith Input Parameters: 63053acd3b1SBarry Smith + opt - option name 63153acd3b1SBarry Smith . text - short string that describes the option 63253acd3b1SBarry Smith - man - manual page with additional information on option 63353acd3b1SBarry Smith 63453acd3b1SBarry Smith Output Parameter: 63553acd3b1SBarry Smith . flg - PETSC_TRUE if found, else PETSC_FALSE 63653acd3b1SBarry Smith 63753acd3b1SBarry Smith Level: intermediate 63853acd3b1SBarry Smith 63953acd3b1SBarry Smith Notes: Must be between a PetscOptionsBegin() and a PetscOptionsEnd() 64053acd3b1SBarry Smith 64153acd3b1SBarry Smith Must follow a PetscOptionsTruthGroupBegin() and preceded a PetscOptionsTruthGroupEnd() 64253acd3b1SBarry Smith 64353acd3b1SBarry Smith Concepts: options database^logical group 64453acd3b1SBarry Smith 64553acd3b1SBarry Smith .seealso: PetscOptionsGetInt(), PetscOptionsGetReal(), 64653acd3b1SBarry Smith PetscOptionsHasName(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsTruth(), 64753acd3b1SBarry Smith PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 64853acd3b1SBarry Smith PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 64953acd3b1SBarry Smith PetscOptionsTruthGroupBegin(), PetscOptionsTruthGroup(), PetscOptionsTruthGroupEnd(), 65053acd3b1SBarry Smith PetscOptionsList(), PetscOptionsEList() 65153acd3b1SBarry Smith @*/ 65253acd3b1SBarry Smith PetscErrorCode PETSC_DLLEXPORT PetscOptionsTruthGroup(const char opt[],const char text[],const char man[],PetscTruth *flg) 65353acd3b1SBarry Smith { 65453acd3b1SBarry Smith PetscErrorCode ierr; 65553acd3b1SBarry Smith 65653acd3b1SBarry Smith PetscFunctionBegin; 65753acd3b1SBarry Smith ierr = PetscOptionsHasName(PetscOptionsObject.prefix,opt,flg);CHKERRQ(ierr); 65853acd3b1SBarry Smith if (PetscOptionsObject.printhelp && PetscOptionsPublishCount == 1) { 65953acd3b1SBarry Smith ierr = (*PetscHelpPrintf)(PetscOptionsObject.comm," -%s%s: %s (%s)\n",PetscOptionsObject.prefix?PetscOptionsObject.prefix:"",opt+1,text,man);CHKERRQ(ierr); 66053acd3b1SBarry Smith } 66153acd3b1SBarry Smith PetscFunctionReturn(0); 66253acd3b1SBarry Smith } 66353acd3b1SBarry Smith 66453acd3b1SBarry Smith #undef __FUNCT__ 66553acd3b1SBarry Smith #define __FUNCT__ "PetscOptionsTruthGroupEnd" 66653acd3b1SBarry Smith /*@C 66753acd3b1SBarry Smith PetscOptionsTruthGroupEnd - Last in a series of logical queries on the options database for 66853acd3b1SBarry Smith which only a single value can be true. 66953acd3b1SBarry Smith 67053acd3b1SBarry Smith Collective on the communicator passed in PetscOptionsBegin() 67153acd3b1SBarry Smith 67253acd3b1SBarry Smith Input Parameters: 67353acd3b1SBarry Smith + opt - option name 67453acd3b1SBarry Smith . text - short string that describes the option 67553acd3b1SBarry Smith - man - manual page with additional information on option 67653acd3b1SBarry Smith 67753acd3b1SBarry Smith Output Parameter: 67853acd3b1SBarry Smith . flg - PETSC_TRUE if found, else PETSC_FALSE 67953acd3b1SBarry Smith 68053acd3b1SBarry Smith Level: intermediate 68153acd3b1SBarry Smith 68253acd3b1SBarry Smith Notes: Must be between a PetscOptionsBegin() and a PetscOptionsEnd() 68353acd3b1SBarry Smith 68453acd3b1SBarry Smith Must follow a PetscOptionsTruthGroupBegin() 68553acd3b1SBarry Smith 68653acd3b1SBarry Smith Concepts: options database^logical group 68753acd3b1SBarry Smith 68853acd3b1SBarry Smith .seealso: PetscOptionsGetInt(), PetscOptionsGetReal(), 68953acd3b1SBarry Smith PetscOptionsHasName(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsTruth(), 69053acd3b1SBarry Smith PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 69153acd3b1SBarry Smith PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 69253acd3b1SBarry Smith PetscOptionsTruthGroupBegin(), PetscOptionsTruthGroup(), PetscOptionsTruthGroupEnd(), 69353acd3b1SBarry Smith PetscOptionsList(), PetscOptionsEList() 69453acd3b1SBarry Smith @*/ 69553acd3b1SBarry Smith PetscErrorCode PETSC_DLLEXPORT PetscOptionsTruthGroupEnd(const char opt[],const char text[],const char man[],PetscTruth *flg) 69653acd3b1SBarry Smith { 69753acd3b1SBarry Smith PetscErrorCode ierr; 69853acd3b1SBarry Smith 69953acd3b1SBarry Smith PetscFunctionBegin; 70053acd3b1SBarry Smith ierr = PetscOptionsHasName(PetscOptionsObject.prefix,opt,flg);CHKERRQ(ierr); 70153acd3b1SBarry Smith if (PetscOptionsObject.printhelp && PetscOptionsPublishCount == 1) { 70253acd3b1SBarry Smith ierr = (*PetscHelpPrintf)(PetscOptionsObject.comm," -%s%s: %s (%s)\n",PetscOptionsObject.prefix?PetscOptionsObject.prefix:"",opt+1,text,man);CHKERRQ(ierr); 70353acd3b1SBarry Smith } 70453acd3b1SBarry Smith PetscFunctionReturn(0); 70553acd3b1SBarry Smith } 70653acd3b1SBarry Smith 70753acd3b1SBarry Smith #undef __FUNCT__ 70853acd3b1SBarry Smith #define __FUNCT__ "PetscOptionsTruth" 70953acd3b1SBarry Smith /*@C 71053acd3b1SBarry Smith PetscOptionsTruth - Determines if a particular option is in the database with a true or false 71153acd3b1SBarry Smith 71253acd3b1SBarry Smith Collective on the communicator passed in PetscOptionsBegin() 71353acd3b1SBarry Smith 71453acd3b1SBarry Smith Input Parameters: 71553acd3b1SBarry Smith + opt - option name 71653acd3b1SBarry Smith . text - short string that describes the option 71753acd3b1SBarry Smith - man - manual page with additional information on option 71853acd3b1SBarry Smith 71953acd3b1SBarry Smith Output Parameter: 72053acd3b1SBarry Smith . flg - PETSC_TRUE or PETSC_FALSE 72153acd3b1SBarry Smith . set - PETSC_TRUE if found, else PETSC_FALSE 72253acd3b1SBarry Smith 72353acd3b1SBarry Smith Level: beginner 72453acd3b1SBarry Smith 72553acd3b1SBarry Smith Concepts: options database^logical 72653acd3b1SBarry Smith 72753acd3b1SBarry Smith Notes: Must be between a PetscOptionsBegin() and a PetscOptionsEnd() 72853acd3b1SBarry Smith 72953acd3b1SBarry Smith .seealso: PetscOptionsGetReal(), PetscOptionsHasName(), PetscOptionsGetString(), PetscOptionsGetInt(), 73053acd3b1SBarry Smith PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsTruth() 73153acd3b1SBarry Smith PetscOptionsInt(), PetscOptionsString(), PetscOptionsReal(), PetscOptionsTruth(), 73253acd3b1SBarry Smith PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 73353acd3b1SBarry Smith PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 73453acd3b1SBarry Smith PetscOptionsTruthGroupBegin(), PetscOptionsTruthGroup(), PetscOptionsTruthGroupEnd(), 73553acd3b1SBarry Smith PetscOptionsList(), PetscOptionsEList() 73653acd3b1SBarry Smith @*/ 73753acd3b1SBarry Smith PetscErrorCode PETSC_DLLEXPORT PetscOptionsTruth(const char opt[],const char text[],const char man[],PetscTruth deflt,PetscTruth *flg,PetscTruth *set) 73853acd3b1SBarry Smith { 73953acd3b1SBarry Smith PetscErrorCode ierr; 74053acd3b1SBarry Smith PetscTruth iset; 74153acd3b1SBarry Smith 74253acd3b1SBarry Smith PetscFunctionBegin; 74353acd3b1SBarry Smith ierr = PetscOptionsGetTruth(PetscOptionsObject.prefix,opt,flg,&iset);CHKERRQ(ierr); 74453acd3b1SBarry Smith if (!iset) { 74553acd3b1SBarry Smith if (flg) *flg = deflt; 74653acd3b1SBarry Smith } 74753acd3b1SBarry Smith if (set) *set = iset; 74853acd3b1SBarry Smith if (PetscOptionsObject.printhelp && PetscOptionsPublishCount == 1) { 74953acd3b1SBarry Smith const char *v = PetscTruths[deflt]; 75053acd3b1SBarry Smith ierr = (*PetscHelpPrintf)(PetscOptionsObject.comm," -%s%s: <%s> %s (%s)\n",PetscOptionsObject.prefix?PetscOptionsObject.prefix:"",opt+1,v,text,man);CHKERRQ(ierr); 75153acd3b1SBarry Smith } 75253acd3b1SBarry Smith PetscFunctionReturn(0); 75353acd3b1SBarry Smith } 75453acd3b1SBarry Smith 75553acd3b1SBarry Smith #undef __FUNCT__ 75653acd3b1SBarry Smith #define __FUNCT__ "PetscOptionsRealArray" 75753acd3b1SBarry Smith /*@C 75853acd3b1SBarry Smith PetscOptionsRealArray - Gets an array of double values for a particular 75953acd3b1SBarry Smith option in the database. The values must be separated with commas with 76053acd3b1SBarry Smith no intervening spaces. 76153acd3b1SBarry Smith 76253acd3b1SBarry Smith Collective on the communicator passed in PetscOptionsBegin() 76353acd3b1SBarry Smith 76453acd3b1SBarry Smith Input Parameters: 76553acd3b1SBarry Smith + opt - the option one is seeking 76653acd3b1SBarry Smith . text - short string describing option 76753acd3b1SBarry Smith . man - manual page for option 76853acd3b1SBarry Smith - nmax - maximum number of values 76953acd3b1SBarry Smith 77053acd3b1SBarry Smith Output Parameter: 77153acd3b1SBarry Smith + value - location to copy values 77253acd3b1SBarry Smith . nmax - actual number of values found 77353acd3b1SBarry Smith - set - PETSC_TRUE if found, else PETSC_FALSE 77453acd3b1SBarry Smith 77553acd3b1SBarry Smith Level: beginner 77653acd3b1SBarry Smith 77753acd3b1SBarry Smith Notes: 77853acd3b1SBarry Smith The user should pass in an array of doubles 77953acd3b1SBarry Smith 78053acd3b1SBarry Smith Must be between a PetscOptionsBegin() and a PetscOptionsEnd() 78153acd3b1SBarry Smith 78253acd3b1SBarry Smith Concepts: options database^array of strings 78353acd3b1SBarry Smith 78453acd3b1SBarry Smith .seealso: PetscOptionsGetInt(), PetscOptionsGetReal(), 78553acd3b1SBarry Smith PetscOptionsHasName(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsTruth(), 78653acd3b1SBarry Smith PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 78753acd3b1SBarry Smith PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 78853acd3b1SBarry Smith PetscOptionsTruthGroupBegin(), PetscOptionsTruthGroup(), PetscOptionsTruthGroupEnd(), 78953acd3b1SBarry Smith PetscOptionsList(), PetscOptionsEList() 79053acd3b1SBarry Smith @*/ 79153acd3b1SBarry Smith PetscErrorCode PETSC_DLLEXPORT PetscOptionsRealArray(const char opt[],const char text[],const char man[],PetscReal value[],PetscInt *n,PetscTruth *set) 79253acd3b1SBarry Smith { 79353acd3b1SBarry Smith PetscErrorCode ierr; 79453acd3b1SBarry Smith PetscInt i; 79553acd3b1SBarry Smith 79653acd3b1SBarry Smith PetscFunctionBegin; 79753acd3b1SBarry Smith ierr = PetscOptionsGetRealArray(PetscOptionsObject.prefix,opt,value,n,set);CHKERRQ(ierr); 79853acd3b1SBarry Smith if (PetscOptionsObject.printhelp && PetscOptionsPublishCount == 1) { 79953acd3b1SBarry Smith ierr = (*PetscHelpPrintf)(PetscOptionsObject.comm," -%s%s <%g",PetscOptionsObject.prefix?PetscOptionsObject.prefix:"",opt+1,value[0]);CHKERRQ(ierr); 80053acd3b1SBarry Smith for (i=1; i<*n; i++) { 80153acd3b1SBarry Smith ierr = (*PetscHelpPrintf)(PetscOptionsObject.comm,",%g",value[i]);CHKERRQ(ierr); 80253acd3b1SBarry Smith } 80353acd3b1SBarry Smith ierr = (*PetscHelpPrintf)(PetscOptionsObject.comm,">: %s (%s)\n",text,man);CHKERRQ(ierr); 80453acd3b1SBarry Smith } 80553acd3b1SBarry Smith PetscFunctionReturn(0); 80653acd3b1SBarry Smith } 80753acd3b1SBarry Smith 80853acd3b1SBarry Smith 80953acd3b1SBarry Smith #undef __FUNCT__ 81053acd3b1SBarry Smith #define __FUNCT__ "PetscOptionsIntArray" 81153acd3b1SBarry Smith /*@C 81253acd3b1SBarry Smith PetscOptionsIntArray - Gets an array of integers for a particular 81353acd3b1SBarry Smith option in the database. The values must be separated with commas with 81453acd3b1SBarry Smith no intervening spaces. 81553acd3b1SBarry Smith 81653acd3b1SBarry Smith Collective on the communicator passed in PetscOptionsBegin() 81753acd3b1SBarry Smith 81853acd3b1SBarry Smith Input Parameters: 81953acd3b1SBarry Smith + opt - the option one is seeking 82053acd3b1SBarry Smith . text - short string describing option 82153acd3b1SBarry Smith . man - manual page for option 82253acd3b1SBarry Smith - nmax - maximum number of values 82353acd3b1SBarry Smith 82453acd3b1SBarry Smith Output Parameter: 82553acd3b1SBarry Smith + value - location to copy values 82653acd3b1SBarry Smith . nmax - actual number of values found 82753acd3b1SBarry Smith - set - PETSC_TRUE if found, else PETSC_FALSE 82853acd3b1SBarry Smith 82953acd3b1SBarry Smith Level: beginner 83053acd3b1SBarry Smith 83153acd3b1SBarry Smith Notes: 83253acd3b1SBarry Smith The user should pass in an array of integers 83353acd3b1SBarry Smith 83453acd3b1SBarry Smith Must be between a PetscOptionsBegin() and a PetscOptionsEnd() 83553acd3b1SBarry Smith 83653acd3b1SBarry Smith Concepts: options database^array of strings 83753acd3b1SBarry Smith 83853acd3b1SBarry Smith .seealso: PetscOptionsGetInt(), PetscOptionsGetReal(), 83953acd3b1SBarry Smith PetscOptionsHasName(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsTruth(), 84053acd3b1SBarry Smith PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 84153acd3b1SBarry Smith PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 84253acd3b1SBarry Smith PetscOptionsTruthGroupBegin(), PetscOptionsTruthGroup(), PetscOptionsTruthGroupEnd(), 84353acd3b1SBarry Smith PetscOptionsList(), PetscOptionsEList(), PetscOptionsRealArray() 84453acd3b1SBarry Smith @*/ 84553acd3b1SBarry Smith PetscErrorCode PETSC_DLLEXPORT PetscOptionsIntArray(const char opt[],const char text[],const char man[],PetscInt value[],PetscInt *n,PetscTruth *set) 84653acd3b1SBarry Smith { 84753acd3b1SBarry Smith PetscErrorCode ierr; 84853acd3b1SBarry Smith PetscInt i; 84953acd3b1SBarry Smith 85053acd3b1SBarry Smith PetscFunctionBegin; 85153acd3b1SBarry Smith ierr = PetscOptionsGetIntArray(PetscOptionsObject.prefix,opt,value,n,set);CHKERRQ(ierr); 85253acd3b1SBarry Smith if (PetscOptionsObject.printhelp && PetscOptionsPublishCount == 1) { 85353acd3b1SBarry Smith ierr = (*PetscHelpPrintf)(PetscOptionsObject.comm," -%s%s <%d",PetscOptionsObject.prefix?PetscOptionsObject.prefix:"",opt+1,value[0]);CHKERRQ(ierr); 85453acd3b1SBarry Smith for (i=1; i<*n; i++) { 85553acd3b1SBarry Smith ierr = (*PetscHelpPrintf)(PetscOptionsObject.comm,",%d",value[i]);CHKERRQ(ierr); 85653acd3b1SBarry Smith } 85753acd3b1SBarry Smith ierr = (*PetscHelpPrintf)(PetscOptionsObject.comm,">: %s (%s)\n",text,man);CHKERRQ(ierr); 85853acd3b1SBarry Smith } 85953acd3b1SBarry Smith PetscFunctionReturn(0); 86053acd3b1SBarry Smith } 86153acd3b1SBarry Smith 86253acd3b1SBarry Smith #undef __FUNCT__ 86353acd3b1SBarry Smith #define __FUNCT__ "PetscOptionsStringArray" 86453acd3b1SBarry Smith /*@C 86553acd3b1SBarry Smith PetscOptionsStringArray - Gets an array of string values for a particular 86653acd3b1SBarry Smith option in the database. The values must be separated with commas with 86753acd3b1SBarry Smith no intervening spaces. 86853acd3b1SBarry Smith 86953acd3b1SBarry Smith Collective on the communicator passed in PetscOptionsBegin() 87053acd3b1SBarry Smith 87153acd3b1SBarry Smith Input Parameters: 87253acd3b1SBarry Smith + opt - the option one is seeking 87353acd3b1SBarry Smith . text - short string describing option 87453acd3b1SBarry Smith . man - manual page for option 87553acd3b1SBarry Smith - nmax - maximum number of strings 87653acd3b1SBarry Smith 87753acd3b1SBarry Smith Output Parameter: 87853acd3b1SBarry Smith + value - location to copy strings 87953acd3b1SBarry Smith . nmax - actual number of strings found 88053acd3b1SBarry Smith - set - PETSC_TRUE if found, else PETSC_FALSE 88153acd3b1SBarry Smith 88253acd3b1SBarry Smith Level: beginner 88353acd3b1SBarry Smith 88453acd3b1SBarry Smith Notes: 88553acd3b1SBarry Smith The user should pass in an array of pointers to char, to hold all the 88653acd3b1SBarry Smith strings returned by this function. 88753acd3b1SBarry Smith 88853acd3b1SBarry Smith The user is responsible for deallocating the strings that are 88953acd3b1SBarry Smith returned. The Fortran interface for this routine is not supported. 89053acd3b1SBarry Smith 89153acd3b1SBarry Smith Must be between a PetscOptionsBegin() and a PetscOptionsEnd() 89253acd3b1SBarry Smith 89353acd3b1SBarry Smith Concepts: options database^array of strings 89453acd3b1SBarry Smith 89553acd3b1SBarry Smith .seealso: PetscOptionsGetInt(), PetscOptionsGetReal(), 89653acd3b1SBarry Smith PetscOptionsHasName(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsTruth(), 89753acd3b1SBarry Smith PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 89853acd3b1SBarry Smith PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 89953acd3b1SBarry Smith PetscOptionsTruthGroupBegin(), PetscOptionsTruthGroup(), PetscOptionsTruthGroupEnd(), 90053acd3b1SBarry Smith PetscOptionsList(), PetscOptionsEList() 90153acd3b1SBarry Smith @*/ 90253acd3b1SBarry Smith PetscErrorCode PETSC_DLLEXPORT PetscOptionsStringArray(const char opt[],const char text[],const char man[],char *value[],PetscInt *nmax,PetscTruth *set) 90353acd3b1SBarry Smith { 90453acd3b1SBarry Smith PetscErrorCode ierr; 90553acd3b1SBarry Smith 90653acd3b1SBarry Smith PetscFunctionBegin; 90753acd3b1SBarry Smith ierr = PetscOptionsGetStringArray(PetscOptionsObject.prefix,opt,value,nmax,set);CHKERRQ(ierr); 90853acd3b1SBarry Smith if (PetscOptionsObject.printhelp && PetscOptionsPublishCount == 1) { 90953acd3b1SBarry Smith ierr = (*PetscHelpPrintf)(PetscOptionsObject.comm," -%s%s <string1,string2,...>: %s (%s)\n",PetscOptionsObject.prefix?PetscOptionsObject.prefix:"",opt+1,text,man);CHKERRQ(ierr); 91053acd3b1SBarry Smith } 91153acd3b1SBarry Smith PetscFunctionReturn(0); 91253acd3b1SBarry Smith } 91353acd3b1SBarry Smith 91453acd3b1SBarry Smith 91553acd3b1SBarry Smith #undef __FUNCT__ 91653acd3b1SBarry Smith #define __FUNCT__ "PetscOptionsHead" 91753acd3b1SBarry Smith /*@C 91853acd3b1SBarry Smith PetscOptionsHead - Puts a heading before list any more published options. Used, for example, 91953acd3b1SBarry Smith in KSPSetFromOptions_GMRES(). 92053acd3b1SBarry Smith 92153acd3b1SBarry Smith Collective on the communicator passed in PetscOptionsBegin() 92253acd3b1SBarry Smith 92353acd3b1SBarry Smith Input Parameter: 92453acd3b1SBarry Smith . head - the heading text 92553acd3b1SBarry Smith 92653acd3b1SBarry Smith 92753acd3b1SBarry Smith Level: intermediate 92853acd3b1SBarry Smith 92953acd3b1SBarry Smith Notes: Must be between a PetscOptionsBegin() and a PetscOptionsEnd() 93053acd3b1SBarry Smith 93153acd3b1SBarry Smith Must be followed by a call to PetscOptionsTail() in the same function. 93253acd3b1SBarry Smith 93353acd3b1SBarry Smith Concepts: options database^subheading 93453acd3b1SBarry Smith 93553acd3b1SBarry Smith .seealso: PetscOptionsGetInt(), PetscOptionsGetReal(), 93653acd3b1SBarry Smith PetscOptionsHasName(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsTruth(), 93753acd3b1SBarry Smith PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 93853acd3b1SBarry Smith PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 93953acd3b1SBarry Smith PetscOptionsTruthGroupBegin(), PetscOptionsTruthGroup(), PetscOptionsTruthGroupEnd(), 94053acd3b1SBarry Smith PetscOptionsList(), PetscOptionsEList() 94153acd3b1SBarry Smith @*/ 94253acd3b1SBarry Smith PetscErrorCode PETSC_DLLEXPORT PetscOptionsHead(const char head[]) 94353acd3b1SBarry Smith { 94453acd3b1SBarry Smith PetscErrorCode ierr; 94553acd3b1SBarry Smith 94653acd3b1SBarry Smith PetscFunctionBegin; 94753acd3b1SBarry Smith if (PetscOptionsObject.printhelp && PetscOptionsPublishCount == 1) { 94853acd3b1SBarry Smith ierr = (*PetscHelpPrintf)(PetscOptionsObject.comm," %s\n",head);CHKERRQ(ierr); 94953acd3b1SBarry Smith } 95053acd3b1SBarry Smith PetscFunctionReturn(0); 95153acd3b1SBarry Smith } 95253acd3b1SBarry Smith 95353acd3b1SBarry Smith 95453acd3b1SBarry Smith 95553acd3b1SBarry Smith 95653acd3b1SBarry Smith 95753acd3b1SBarry Smith 958