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