xref: /petsc/include/petscoptions.h (revision edd03b47ed9fa9b7ef9dd67df42d5194593a501d)
1f26ada1bSBarry Smith /*
237f753daSBarry Smith    Routines to determine options set in the options database.
3f26ada1bSBarry Smith */
46524c165SJacob Faibussowitsch #ifndef PETSCOPTIONS_H
526bd1501SBarry Smith #define PETSCOPTIONS_H
6ac09b921SBarry Smith 
72c8e378dSBarry Smith #include <petscsys.h>
8c619b03eSJed Brown #include <petscviewertypes.h>
93a3b2205SBarry Smith 
10ac09b921SBarry Smith /* SUBMANSEC = Sys */
11ac09b921SBarry Smith 
129355ec05SMatthew G. Knepley typedef enum {
139355ec05SMatthew G. Knepley   PETSC_OPT_CODE,
149355ec05SMatthew G. Knepley   PETSC_OPT_COMMAND_LINE,
159355ec05SMatthew G. Knepley   PETSC_OPT_FILE,
169355ec05SMatthew G. Knepley   PETSC_OPT_ENVIRONMENT,
179355ec05SMatthew G. Knepley   NUM_PETSC_OPT_SOURCE
189355ec05SMatthew G. Knepley } PetscOptionSource;
199355ec05SMatthew G. Knepley 
20c5c1f447SLisandro Dalcin #define PETSC_MAX_OPTION_NAME 512
21c5929fdfSBarry Smith typedef struct _n_PetscOptions *PetscOptions;
22c5929fdfSBarry Smith PETSC_EXTERN PetscErrorCode     PetscOptionsCreate(PetscOptions *);
23b4205f0bSBarry Smith PETSC_EXTERN PetscErrorCode     PetscOptionsPush(PetscOptions);
24b4205f0bSBarry Smith PETSC_EXTERN PetscErrorCode     PetscOptionsPop(void);
25c5929fdfSBarry Smith PETSC_EXTERN PetscErrorCode     PetscOptionsDestroy(PetscOptions *);
262d747510SLisandro Dalcin PETSC_EXTERN PetscErrorCode     PetscOptionsCreateDefault(void);
272d747510SLisandro Dalcin PETSC_EXTERN PetscErrorCode     PetscOptionsDestroyDefault(void);
28c5929fdfSBarry Smith 
292d747510SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscOptionsHasHelp(PetscOptions, PetscBool *);
30c5929fdfSBarry Smith PETSC_EXTERN PetscErrorCode PetscOptionsHasName(PetscOptions, const char[], const char[], PetscBool *);
31c5929fdfSBarry Smith PETSC_EXTERN PetscErrorCode PetscOptionsGetBool(PetscOptions, const char[], const char[], PetscBool *, PetscBool *);
322d747510SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscOptionsGetInt(PetscOptions, const char[], const char[], PetscInt *, PetscBool *);
332d747510SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscOptionsGetEnum(PetscOptions, const char[], const char[], const char *const *, PetscEnum *, PetscBool *);
342d747510SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscOptionsGetEList(PetscOptions, const char[], const char[], const char *const *, PetscInt, PetscInt *, PetscBool *);
35c5929fdfSBarry Smith PETSC_EXTERN PetscErrorCode PetscOptionsGetReal(PetscOptions, const char[], const char[], PetscReal *, PetscBool *);
36c5929fdfSBarry Smith PETSC_EXTERN PetscErrorCode PetscOptionsGetScalar(PetscOptions, const char[], const char[], PetscScalar *, PetscBool *);
372d747510SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscOptionsGetString(PetscOptions, const char[], const char[], char[], size_t, PetscBool *);
382d747510SLisandro Dalcin 
392d747510SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscOptionsGetBoolArray(PetscOptions, const char[], const char[], PetscBool[], PetscInt *, PetscBool *);
402d747510SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscOptionsGetEnumArray(PetscOptions, const char[], const char[], const char *const *, PetscEnum *, PetscInt *, PetscBool *);
41c5929fdfSBarry Smith PETSC_EXTERN PetscErrorCode PetscOptionsGetIntArray(PetscOptions, const char[], const char[], PetscInt[], PetscInt *, PetscBool *);
42c5929fdfSBarry Smith PETSC_EXTERN PetscErrorCode PetscOptionsGetRealArray(PetscOptions, const char[], const char[], PetscReal[], PetscInt *, PetscBool *);
43c5929fdfSBarry Smith PETSC_EXTERN PetscErrorCode PetscOptionsGetScalarArray(PetscOptions, const char[], const char[], PetscScalar[], PetscInt *, PetscBool *);
44c5929fdfSBarry Smith PETSC_EXTERN PetscErrorCode PetscOptionsGetStringArray(PetscOptions, const char[], const char[], char *[], PetscInt *, PetscBool *);
453a3b2205SBarry Smith 
462d747510SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscOptionsValidKey(const char[], PetscBool *);
47c5929fdfSBarry Smith PETSC_EXTERN PetscErrorCode PetscOptionsSetAlias(PetscOptions, const char[], const char[]);
48c5929fdfSBarry Smith PETSC_EXTERN PetscErrorCode PetscOptionsSetValue(PetscOptions, const char[], const char[]);
49c5929fdfSBarry Smith PETSC_EXTERN PetscErrorCode PetscOptionsClearValue(PetscOptions, const char[]);
502d747510SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscOptionsFindPair(PetscOptions, const char[], const char[], const char *[], PetscBool *);
513a3b2205SBarry Smith 
522d747510SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscOptionsGetAll(PetscOptions, char *[]);
53c5929fdfSBarry Smith PETSC_EXTERN PetscErrorCode PetscOptionsAllUsed(PetscOptions, PetscInt *);
542d747510SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscOptionsUsed(PetscOptions, const char[], PetscBool *);
55c5929fdfSBarry Smith PETSC_EXTERN PetscErrorCode PetscOptionsLeft(PetscOptions);
561ab23d95SFande Kong PETSC_EXTERN PetscErrorCode PetscOptionsLeftGet(PetscOptions, PetscInt *, char ***, char ***);
575b191818SFande Kong PETSC_EXTERN PetscErrorCode PetscOptionsLeftRestore(PetscOptions, PetscInt *, char ***, char ***);
58c5929fdfSBarry Smith PETSC_EXTERN PetscErrorCode PetscOptionsView(PetscOptions, PetscViewer);
594b0e389bSBarry Smith 
602d747510SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscOptionsReject(PetscOptions, const char[], const char[], const char[]);
61c5929fdfSBarry Smith PETSC_EXTERN PetscErrorCode PetscOptionsInsert(PetscOptions, int *, char ***, const char[]);
62c5929fdfSBarry Smith PETSC_EXTERN PetscErrorCode PetscOptionsInsertFile(MPI_Comm, PetscOptions, const char[], PetscBool);
635c23ca1cSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscOptionsInsertFileYAML(MPI_Comm, PetscOptions, const char[], PetscBool);
64c5929fdfSBarry Smith PETSC_EXTERN PetscErrorCode PetscOptionsInsertString(PetscOptions, const char[]);
65080f0011SToby Isaac PETSC_EXTERN PetscErrorCode PetscOptionsInsertStringYAML(PetscOptions, const char[]);
66d06005cbSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscOptionsInsertArgs(PetscOptions, int, char **);
67c5929fdfSBarry Smith PETSC_EXTERN PetscErrorCode PetscOptionsClear(PetscOptions);
68c5929fdfSBarry Smith PETSC_EXTERN PetscErrorCode PetscOptionsPrefixPush(PetscOptions, const char[]);
69c5929fdfSBarry Smith PETSC_EXTERN PetscErrorCode PetscOptionsPrefixPop(PetscOptions);
705d0dffe5SBarry Smith 
71014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscOptionsGetenv(MPI_Comm, const char[], char[], size_t, PetscBool *);
722d747510SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscOptionsStringToBool(const char[], PetscBool *);
73014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscOptionsStringToInt(const char[], PetscInt *);
74014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscOptionsStringToReal(const char[], PetscReal *);
752d747510SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscOptionsStringToScalar(const char[], PetscScalar *);
762e8a6d31SBarry Smith 
779355ec05SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscOptionsMonitorSet(PetscErrorCode (*)(const char[], const char[], PetscOptionSource, void *), void *, PetscErrorCode (*)(void **));
789355ec05SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscOptionsMonitorDefault(const char[], const char[], PetscOptionSource, void *);
79081c24baSBoyana Norris 
8084761bfeSJed Brown PETSC_EXTERN PetscErrorCode PetscObjectSetOptions(PetscObject, PetscOptions);
8184761bfeSJed Brown PETSC_EXTERN PetscErrorCode PetscObjectGetOptions(PetscObject, PetscOptions *);
8284761bfeSJed Brown 
83014dd563SJed Brown PETSC_EXTERN PetscBool PetscOptionsPublish;
84e55864a3SBarry Smith 
85e55864a3SBarry Smith /*
86e55864a3SBarry Smith     See manual page for PetscOptionsBegin()
874416b707SBarry Smith 
884416b707SBarry Smith     PetscOptionsItem and PetscOptionsItems are a single option (such as ksp_type) and a collection of such single
894416b707SBarry Smith   options being handled with a PetscOptionsBegin/End()
904416b707SBarry Smith 
91e55864a3SBarry Smith */
929371c9d4SSatish Balay typedef enum {
939371c9d4SSatish Balay   OPTION_INT,
949371c9d4SSatish Balay   OPTION_BOOL,
959371c9d4SSatish Balay   OPTION_REAL,
969371c9d4SSatish Balay   OPTION_FLIST,
979371c9d4SSatish Balay   OPTION_STRING,
989371c9d4SSatish Balay   OPTION_REAL_ARRAY,
999371c9d4SSatish Balay   OPTION_SCALAR_ARRAY,
1009371c9d4SSatish Balay   OPTION_HEAD,
1019371c9d4SSatish Balay   OPTION_INT_ARRAY,
1029371c9d4SSatish Balay   OPTION_ELIST,
1039371c9d4SSatish Balay   OPTION_BOOL_ARRAY,
1049371c9d4SSatish Balay   OPTION_STRING_ARRAY
1059371c9d4SSatish Balay } PetscOptionType;
1069355ec05SMatthew G. Knepley 
1074416b707SBarry Smith typedef struct _n_PetscOptionItem *PetscOptionItem;
1084416b707SBarry Smith struct _n_PetscOptionItem {
109e55864a3SBarry Smith   char              *option;
110e55864a3SBarry Smith   char              *text;
111e55864a3SBarry Smith   void              *data;  /* used to hold the default value and then any value it is changed to by GUI */
112e55864a3SBarry Smith   PetscFunctionList  flist; /* used for available values for PetscOptionsList() */
113e55864a3SBarry Smith   const char *const *list;  /* used for available values for PetscOptionsEList() */
114e55864a3SBarry Smith   char               nlist; /* number of entries in list */
115e55864a3SBarry Smith   char              *man;
116e55864a3SBarry Smith   size_t             arraylength; /* number of entries in data in the case that it is an array (of PetscInt etc) */
117e55864a3SBarry Smith   PetscBool          set;         /* the user has changed this value in the GUI */
118e55864a3SBarry Smith   PetscOptionType    type;
1194416b707SBarry Smith   PetscOptionItem    next;
120e55864a3SBarry Smith   char              *pman;
121e55864a3SBarry Smith   void              *edata;
122e55864a3SBarry Smith };
123e55864a3SBarry Smith 
1244416b707SBarry Smith typedef struct _p_PetscOptionItems {
125e55864a3SBarry Smith   PetscInt        count;
1264416b707SBarry Smith   PetscOptionItem next;
127e55864a3SBarry Smith   char           *prefix, *pprefix;
128e55864a3SBarry Smith   char           *title;
129e55864a3SBarry Smith   MPI_Comm        comm;
130e55864a3SBarry Smith   PetscBool       printhelp, changedmethod, alreadyprinted;
131e55864a3SBarry Smith   PetscObject     object;
132c5929fdfSBarry Smith   PetscOptions    options;
1334416b707SBarry Smith } PetscOptionItems;
13430de9b25SBarry Smith 
1355f80ce2aSJacob Faibussowitsch #if defined(PETSC_CLANG_STATIC_ANALYZER)
13694bad497SJacob Faibussowitsch extern PetscOptionItems *PetscOptionsObject; /* declare this so that the PetscOptions stubs work */
1375f80ce2aSJacob Faibussowitsch PetscErrorCode           PetscOptionsBegin(MPI_Comm, const char *, const char *, const char *);
1385f80ce2aSJacob Faibussowitsch PetscErrorCode           PetscObjectOptionsBegin(PetscObject);
1395f80ce2aSJacob Faibussowitsch PetscErrorCode           PetscOptionsEnd(void);
1405f80ce2aSJacob Faibussowitsch #else
14130de9b25SBarry Smith   /*MC
14230de9b25SBarry Smith     PetscOptionsBegin - Begins a set of queries on the options database that are related and should be
1431957e957SBarry Smith      displayed on the same window of a GUI that allows the user to set the options interactively. Often one should
14416a05f60SBarry Smith      use `PetscObjectOptionsBegin()` rather than this call.
14530de9b25SBarry Smith 
146f2ba6396SBarry Smith    Synopsis:
147aaa7dc30SBarry Smith     #include <petscoptions.h>
148f2ba6396SBarry Smith     PetscErrorCode PetscOptionsBegin(MPI_Comm comm,const char prefix[],const char title[],const char mansec[])
14930de9b25SBarry Smith 
150fb455bf4SPatrick Sanan     Collective
15130de9b25SBarry Smith 
15230de9b25SBarry Smith   Input Parameters:
15330de9b25SBarry Smith +   comm - communicator that shares GUI
15476280437SVaclav Hapla .   prefix - options prefix for all options displayed on window (optional)
15530de9b25SBarry Smith .   title - short descriptive text, for example "Krylov Solver Options"
15687497f52SBarry Smith -   mansec - section of manual pages for options, for example `KSP` (optional)
15730de9b25SBarry Smith 
15830de9b25SBarry Smith   Level: intermediate
15930de9b25SBarry Smith 
16095452b02SPatrick Sanan   Notes:
161d0609cedSBarry Smith     This is a macro that handles its own error checking, it does not return an error code.
162d0609cedSBarry Smith 
16387497f52SBarry Smith     The set of queries needs to be ended by a call to `PetscOptionsEnd()`.
164fb455bf4SPatrick Sanan 
16587497f52SBarry Smith     One can add subheadings with `PetscOptionsHeadBegin()`.
16630de9b25SBarry Smith 
16795452b02SPatrick Sanan   Developer Notes:
16816a05f60SBarry Smith       `PetscOptionsPublish` is set in `PetscOptionsCheckInitial_Private()` with `-saws_options`. When `PetscOptionsPublish` is set the
16916a05f60SBarry Smith       loop between `PetscOptionsBegin()` and `PetscOptionsEnd()` is run THREE times with `PetscOptionsPublishCount` of values -1,0,1.
17016a05f60SBarry Smith       Otherwise the loop is run ONCE with a `PetscOptionsPublishCount` of 1.
17116a05f60SBarry Smith +      \-1 - `PetscOptionsInt()` etc. just call `PetscOptionsGetInt()` etc.
17216a05f60SBarry Smith .      0  - The GUI objects are created in `PetscOptionsInt()` etc. and displayed in `PetscOptionsEnd()` and the options
17316a05f60SBarry Smith                database updated with user changes; `PetscOptionsGetInt()` etc. are also called.
17416a05f60SBarry Smith -      1 - `PetscOptionsInt()` etc. again call `PetscOptionsGetInt()` etc. (possibly getting new values), in addition the help message and
175fb455bf4SPatrick Sanan               default values are printed if -help was given.
17616a05f60SBarry Smith       When `PetscOptionsObject.changedmethod` is set this causes `PetscOptionsPublishCount` to be reset to -2 (so in the next loop iteration it is -1)
17716a05f60SBarry Smith       and the whole process is repeated. This is to handle when, for example, the `KSPType` is changed thus changing the list of
17816a05f60SBarry Smith       options available so they need to be redisplayed so the user can change the. Changing `PetscOptionsObjects.changedmethod` is never
179fb455bf4SPatrick Sanan       currently set.
180aee2cecaSBarry Smith 
1814bb2516aSBarry Smith    Fortran Note:
1824bb2516aSBarry Smith    Returns ierr error code per PETSc Fortran API
1834bb2516aSBarry Smith 
184db781477SPatrick Sanan .seealso: `PetscOptionsGetReal()`, `PetscOptionsHasName()`, `PetscOptionsGetString()`, `PetscOptionsGetInt()`,
185db781477SPatrick Sanan           `PetscOptionsGetIntArray()`, `PetscOptionsGetRealArray()`, `PetscOptionsBool()`
186db781477SPatrick Sanan           `PetscOptionsInt()`, `PetscOptionsString()`, `PetscOptionsReal()`, `PetscOptionsBool()`,
187db781477SPatrick Sanan           `PetscOptionsName()`, `PetscOptionsEnd()`, `PetscOptionsHeadBegin()`,
188c2e3fba1SPatrick Sanan           `PetscOptionsStringArray()`, `PetscOptionsRealArray()`, `PetscOptionsScalar()`,
189db781477SPatrick Sanan           `PetscOptionsBoolGroupBegin()`, `PetscOptionsBoolGroup()`, `PetscOptionsBoolGroupEnd()`,
190db781477SPatrick Sanan           `PetscOptionsFList()`, `PetscOptionsEList()`, `PetscObjectOptionsBegin()`
19130de9b25SBarry Smith M*/
1929371c9d4SSatish Balay   #define PetscOptionsBegin(comm, prefix, mess, sec) \
1939371c9d4SSatish Balay     do { \
1944416b707SBarry Smith       PetscOptionItems  PetscOptionsObjectBase; \
1954416b707SBarry Smith       PetscOptionItems *PetscOptionsObject = &PetscOptionsObjectBase; \
196d0609cedSBarry Smith       PetscCall(PetscMemzero(PetscOptionsObject, sizeof(*PetscOptionsObject))); \
197e55864a3SBarry Smith       for (PetscOptionsObject->count = (PetscOptionsPublish ? -1 : 1); PetscOptionsObject->count < 2; PetscOptionsObject->count++) { \
1989566063dSJacob Faibussowitsch         PetscCall(PetscOptionsBegin_Private(PetscOptionsObject, comm, prefix, mess, sec))
19930de9b25SBarry Smith 
2005fefd1ebSJed Brown   /*MC
2015fefd1ebSJed Brown     PetscObjectOptionsBegin - Begins a set of queries on the options database that are related and should be
2025fefd1ebSJed Brown      displayed on the same window of a GUI that allows the user to set the options interactively.
2035fefd1ebSJed Brown 
204f2ba6396SBarry Smith    Synopsis:
205aaa7dc30SBarry Smith     #include <petscoptions.h>
206f2ba6396SBarry Smith     PetscErrorCode PetscObjectOptionsBegin(PetscObject obj)
2075fefd1ebSJed Brown 
208c3339decSBarry Smith     Collective
2095fefd1ebSJed Brown 
2102fe279fdSBarry Smith   Input Parameter:
2115fefd1ebSJed Brown .   obj - object to set options for
2125fefd1ebSJed Brown 
2135fefd1ebSJed Brown   Level: intermediate
2145fefd1ebSJed Brown 
21595452b02SPatrick Sanan   Notes:
216d0609cedSBarry Smith     This is a macro that handles its own error checking, it does not return an error code.
217d0609cedSBarry Smith 
21887497f52SBarry Smith     Needs to be ended by a call the `PetscOptionsEnd()`
219d0609cedSBarry Smith 
22087497f52SBarry Smith     Can add subheadings with `PetscOptionsHeadBegin()`
2215fefd1ebSJed Brown 
222db781477SPatrick Sanan .seealso: `PetscOptionsGetReal()`, `PetscOptionsHasName()`, `PetscOptionsGetString()`, `PetscOptionsGetInt()`,
223db781477SPatrick Sanan           `PetscOptionsGetIntArray()`, `PetscOptionsGetRealArray()`, `PetscOptionsBool()`
224db781477SPatrick Sanan           `PetscOptionsInt()`, `PetscOptionsString()`, `PetscOptionsReal()`, `PetscOptionsBool()`,
225db781477SPatrick Sanan           `PetscOptionsName()`, `PetscOptionsBegin()`, `PetscOptionsEnd()`, `PetscOptionsHeadBegin()`,
226c2e3fba1SPatrick Sanan           `PetscOptionsStringArray()`, `PetscOptionsRealArray()`, `PetscOptionsScalar()`,
227db781477SPatrick Sanan           `PetscOptionsBoolGroupBegin()`, `PetscOptionsBoolGroup()`, `PetscOptionsBoolGroupEnd()`,
228db781477SPatrick Sanan           `PetscOptionsFList()`, `PetscOptionsEList()`
2295fefd1ebSJed Brown M*/
2309371c9d4SSatish Balay   #define PetscObjectOptionsBegin(obj) \
2319371c9d4SSatish Balay     do { \
2324416b707SBarry Smith       PetscOptionItems  PetscOptionsObjectBase; \
2334416b707SBarry Smith       PetscOptionItems *PetscOptionsObject = &PetscOptionsObjectBase; \
234c5929fdfSBarry Smith       PetscOptionsObject->options          = ((PetscObject)obj)->options; \
235e55864a3SBarry Smith       for (PetscOptionsObject->count = (PetscOptionsPublish ? -1 : 1); PetscOptionsObject->count < 2; PetscOptionsObject->count++) { \
236dbbe0bcdSBarry Smith         PetscCall(PetscObjectOptionsBegin_Private(obj, PetscOptionsObject))
2373194b578SJed Brown 
23830de9b25SBarry Smith   /*MC
23930de9b25SBarry Smith     PetscOptionsEnd - Ends a set of queries on the options database that are related and should be
24030de9b25SBarry Smith      displayed on the same window of a GUI that allows the user to set the options interactively.
24130de9b25SBarry Smith 
242f2ba6396SBarry Smith    Synopsis:
243aaa7dc30SBarry Smith      #include <petscoptions.h>
244f2ba6396SBarry Smith      PetscErrorCode PetscOptionsEnd(void)
24530de9b25SBarry Smith 
2467cdbe19fSJose E. Roman     Collective on the comm used in `PetscOptionsBegin()` or obj used in `PetscObjectOptionsBegin()`
2477cdbe19fSJose E. Roman 
24830de9b25SBarry Smith   Level: intermediate
24930de9b25SBarry Smith 
25095452b02SPatrick Sanan   Notes:
25187497f52SBarry Smith     Needs to be preceded by a call to `PetscOptionsBegin()` or `PetscObjectOptionsBegin()`
25230de9b25SBarry Smith 
253d0609cedSBarry Smith     This is a macro that handles its own error checking, it does not return an error code.
254d0609cedSBarry Smith 
2554bb2516aSBarry Smith   Fortran Note:
2564bb2516aSBarry Smith    Returns ierr error code per PETSc Fortran API
2574bb2516aSBarry Smith 
258db781477SPatrick Sanan .seealso: `PetscOptionsGetReal()`, `PetscOptionsHasName()`, `PetscOptionsGetString()`, `PetscOptionsGetInt()`,
259db781477SPatrick Sanan           `PetscOptionsGetIntArray()`, `PetscOptionsGetRealArray()`, `PetscOptionsBool()`
260db781477SPatrick Sanan           `PetscOptionsInt()`, `PetscOptionsString()`, `PetscOptionsReal()`, `PetscOptionsBool()`,
261db781477SPatrick Sanan           `PetscOptionsName()`, `PetscOptionsBegin()`, `PetscOptionsHeadBegin()`,
262c2e3fba1SPatrick Sanan           `PetscOptionsStringArray()`, `PetscOptionsRealArray()`, `PetscOptionsScalar()`,
263db781477SPatrick Sanan           `PetscOptionsBoolGroupBegin()`, `PetscOptionsBoolGroup()`, `PetscOptionsBoolGroupEnd()`,
264db781477SPatrick Sanan           `PetscOptionsFList()`, `PetscOptionsEList()`, `PetscObjectOptionsBegin()`
26530de9b25SBarry Smith M*/
2669371c9d4SSatish Balay   #define PetscOptionsEnd() \
2679371c9d4SSatish Balay     PetscCall(PetscOptionsEnd_Private(PetscOptionsObject)); \
2689371c9d4SSatish Balay     } \
2699371c9d4SSatish Balay     } \
2709371c9d4SSatish Balay     while (0)
2715f80ce2aSJacob Faibussowitsch #endif /* PETSC_CLANG_STATIC_ANALYZER */
27230de9b25SBarry Smith 
2734416b707SBarry Smith PETSC_EXTERN PetscErrorCode PetscOptionsBegin_Private(PetscOptionItems *, MPI_Comm, const char[], const char[], const char[]);
274dbbe0bcdSBarry Smith PETSC_EXTERN PetscErrorCode PetscObjectOptionsBegin_Private(PetscObject, PetscOptionItems *);
2754416b707SBarry Smith PETSC_EXTERN PetscErrorCode PetscOptionsEnd_Private(PetscOptionItems *);
276d0609cedSBarry Smith PETSC_EXTERN PetscErrorCode PetscOptionsHeadBegin(PetscOptionItems *, const char[]);
27730de9b25SBarry Smith 
2785f80ce2aSJacob Faibussowitsch #if defined(PETSC_CLANG_STATIC_ANALYZER)
2799371c9d4SSatish Balay template <typename... T>
2809371c9d4SSatish Balay void PetscOptionsHeadBegin(T...);
281d0609cedSBarry Smith void PetscOptionsHeadEnd(void);
2829371c9d4SSatish Balay template <typename... T>
2839371c9d4SSatish Balay PetscErrorCode PetscOptionsEnum(T...);
2849371c9d4SSatish Balay template <typename... T>
2859371c9d4SSatish Balay PetscErrorCode PetscOptionsInt(T...);
2869371c9d4SSatish Balay template <typename... T>
2879371c9d4SSatish Balay PetscErrorCode PetscOptionsBoundedInt(T...);
2889371c9d4SSatish Balay template <typename... T>
2899371c9d4SSatish Balay PetscErrorCode PetscOptionsRangeInt(T...);
2909371c9d4SSatish Balay template <typename... T>
2919371c9d4SSatish Balay PetscErrorCode PetscOptionsReal(T...);
2929371c9d4SSatish Balay template <typename... T>
2939371c9d4SSatish Balay PetscErrorCode PetscOptionsScalar(T...);
2949371c9d4SSatish Balay template <typename... T>
2959371c9d4SSatish Balay PetscErrorCode PetscOptionsName(T...);
2969371c9d4SSatish Balay template <typename... T>
2979371c9d4SSatish Balay PetscErrorCode PetscOptionsString(T...);
2989371c9d4SSatish Balay template <typename... T>
2999371c9d4SSatish Balay PetscErrorCode PetscOptionsBool(T...);
3009371c9d4SSatish Balay template <typename... T>
3019371c9d4SSatish Balay PetscErrorCode PetscOptionsBoolGroupBegin(T...);
3029371c9d4SSatish Balay template <typename... T>
3039371c9d4SSatish Balay PetscErrorCode PetscOptionsBoolGroup(T...);
3049371c9d4SSatish Balay template <typename... T>
3059371c9d4SSatish Balay PetscErrorCode PetscOptionsBoolGroupEnd(T...);
3069371c9d4SSatish Balay template <typename... T>
3079371c9d4SSatish Balay PetscErrorCode PetscOptionsFList(T...);
3089371c9d4SSatish Balay template <typename... T>
3099371c9d4SSatish Balay PetscErrorCode PetscOptionsEList(T...);
3109371c9d4SSatish Balay template <typename... T>
3119371c9d4SSatish Balay PetscErrorCode PetscOptionsRealArray(T...);
3129371c9d4SSatish Balay template <typename... T>
3139371c9d4SSatish Balay PetscErrorCode PetscOptionsScalarArray(T...);
3149371c9d4SSatish Balay template <typename... T>
3159371c9d4SSatish Balay PetscErrorCode PetscOptionsIntArray(T...);
3169371c9d4SSatish Balay template <typename... T>
3179371c9d4SSatish Balay PetscErrorCode PetscOptionsStringArray(T...);
3189371c9d4SSatish Balay template <typename... T>
3199371c9d4SSatish Balay PetscErrorCode PetscOptionsBoolArray(T...);
3209371c9d4SSatish Balay template <typename... T>
3219371c9d4SSatish Balay PetscErrorCode PetscOptionsEnumArray(T...);
3229371c9d4SSatish Balay template <typename... T>
3239371c9d4SSatish Balay PetscErrorCode PetscOptionsDeprecated(T...);
3249371c9d4SSatish Balay template <typename... T>
3259371c9d4SSatish Balay PetscErrorCode PetscOptionsDeprecatedNoObject(T...);
3265f80ce2aSJacob Faibussowitsch #else
32730de9b25SBarry Smith   /*MC
328d0609cedSBarry Smith      PetscOptionsHeadBegin - Puts a heading before listing any more published options. Used, for example,
32916a05f60SBarry Smith             in `KSPSetFromOptions_GMRES()`.
330d0609cedSBarry Smith 
33116a05f60SBarry Smith    Logically Collective on the communicator passed in `PetscOptionsBegin()`
332d0609cedSBarry Smith 
333d0609cedSBarry Smith    Input Parameter:
334d0609cedSBarry Smith .   head - the heading text
335d0609cedSBarry Smith 
33687497f52SBarry Smith    Level: developer
337d0609cedSBarry Smith 
338d0609cedSBarry Smith    Notes:
339d0609cedSBarry Smith     Handles errors directly, hence does not return an error code
340d0609cedSBarry Smith 
34116a05f60SBarry Smith     Must be between a `PetscOptionsBegin()` and a `PetscOptionsEnd()`, and `PetscOptionsObject` created in `PetscOptionsBegin()` should be the first argument
342d0609cedSBarry Smith 
34387497f52SBarry Smith     Must be followed by a call to `PetscOptionsHeadEnd()` in the same function.
344d0609cedSBarry Smith 
345db781477SPatrick Sanan .seealso: `PetscOptionsGetInt()`, `PetscOptionsGetReal()`,
346db781477SPatrick Sanan           `PetscOptionsHasName()`, `PetscOptionsGetIntArray()`, `PetscOptionsGetRealArray()`, `PetscOptionsBool()`,
347db781477SPatrick Sanan           `PetscOptionsName()`, `PetscOptionsBegin()`, `PetscOptionsEnd()`, `PetscOptionsHeadBegin()`,
348c2e3fba1SPatrick Sanan           `PetscOptionsStringArray()`, `PetscOptionsRealArray()`, `PetscOptionsScalar()`,
349db781477SPatrick Sanan           `PetscOptionsBoolGroupBegin()`, `PetscOptionsBoolGroup()`, `PetscOptionsBoolGroupEnd()`,
350db781477SPatrick Sanan           `PetscOptionsFList()`, `PetscOptionsEList()`
351d0609cedSBarry Smith @*/
3529371c9d4SSatish Balay   #define PetscOptionsHeadBegin(PetscOptionsObject, head) \
3539371c9d4SSatish Balay     do { \
35448a46eb9SPierre Jolivet       if (PetscOptionsObject->printhelp && PetscOptionsObject->count == 1 && !PetscOptionsObject->alreadyprinted) PetscCall((*PetscHelpPrintf)(PetscOptionsObject->comm, "  %s\n", head)); \
355d0609cedSBarry Smith     } while (0)
356d0609cedSBarry Smith 
357*edd03b47SJacob Faibussowitsch   #define PetscOptionsHead(...) PETSC_DEPRECATED_MACRO(3, 18, 0, "PetscOptionsHeadBegin()", ) PetscOptionsHeadBegin(__VA_ARGS__)
358d0609cedSBarry Smith 
359d0609cedSBarry Smith   /*MC
36087497f52SBarry Smith      PetscOptionsHeadEnd - Ends a section of options begun with `PetscOptionsHeadBegin()`
36116a05f60SBarry Smith             See, for example, `KSPSetFromOptions_GMRES()`.
36230de9b25SBarry Smith 
363f2ba6396SBarry Smith    Synopsis:
364aaa7dc30SBarry Smith      #include <petscoptions.h>
365d0609cedSBarry Smith      PetscErrorCode PetscOptionsHeadEnd(void)
36630de9b25SBarry Smith 
3677cdbe19fSJose E. Roman     Collective on the comm used in `PetscOptionsBegin()` or obj used in `PetscObjectOptionsBegin()`
3687cdbe19fSJose E. Roman 
36930de9b25SBarry Smith   Level: intermediate
37030de9b25SBarry Smith 
37195452b02SPatrick Sanan    Notes:
37287497f52SBarry Smith     Must be between a `PetscOptionsBegin()` or `PetscObjectOptionsBegin()` and a `PetscOptionsEnd()`
37330de9b25SBarry Smith 
37487497f52SBarry Smith     Must be preceded by a call to `PetscOptionsHeadBegin()` in the same function.
37530de9b25SBarry Smith 
37687497f52SBarry Smith     This needs to be used only if the code below `PetscOptionsHeadEnd()` can be run ONLY once.
37716a05f60SBarry Smith     See, for example, `PCSetFromOptions_Composite()`. This is a `return(0)` in it for early exit
378b52f573bSBarry Smith     from the function.
379b52f573bSBarry Smith 
38056752e42SBarry Smith           This is only for use with the PETSc options GUI
381b52f573bSBarry Smith 
382db781477SPatrick Sanan .seealso: `PetscOptionsGetInt()`, `PetscOptionsGetReal()`,
383db781477SPatrick Sanan           `PetscOptionsHasName()`, `PetscOptionsGetIntArray()`, `PetscOptionsGetRealArray()`, `PetscOptionsBool()`,
384db781477SPatrick Sanan           `PetscOptionsName()`, `PetscOptionsBegin()`, `PetscOptionsEnd()`, `PetscOptionsHeadBegin()`,
385c2e3fba1SPatrick Sanan           `PetscOptionsStringArray()`, `PetscOptionsRealArray()`, `PetscOptionsScalar()`,
386db781477SPatrick Sanan           `PetscOptionsBoolGroupBegin()`, `PetscOptionsBoolGroup()`, `PetscOptionsBoolGroupEnd()`,
387db781477SPatrick Sanan           `PetscOptionsFList()`, `PetscOptionsEList()`, `PetscOptionsEnum()`
38830de9b25SBarry Smith M*/
3899371c9d4SSatish Balay   #define PetscOptionsHeadEnd() \
3909371c9d4SSatish Balay     do { \
3913ba16761SJacob Faibussowitsch       if (PetscOptionsObject->count != 1) PetscFunctionReturn(PETSC_SUCCESS); \
3929371c9d4SSatish Balay     } while (0)
393d0609cedSBarry Smith 
394*edd03b47SJacob Faibussowitsch   #define PetscOptionsTail(...) PETSC_DEPRECATED_MACRO(3, 18, 0, "PetscOptionsHeadEnd()", ) PetscOptionsHeadEnd(__VA_ARGS__)
395186905e3SBarry Smith 
396e55864a3SBarry Smith   #define PetscOptionsEnum(a, b, c, d, e, f, g)        PetscOptionsEnum_Private(PetscOptionsObject, a, b, c, d, e, f, g)
3975a856986SBarry Smith   #define PetscOptionsInt(a, b, c, d, e, f)            PetscOptionsInt_Private(PetscOptionsObject, a, b, c, d, e, f, PETSC_MIN_INT, PETSC_MAX_INT)
3985a856986SBarry Smith   #define PetscOptionsBoundedInt(a, b, c, d, e, f, g)  PetscOptionsInt_Private(PetscOptionsObject, a, b, c, d, e, f, g, PETSC_MAX_INT)
3995a856986SBarry Smith   #define PetscOptionsRangeInt(a, b, c, d, e, f, g, h) PetscOptionsInt_Private(PetscOptionsObject, a, b, c, d, e, f, g, h)
400e55864a3SBarry Smith   #define PetscOptionsReal(a, b, c, d, e, f)           PetscOptionsReal_Private(PetscOptionsObject, a, b, c, d, e, f)
401e55864a3SBarry Smith   #define PetscOptionsScalar(a, b, c, d, e, f)         PetscOptionsScalar_Private(PetscOptionsObject, a, b, c, d, e, f)
402e55864a3SBarry Smith   #define PetscOptionsName(a, b, c, d)                 PetscOptionsName_Private(PetscOptionsObject, a, b, c, d)
403e55864a3SBarry Smith   #define PetscOptionsString(a, b, c, d, e, f, g)      PetscOptionsString_Private(PetscOptionsObject, a, b, c, d, e, f, g)
404e55864a3SBarry Smith   #define PetscOptionsBool(a, b, c, d, e, f)           PetscOptionsBool_Private(PetscOptionsObject, a, b, c, d, e, f)
405e55864a3SBarry Smith   #define PetscOptionsBoolGroupBegin(a, b, c, d)       PetscOptionsBoolGroupBegin_Private(PetscOptionsObject, a, b, c, d)
406e55864a3SBarry Smith   #define PetscOptionsBoolGroup(a, b, c, d)            PetscOptionsBoolGroup_Private(PetscOptionsObject, a, b, c, d)
407e55864a3SBarry Smith   #define PetscOptionsBoolGroupEnd(a, b, c, d)         PetscOptionsBoolGroupEnd_Private(PetscOptionsObject, a, b, c, d)
40883355fc5SBarry Smith   #define PetscOptionsFList(a, b, c, d, e, f, g, h)    PetscOptionsFList_Private(PetscOptionsObject, a, b, c, d, e, f, g, h)
409e55864a3SBarry Smith   #define PetscOptionsEList(a, b, c, d, e, f, g, h)    PetscOptionsEList_Private(PetscOptionsObject, a, b, c, d, e, f, g, h)
410e55864a3SBarry Smith   #define PetscOptionsRealArray(a, b, c, d, e, f)      PetscOptionsRealArray_Private(PetscOptionsObject, a, b, c, d, e, f)
411050cccc3SHong Zhang   #define PetscOptionsScalarArray(a, b, c, d, e, f)    PetscOptionsScalarArray_Private(PetscOptionsObject, a, b, c, d, e, f)
412e55864a3SBarry Smith   #define PetscOptionsIntArray(a, b, c, d, e, f)       PetscOptionsIntArray_Private(PetscOptionsObject, a, b, c, d, e, f)
413e55864a3SBarry Smith   #define PetscOptionsStringArray(a, b, c, d, e, f)    PetscOptionsStringArray_Private(PetscOptionsObject, a, b, c, d, e, f)
414e55864a3SBarry Smith   #define PetscOptionsBoolArray(a, b, c, d, e, f)      PetscOptionsBoolArray_Private(PetscOptionsObject, a, b, c, d, e, f)
415d3e47460SLisandro Dalcin   #define PetscOptionsEnumArray(a, b, c, d, e, f, g)   PetscOptionsEnumArray_Private(PetscOptionsObject, a, b, c, d, e, f, g)
4169f3a6782SPatrick Sanan   #define PetscOptionsDeprecated(a, b, c, d)           PetscOptionsDeprecated_Private(PetscOptionsObject, a, b, c, d)
417b0bdc838SStefano Zampini   #define PetscOptionsDeprecatedNoObject(a, b, c, d)   PetscOptionsDeprecated_Private(NULL, a, b, c, d)
4185f80ce2aSJacob Faibussowitsch #endif /* PETSC_CLANG_STATIC_ANALYZER */
419e55864a3SBarry Smith 
4204416b707SBarry Smith PETSC_EXTERN PetscErrorCode PetscOptionsEnum_Private(PetscOptionItems *, const char[], const char[], const char[], const char *const *, PetscEnum, PetscEnum *, PetscBool *);
4215a856986SBarry Smith PETSC_EXTERN PetscErrorCode PetscOptionsInt_Private(PetscOptionItems *, const char[], const char[], const char[], PetscInt, PetscInt *, PetscBool *, PetscInt, PetscInt);
4224416b707SBarry Smith PETSC_EXTERN PetscErrorCode PetscOptionsReal_Private(PetscOptionItems *, const char[], const char[], const char[], PetscReal, PetscReal *, PetscBool *);
4234416b707SBarry Smith PETSC_EXTERN PetscErrorCode PetscOptionsScalar_Private(PetscOptionItems *, const char[], const char[], const char[], PetscScalar, PetscScalar *, PetscBool *);
4244416b707SBarry Smith PETSC_EXTERN PetscErrorCode PetscOptionsName_Private(PetscOptionItems *, const char[], const char[], const char[], PetscBool *);
4254416b707SBarry Smith PETSC_EXTERN PetscErrorCode PetscOptionsString_Private(PetscOptionItems *, const char[], const char[], const char[], const char[], char *, size_t, PetscBool *);
4264416b707SBarry Smith PETSC_EXTERN PetscErrorCode PetscOptionsBool_Private(PetscOptionItems *, const char[], const char[], const char[], PetscBool, PetscBool *, PetscBool *);
4274416b707SBarry Smith PETSC_EXTERN PetscErrorCode PetscOptionsBoolGroupBegin_Private(PetscOptionItems *, const char[], const char[], const char[], PetscBool *);
4284416b707SBarry Smith PETSC_EXTERN PetscErrorCode PetscOptionsBoolGroup_Private(PetscOptionItems *, const char[], const char[], const char[], PetscBool *);
4294416b707SBarry Smith PETSC_EXTERN PetscErrorCode PetscOptionsBoolGroupEnd_Private(PetscOptionItems *, const char[], const char[], const char[], PetscBool *);
4304416b707SBarry Smith PETSC_EXTERN PetscErrorCode PetscOptionsFList_Private(PetscOptionItems *, const char[], const char[], const char[], PetscFunctionList, const char[], char[], size_t, PetscBool *);
4314416b707SBarry Smith PETSC_EXTERN PetscErrorCode PetscOptionsEList_Private(PetscOptionItems *, const char[], const char[], const char[], const char *const *, PetscInt, const char[], PetscInt *, PetscBool *);
4324416b707SBarry Smith PETSC_EXTERN PetscErrorCode PetscOptionsRealArray_Private(PetscOptionItems *, const char[], const char[], const char[], PetscReal[], PetscInt *, PetscBool *);
4334416b707SBarry Smith PETSC_EXTERN PetscErrorCode PetscOptionsScalarArray_Private(PetscOptionItems *, const char[], const char[], const char[], PetscScalar[], PetscInt *, PetscBool *);
4344416b707SBarry Smith PETSC_EXTERN PetscErrorCode PetscOptionsIntArray_Private(PetscOptionItems *, const char[], const char[], const char[], PetscInt[], PetscInt *, PetscBool *);
4354416b707SBarry Smith PETSC_EXTERN PetscErrorCode PetscOptionsStringArray_Private(PetscOptionItems *, const char[], const char[], const char[], char *[], PetscInt *, PetscBool *);
4364416b707SBarry Smith PETSC_EXTERN PetscErrorCode PetscOptionsBoolArray_Private(PetscOptionItems *, const char[], const char[], const char[], PetscBool[], PetscInt *, PetscBool *);
4374416b707SBarry Smith PETSC_EXTERN PetscErrorCode PetscOptionsEnumArray_Private(PetscOptionItems *, const char[], const char[], const char[], const char *const *, PetscEnum[], PetscInt *, PetscBool *);
4389f3a6782SPatrick Sanan PETSC_EXTERN PetscErrorCode PetscOptionsDeprecated_Private(PetscOptionItems *, const char[], const char[], const char[], const char[]);
439cffb1e40SBarry Smith 
440e04113cfSBarry Smith PETSC_EXTERN PetscErrorCode PetscOptionsSAWsDestroy(void);
441f8d0b74dSMatthew Knepley 
442dbbe0bcdSBarry Smith PETSC_EXTERN PetscErrorCode PetscObjectAddOptionsHandler(PetscObject, PetscErrorCode (*)(PetscObject, PetscOptionItems *, void *), PetscErrorCode (*)(PetscObject, void *), void *);
443dbbe0bcdSBarry Smith PETSC_EXTERN PetscErrorCode PetscObjectProcessOptionsHandlers(PetscObject, PetscOptionItems *);
444447ac60bSBarry Smith PETSC_EXTERN PetscErrorCode PetscObjectDestroyOptionsHandlers(PetscObject);
445447ac60bSBarry Smith 
446f4bc716fSBarry Smith PETSC_EXTERN PetscErrorCode PetscOptionsLeftError(void);
4473a3b2205SBarry Smith #endif
448