xref: /petsc/include/petscpctypes.h (revision b0753f9dfa99a140c7a0675d372a1d4482826688)
1*b0753f9dSMatthew G. Knepley #if !defined(_PETSCPCTYPES_H)
2*b0753f9dSMatthew G. Knepley #define _PETSCPCTYPES_H
3*b0753f9dSMatthew G. Knepley 
4*b0753f9dSMatthew G. Knepley #include <petscdmtypes.h>
5*b0753f9dSMatthew G. Knepley 
6*b0753f9dSMatthew G. Knepley /*S
7*b0753f9dSMatthew G. Knepley      PC - Abstract PETSc object that manages all preconditioners including direct solvers such as PCLU
8*b0753f9dSMatthew G. Knepley 
9*b0753f9dSMatthew G. Knepley    Level: beginner
10*b0753f9dSMatthew G. Knepley 
11*b0753f9dSMatthew G. Knepley   Concepts: preconditioners
12*b0753f9dSMatthew G. Knepley 
13*b0753f9dSMatthew G. Knepley .seealso:  PCCreate(), PCSetType(), PCType (for list of available types)
14*b0753f9dSMatthew G. Knepley S*/
15*b0753f9dSMatthew G. Knepley typedef struct _p_PC* PC;
16*b0753f9dSMatthew G. Knepley 
17*b0753f9dSMatthew G. Knepley /*J
18*b0753f9dSMatthew G. Knepley     PCType - String with the name of a PETSc preconditioner method.
19*b0753f9dSMatthew G. Knepley 
20*b0753f9dSMatthew G. Knepley    Level: beginner
21*b0753f9dSMatthew G. Knepley 
22*b0753f9dSMatthew G. Knepley    Notes: Click on the links below to see details on a particular solver
23*b0753f9dSMatthew G. Knepley 
24*b0753f9dSMatthew G. Knepley           PCRegister() is used to register preconditioners that are then accessible via PCSetType()
25*b0753f9dSMatthew G. Knepley 
26*b0753f9dSMatthew G. Knepley .seealso: PCSetType(), PC, PCCreate(), PCRegister(), PCSetFromOptions()
27*b0753f9dSMatthew G. Knepley J*/
28*b0753f9dSMatthew G. Knepley typedef const char* PCType;
29*b0753f9dSMatthew G. Knepley #define PCNONE            "none"
30*b0753f9dSMatthew G. Knepley #define PCJACOBI          "jacobi"
31*b0753f9dSMatthew G. Knepley #define PCSOR             "sor"
32*b0753f9dSMatthew G. Knepley #define PCLU              "lu"
33*b0753f9dSMatthew G. Knepley #define PCSHELL           "shell"
34*b0753f9dSMatthew G. Knepley #define PCBJACOBI         "bjacobi"
35*b0753f9dSMatthew G. Knepley #define PCMG              "mg"
36*b0753f9dSMatthew G. Knepley #define PCEISENSTAT       "eisenstat"
37*b0753f9dSMatthew G. Knepley #define PCILU             "ilu"
38*b0753f9dSMatthew G. Knepley #define PCICC             "icc"
39*b0753f9dSMatthew G. Knepley #define PCASM             "asm"
40*b0753f9dSMatthew G. Knepley #define PCGASM            "gasm"
41*b0753f9dSMatthew G. Knepley #define PCKSP             "ksp"
42*b0753f9dSMatthew G. Knepley #define PCCOMPOSITE       "composite"
43*b0753f9dSMatthew G. Knepley #define PCREDUNDANT       "redundant"
44*b0753f9dSMatthew G. Knepley #define PCSPAI            "spai"
45*b0753f9dSMatthew G. Knepley #define PCNN              "nn"
46*b0753f9dSMatthew G. Knepley #define PCCHOLESKY        "cholesky"
47*b0753f9dSMatthew G. Knepley #define PCPBJACOBI        "pbjacobi"
48*b0753f9dSMatthew G. Knepley #define PCMAT             "mat"
49*b0753f9dSMatthew G. Knepley #define PCHYPRE           "hypre"
50*b0753f9dSMatthew G. Knepley #define PCPARMS           "parms"
51*b0753f9dSMatthew G. Knepley #define PCFIELDSPLIT      "fieldsplit"
52*b0753f9dSMatthew G. Knepley #define PCTFS             "tfs"
53*b0753f9dSMatthew G. Knepley #define PCML              "ml"
54*b0753f9dSMatthew G. Knepley #define PCGALERKIN        "galerkin"
55*b0753f9dSMatthew G. Knepley #define PCEXOTIC          "exotic"
56*b0753f9dSMatthew G. Knepley #define PCCP              "cp"
57*b0753f9dSMatthew G. Knepley #define PCBFBT            "bfbt"
58*b0753f9dSMatthew G. Knepley #define PCLSC             "lsc"
59*b0753f9dSMatthew G. Knepley #define PCPYTHON          "python"
60*b0753f9dSMatthew G. Knepley #define PCPFMG            "pfmg"
61*b0753f9dSMatthew G. Knepley #define PCSYSPFMG         "syspfmg"
62*b0753f9dSMatthew G. Knepley #define PCREDISTRIBUTE    "redistribute"
63*b0753f9dSMatthew G. Knepley #define PCSVD             "svd"
64*b0753f9dSMatthew G. Knepley #define PCGAMG            "gamg"
65*b0753f9dSMatthew G. Knepley #define PCSACUSP          "sacusp"        /* these four run on NVIDIA GPUs using CUSP */
66*b0753f9dSMatthew G. Knepley #define PCSACUSPPOLY      "sacusppoly"
67*b0753f9dSMatthew G. Knepley #define PCBICGSTABCUSP    "bicgstabcusp"
68*b0753f9dSMatthew G. Knepley #define PCAINVCUSP        "ainvcusp"
69*b0753f9dSMatthew G. Knepley #define PCBDDC            "bddc"
70*b0753f9dSMatthew G. Knepley #define PCKACZMARZ        "kaczmarz"
71*b0753f9dSMatthew G. Knepley 
72*b0753f9dSMatthew G. Knepley /*E
73*b0753f9dSMatthew G. Knepley     PCSide - If the preconditioner is to be applied to the left, right
74*b0753f9dSMatthew G. Knepley      or symmetrically around the operator.
75*b0753f9dSMatthew G. Knepley 
76*b0753f9dSMatthew G. Knepley    Level: beginner
77*b0753f9dSMatthew G. Knepley 
78*b0753f9dSMatthew G. Knepley .seealso:
79*b0753f9dSMatthew G. Knepley E*/
80*b0753f9dSMatthew G. Knepley typedef enum { PC_SIDE_DEFAULT=-1,PC_LEFT,PC_RIGHT,PC_SYMMETRIC} PCSide;
81*b0753f9dSMatthew G. Knepley #define PC_SIDE_MAX (PC_SYMMETRIC + 1)
82*b0753f9dSMatthew G. Knepley PETSC_EXTERN const char *const *const PCSides;
83*b0753f9dSMatthew G. Knepley 
84*b0753f9dSMatthew G. Knepley /*E
85*b0753f9dSMatthew G. Knepley     PCRichardsonConvergedReason - reason a PCApplyRichardson method terminates
86*b0753f9dSMatthew G. Knepley 
87*b0753f9dSMatthew G. Knepley    Level: advanced
88*b0753f9dSMatthew G. Knepley 
89*b0753f9dSMatthew G. Knepley    Notes: this must match petsc/finclude/petscpc.h and the KSPConvergedReason values in petscksp.h
90*b0753f9dSMatthew G. Knepley 
91*b0753f9dSMatthew G. Knepley .seealso: PCApplyRichardson()
92*b0753f9dSMatthew G. Knepley E*/
93*b0753f9dSMatthew G. Knepley typedef enum {
94*b0753f9dSMatthew G. Knepley               PCRICHARDSON_CONVERGED_RTOL               =  2,
95*b0753f9dSMatthew G. Knepley               PCRICHARDSON_CONVERGED_ATOL               =  3,
96*b0753f9dSMatthew G. Knepley               PCRICHARDSON_CONVERGED_ITS                =  4,
97*b0753f9dSMatthew G. Knepley               PCRICHARDSON_DIVERGED_DTOL                = -4} PCRichardsonConvergedReason;
98*b0753f9dSMatthew G. Knepley 
99*b0753f9dSMatthew G. Knepley /*E
100*b0753f9dSMatthew G. Knepley     PCJacobiType - What elements are used to form the Jacobi preconditioner
101*b0753f9dSMatthew G. Knepley 
102*b0753f9dSMatthew G. Knepley    Level: intermediate
103*b0753f9dSMatthew G. Knepley 
104*b0753f9dSMatthew G. Knepley .seealso:
105*b0753f9dSMatthew G. Knepley E*/
106*b0753f9dSMatthew G. Knepley typedef enum { PC_JACOBI_DIAGONAL,PC_JACOBI_ROWMAX,PC_JACOBI_ROWSUM} PCJacobiType;
107*b0753f9dSMatthew G. Knepley PETSC_EXTERN const char *const PCJacobiTypes[];
108*b0753f9dSMatthew G. Knepley 
109*b0753f9dSMatthew G. Knepley /*E
110*b0753f9dSMatthew G. Knepley     PCASMType - Type of additive Schwarz method to use
111*b0753f9dSMatthew G. Knepley 
112*b0753f9dSMatthew G. Knepley $  PC_ASM_BASIC        - Symmetric version where residuals from the ghost points are used
113*b0753f9dSMatthew G. Knepley $                        and computed values in ghost regions are added together.
114*b0753f9dSMatthew G. Knepley $                        Classical standard additive Schwarz.
115*b0753f9dSMatthew G. Knepley $  PC_ASM_RESTRICT     - Residuals from ghost points are used but computed values in ghost
116*b0753f9dSMatthew G. Knepley $                        region are discarded.
117*b0753f9dSMatthew G. Knepley $                        Default.
118*b0753f9dSMatthew G. Knepley $  PC_ASM_INTERPOLATE  - Residuals from ghost points are not used, computed values in ghost
119*b0753f9dSMatthew G. Knepley $                        region are added back in.
120*b0753f9dSMatthew G. Knepley $  PC_ASM_NONE         - Residuals from ghost points are not used, computed ghost values are
121*b0753f9dSMatthew G. Knepley $                        discarded.
122*b0753f9dSMatthew G. Knepley $                        Not very good.
123*b0753f9dSMatthew G. Knepley 
124*b0753f9dSMatthew G. Knepley    Level: beginner
125*b0753f9dSMatthew G. Knepley 
126*b0753f9dSMatthew G. Knepley .seealso: PCASMSetType()
127*b0753f9dSMatthew G. Knepley E*/
128*b0753f9dSMatthew G. Knepley typedef enum {PC_ASM_BASIC = 3,PC_ASM_RESTRICT = 1,PC_ASM_INTERPOLATE = 2,PC_ASM_NONE = 0} PCASMType;
129*b0753f9dSMatthew G. Knepley PETSC_EXTERN const char *const PCASMTypes[];
130*b0753f9dSMatthew G. Knepley 
131*b0753f9dSMatthew G. Knepley /*E
132*b0753f9dSMatthew G. Knepley     PCGASMType - Type of generalized additive Schwarz method to use (differs from ASM in allowing multiple processors per subdomain).
133*b0753f9dSMatthew G. Knepley 
134*b0753f9dSMatthew G. Knepley    Each subdomain has nested inner and outer parts.  The inner subdomains are assumed to form a non-overlapping covering of the computational
135*b0753f9dSMatthew G. Knepley    domain, while the outer subdomains contain the inner subdomains and overlap with each other.  This preconditioner will compute
136*b0753f9dSMatthew G. Knepley    a subdomain correction over each *outer* subdomain from a residual computed there, but its different variants will differ in
137*b0753f9dSMatthew G. Knepley    (a) how the outer subdomain residual is computed, and (b) how the outer subdomain correction is computed.
138*b0753f9dSMatthew G. Knepley 
139*b0753f9dSMatthew G. Knepley $  PC_GASM_BASIC       - Symmetric version where the full from the outer subdomain is used, and the resulting correction is applied
140*b0753f9dSMatthew G. Knepley $                        over the outer subdomains.  As a result, points in the overlap will receive the sum of the corrections
141*b0753f9dSMatthew G. Knepley $                        from neighboring subdomains.
142*b0753f9dSMatthew G. Knepley $                        Classical standard additive Schwarz.
143*b0753f9dSMatthew G. Knepley $  PC_GASM_RESTRICT    - Residual from the outer subdomain is used but the correction is restricted to the inner subdomain only
144*b0753f9dSMatthew G. Knepley $                        (i.e., zeroed out over the overlap portion of the outer subdomain before being applied).  As a result,
145*b0753f9dSMatthew G. Knepley $                        each point will receive a correction only from the unique inner subdomain containing it (nonoverlapping covering
146*b0753f9dSMatthew G. Knepley $                        assumption).
147*b0753f9dSMatthew G. Knepley $                        Default.
148*b0753f9dSMatthew G. Knepley $  PC_GASM_INTERPOLATE - Residual is zeroed out over the overlap portion of the outer subdomain, but the resulting correction is
149*b0753f9dSMatthew G. Knepley $                        applied over the outer subdomain. As a result, points in the overlap will receive the sum of the corrections
150*b0753f9dSMatthew G. Knepley $                        from neighboring subdomains.
151*b0753f9dSMatthew G. Knepley $
152*b0753f9dSMatthew G. Knepley $  PC_GASM_NONE        - Residuals and corrections are zeroed out outside the local subdomains.
153*b0753f9dSMatthew G. Knepley $                        Not very good.
154*b0753f9dSMatthew G. Knepley 
155*b0753f9dSMatthew G. Knepley    Level: beginner
156*b0753f9dSMatthew G. Knepley 
157*b0753f9dSMatthew G. Knepley .seealso: PCGASMSetType()
158*b0753f9dSMatthew G. Knepley E*/
159*b0753f9dSMatthew G. Knepley typedef enum {PC_GASM_BASIC = 3,PC_GASM_RESTRICT = 1,PC_GASM_INTERPOLATE = 2,PC_GASM_NONE = 0} PCGASMType;
160*b0753f9dSMatthew G. Knepley PETSC_EXTERN const char *const PCGASMTypes[];
161*b0753f9dSMatthew G. Knepley 
162*b0753f9dSMatthew G. Knepley /*E
163*b0753f9dSMatthew G. Knepley     PCCompositeType - Determines how two or more preconditioner are composed
164*b0753f9dSMatthew G. Knepley 
165*b0753f9dSMatthew G. Knepley $  PC_COMPOSITE_ADDITIVE - results from application of all preconditioners are added together
166*b0753f9dSMatthew G. Knepley $  PC_COMPOSITE_MULTIPLICATIVE - preconditioners are applied sequentially to the residual freshly
167*b0753f9dSMatthew G. Knepley $                                computed after the previous preconditioner application
168*b0753f9dSMatthew G. Knepley $  PC_COMPOSITE_SYMMETRIC_MULTIPLICATIVE - preconditioners are applied sequentially to the residual freshly
169*b0753f9dSMatthew G. Knepley $                                computed from first preconditioner to last and then back (Use only for symmetric matrices and preconditions)
170*b0753f9dSMatthew G. Knepley $  PC_COMPOSITE_SPECIAL - This is very special for a matrix of the form alpha I + R + S
171*b0753f9dSMatthew G. Knepley $                         where first preconditioner is built from alpha I + S and second from
172*b0753f9dSMatthew G. Knepley $                         alpha I + R
173*b0753f9dSMatthew G. Knepley 
174*b0753f9dSMatthew G. Knepley    Level: beginner
175*b0753f9dSMatthew G. Knepley 
176*b0753f9dSMatthew G. Knepley .seealso: PCCompositeSetType()
177*b0753f9dSMatthew G. Knepley E*/
178*b0753f9dSMatthew G. Knepley typedef enum {PC_COMPOSITE_ADDITIVE,PC_COMPOSITE_MULTIPLICATIVE,PC_COMPOSITE_SYMMETRIC_MULTIPLICATIVE,PC_COMPOSITE_SPECIAL,PC_COMPOSITE_SCHUR} PCCompositeType;
179*b0753f9dSMatthew G. Knepley PETSC_EXTERN const char *const PCCompositeTypes[];
180*b0753f9dSMatthew G. Knepley 
181*b0753f9dSMatthew G. Knepley /*E
182*b0753f9dSMatthew G. Knepley     PCFieldSplitSchurPreType - Determines how to precondition Schur complement
183*b0753f9dSMatthew G. Knepley 
184*b0753f9dSMatthew G. Knepley     Level: intermediate
185*b0753f9dSMatthew G. Knepley 
186*b0753f9dSMatthew G. Knepley .seealso: PCFieldSplitSetSchurPre()
187*b0753f9dSMatthew G. Knepley E*/
188*b0753f9dSMatthew G. Knepley typedef enum {PC_FIELDSPLIT_SCHUR_PRE_SELF,PC_FIELDSPLIT_SCHUR_PRE_SELFP,PC_FIELDSPLIT_SCHUR_PRE_A11,PC_FIELDSPLIT_SCHUR_PRE_USER,PC_FIELDSPLIT_SCHUR_PRE_FULL} PCFieldSplitSchurPreType;
189*b0753f9dSMatthew G. Knepley PETSC_EXTERN const char *const PCFieldSplitSchurPreTypes[];
190*b0753f9dSMatthew G. Knepley 
191*b0753f9dSMatthew G. Knepley /*E
192*b0753f9dSMatthew G. Knepley     PCFieldSplitSchurFactType - determines which off-diagonal parts of the approximate block factorization to use
193*b0753f9dSMatthew G. Knepley 
194*b0753f9dSMatthew G. Knepley     Level: intermediate
195*b0753f9dSMatthew G. Knepley 
196*b0753f9dSMatthew G. Knepley .seealso: PCFieldSplitSetSchurFactType()
197*b0753f9dSMatthew G. Knepley E*/
198*b0753f9dSMatthew G. Knepley typedef enum {
199*b0753f9dSMatthew G. Knepley   PC_FIELDSPLIT_SCHUR_FACT_DIAG,
200*b0753f9dSMatthew G. Knepley   PC_FIELDSPLIT_SCHUR_FACT_LOWER,
201*b0753f9dSMatthew G. Knepley   PC_FIELDSPLIT_SCHUR_FACT_UPPER,
202*b0753f9dSMatthew G. Knepley   PC_FIELDSPLIT_SCHUR_FACT_FULL
203*b0753f9dSMatthew G. Knepley } PCFieldSplitSchurFactType;
204*b0753f9dSMatthew G. Knepley PETSC_EXTERN const char *const PCFieldSplitSchurFactTypes[];
205*b0753f9dSMatthew G. Knepley 
206*b0753f9dSMatthew G. Knepley /*E
207*b0753f9dSMatthew G. Knepley     PCPARMSGlobalType - Determines the global preconditioner method in PARMS
208*b0753f9dSMatthew G. Knepley 
209*b0753f9dSMatthew G. Knepley     Level: intermediate
210*b0753f9dSMatthew G. Knepley 
211*b0753f9dSMatthew G. Knepley .seealso: PCPARMSSetGlobal()
212*b0753f9dSMatthew G. Knepley E*/
213*b0753f9dSMatthew G. Knepley typedef enum {PC_PARMS_GLOBAL_RAS,PC_PARMS_GLOBAL_SCHUR,PC_PARMS_GLOBAL_BJ} PCPARMSGlobalType;
214*b0753f9dSMatthew G. Knepley PETSC_EXTERN const char *const PCPARMSGlobalTypes[];
215*b0753f9dSMatthew G. Knepley /*E
216*b0753f9dSMatthew G. Knepley     PCPARMSLocalType - Determines the local preconditioner method in PARMS
217*b0753f9dSMatthew G. Knepley 
218*b0753f9dSMatthew G. Knepley     Level: intermediate
219*b0753f9dSMatthew G. Knepley 
220*b0753f9dSMatthew G. Knepley .seealso: PCPARMSSetLocal()
221*b0753f9dSMatthew G. Knepley E*/
222*b0753f9dSMatthew G. Knepley typedef enum {PC_PARMS_LOCAL_ILU0,PC_PARMS_LOCAL_ILUK,PC_PARMS_LOCAL_ILUT,PC_PARMS_LOCAL_ARMS} PCPARMSLocalType;
223*b0753f9dSMatthew G. Knepley PETSC_EXTERN const char *const PCPARMSLocalTypes[];
224*b0753f9dSMatthew G. Knepley 
225*b0753f9dSMatthew G. Knepley /*E
226*b0753f9dSMatthew G. Knepley     PCGAMGType - type of generalized algebraic multigrid (PCGAMG) method
227*b0753f9dSMatthew G. Knepley 
228*b0753f9dSMatthew G. Knepley     Level: intermediate
229*b0753f9dSMatthew G. Knepley 
230*b0753f9dSMatthew G. Knepley .seealso: PCMG, PCSetType(), PCGAMGSetThreshold(), PCGAMGSetThreshold(), PCGAMGSetReuseInterpolation()
231*b0753f9dSMatthew G. Knepley E*/
232*b0753f9dSMatthew G. Knepley typedef const char *PCGAMGType;
233*b0753f9dSMatthew G. Knepley #define PCGAMGAGG         "agg"
234*b0753f9dSMatthew G. Knepley #define PCGAMGGEO         "geo"
235*b0753f9dSMatthew G. Knepley #define PCGAMGCLASSICAL   "classical"
236*b0753f9dSMatthew G. Knepley 
237*b0753f9dSMatthew G. Knepley typedef const char *PCGAMGClassicalType;
238*b0753f9dSMatthew G. Knepley #define PCGAMGCLASSICALDIRECT   "direct"
239*b0753f9dSMatthew G. Knepley #define PCGAMGCLASSICALSTANDARD "standard"
240*b0753f9dSMatthew G. Knepley 
241*b0753f9dSMatthew G. Knepley /*E
242*b0753f9dSMatthew G. Knepley     PCMGType - Determines the type of multigrid method that is run.
243*b0753f9dSMatthew G. Knepley 
244*b0753f9dSMatthew G. Knepley    Level: beginner
245*b0753f9dSMatthew G. Knepley 
246*b0753f9dSMatthew G. Knepley    Values:
247*b0753f9dSMatthew G. Knepley +  PC_MG_MULTIPLICATIVE (default) - traditional V or W cycle as determined by PCMGSetCycles()
248*b0753f9dSMatthew G. Knepley .  PC_MG_ADDITIVE - the additive multigrid preconditioner where all levels are
249*b0753f9dSMatthew G. Knepley                 smoothed before updating the residual. This only uses the
250*b0753f9dSMatthew G. Knepley                 down smoother, in the preconditioner the upper smoother is ignored
251*b0753f9dSMatthew G. Knepley .  PC_MG_FULL - same as multiplicative except one also performs grid sequencing,
252*b0753f9dSMatthew G. Knepley             that is starts on the coarsest grid, performs a cycle, interpolates
253*b0753f9dSMatthew G. Knepley             to the next, performs a cycle etc. This is much like the F-cycle presented in "Multigrid" by Trottenberg, Oosterlee, Schuller page 49, but that
254*b0753f9dSMatthew G. Knepley             algorithm supports smoothing on before the restriction on each level in the initial restriction to the coarsest stage. In addition that algorithm
255*b0753f9dSMatthew G. Knepley             calls the V-cycle only on the coarser level and has a post-smoother instead.
256*b0753f9dSMatthew G. Knepley -  PC_MG_KASKADE - like full multigrid except one never goes back to a coarser level
257*b0753f9dSMatthew G. Knepley                from a finer
258*b0753f9dSMatthew G. Knepley 
259*b0753f9dSMatthew G. Knepley .seealso: PCMGSetType()
260*b0753f9dSMatthew G. Knepley 
261*b0753f9dSMatthew G. Knepley E*/
262*b0753f9dSMatthew G. Knepley typedef enum { PC_MG_MULTIPLICATIVE,PC_MG_ADDITIVE,PC_MG_FULL,PC_MG_KASKADE } PCMGType;
263*b0753f9dSMatthew G. Knepley PETSC_EXTERN const char *const PCMGTypes[];
264*b0753f9dSMatthew G. Knepley #define PC_MG_CASCADE PC_MG_KASKADE;
265*b0753f9dSMatthew G. Knepley 
266*b0753f9dSMatthew G. Knepley /*E
267*b0753f9dSMatthew G. Knepley     PCMGCycleType - Use V-cycle or W-cycle
268*b0753f9dSMatthew G. Knepley 
269*b0753f9dSMatthew G. Knepley    Level: beginner
270*b0753f9dSMatthew G. Knepley 
271*b0753f9dSMatthew G. Knepley    Values:
272*b0753f9dSMatthew G. Knepley +  PC_MG_V_CYCLE
273*b0753f9dSMatthew G. Knepley -  PC_MG_W_CYCLE
274*b0753f9dSMatthew G. Knepley 
275*b0753f9dSMatthew G. Knepley .seealso: PCMGSetCycleType()
276*b0753f9dSMatthew G. Knepley 
277*b0753f9dSMatthew G. Knepley E*/
278*b0753f9dSMatthew G. Knepley typedef enum { PC_MG_CYCLE_V = 1,PC_MG_CYCLE_W = 2 } PCMGCycleType;
279*b0753f9dSMatthew G. Knepley PETSC_EXTERN const char *const PCMGCycleTypes[];
280*b0753f9dSMatthew G. Knepley 
281*b0753f9dSMatthew G. Knepley /*E
282*b0753f9dSMatthew G. Knepley     PCExoticType - Face based or wirebasket based coarse grid space
283*b0753f9dSMatthew G. Knepley 
284*b0753f9dSMatthew G. Knepley    Level: beginner
285*b0753f9dSMatthew G. Knepley 
286*b0753f9dSMatthew G. Knepley .seealso: PCExoticSetType(), PCEXOTIC
287*b0753f9dSMatthew G. Knepley E*/
288*b0753f9dSMatthew G. Knepley typedef enum { PC_EXOTIC_FACE,PC_EXOTIC_WIREBASKET } PCExoticType;
289*b0753f9dSMatthew G. Knepley PETSC_EXTERN const char *const PCExoticTypes[];
290*b0753f9dSMatthew G. Knepley PETSC_EXTERN PetscErrorCode PCExoticSetType(PC,PCExoticType);
291*b0753f9dSMatthew G. Knepley 
292*b0753f9dSMatthew G. Knepley #endif
293