xref: /petsc/src/ksp/pc/impls/shell/shellpc.c (revision be29d3c6887e35e9e43a4f137c8657ac14f8b020)
1dba47a55SKris Buschelman #define PETSCKSP_DLL
2dba47a55SKris Buschelman 
34b9ad928SBarry Smith /*
44b9ad928SBarry Smith    This provides a simple shell for Fortran (and C programmers) to
54b9ad928SBarry Smith   create their own preconditioner without writing much interface code.
64b9ad928SBarry Smith */
74b9ad928SBarry Smith 
84b9ad928SBarry Smith #include "src/ksp/pc/pcimpl.h"        /*I "petscpc.h" I*/
93c94ec11SBarry Smith #include "vecimpl.h"
104b9ad928SBarry Smith 
11ac226902SBarry Smith EXTERN_C_BEGIN
124b9ad928SBarry Smith typedef struct {
13*be29d3c6SBarry Smith   void           *ctx;                     /* user provided contexts for preconditioner */
146849ba73SBarry Smith   PetscErrorCode (*setup)(void*);
156849ba73SBarry Smith   PetscErrorCode (*apply)(void*,Vec,Vec);
167cdd61b2SBarry Smith   PetscErrorCode (*presolve)(void*,KSP,Vec,Vec);
177cdd61b2SBarry Smith   PetscErrorCode (*postsolve)(void*,KSP,Vec,Vec);
186849ba73SBarry Smith   PetscErrorCode (*view)(void*,PetscViewer);
196849ba73SBarry Smith   PetscErrorCode (*applytranspose)(void*,Vec,Vec);
2013f74950SBarry Smith   PetscErrorCode (*applyrich)(void*,Vec,Vec,Vec,PetscReal,PetscReal,PetscReal,PetscInt);
214b9ad928SBarry Smith   char           *name;
224b9ad928SBarry Smith } PC_Shell;
23ac226902SBarry Smith EXTERN_C_END
244b9ad928SBarry Smith 
254b9ad928SBarry Smith #undef __FUNCT__
26*be29d3c6SBarry Smith #define __FUNCT__ "PCShellGetContext"
27*be29d3c6SBarry Smith /*@
28*be29d3c6SBarry Smith     PCShellGetContext - Returns the user-provided context associated with a shell PC
29*be29d3c6SBarry Smith 
30*be29d3c6SBarry Smith     Not Collective
31*be29d3c6SBarry Smith 
32*be29d3c6SBarry Smith     Input Parameter:
33*be29d3c6SBarry Smith .   pc - should have been created with PCCreateShell()
34*be29d3c6SBarry Smith 
35*be29d3c6SBarry Smith     Output Parameter:
36*be29d3c6SBarry Smith .   ctx - the user provided context
37*be29d3c6SBarry Smith 
38*be29d3c6SBarry Smith     Level: advanced
39*be29d3c6SBarry Smith 
40*be29d3c6SBarry Smith     Notes:
41*be29d3c6SBarry Smith     This routine is intended for use within various shell routines
42*be29d3c6SBarry Smith 
43*be29d3c6SBarry Smith .keywords: PC, shell, get, context
44*be29d3c6SBarry Smith 
45*be29d3c6SBarry Smith .seealso: PCCreateShell(), PCShellSetContext()
46*be29d3c6SBarry Smith @*/
47*be29d3c6SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellGetContext(PC pc,void **ctx)
48*be29d3c6SBarry Smith {
49*be29d3c6SBarry Smith   PetscErrorCode ierr;
50*be29d3c6SBarry Smith   PetscTruth     flg;
51*be29d3c6SBarry Smith 
52*be29d3c6SBarry Smith   PetscFunctionBegin;
53*be29d3c6SBarry Smith   PetscValidHeaderSpecific(pc,PC_COOKIE,1);
54*be29d3c6SBarry Smith   PetscValidPointer(ctx,2);
55*be29d3c6SBarry Smith   ierr = PetscTypeCompare((PetscObject)pc,PCSHELL,&flg);CHKERRQ(ierr);
56*be29d3c6SBarry Smith   if (!flg) *ctx = 0;
57*be29d3c6SBarry Smith   else      *ctx = ((PC_Shell*)(pc->data))->ctx;
58*be29d3c6SBarry Smith   PetscFunctionReturn(0);
59*be29d3c6SBarry Smith }
60*be29d3c6SBarry Smith 
61*be29d3c6SBarry Smith #undef __FUNCT__
62*be29d3c6SBarry Smith #define __FUNCT__ "PCShellSetContext"
63*be29d3c6SBarry Smith /*@C
64*be29d3c6SBarry Smith     PCShellSetContext - sets the context for a shell PC
65*be29d3c6SBarry Smith 
66*be29d3c6SBarry Smith    Collective on PC
67*be29d3c6SBarry Smith 
68*be29d3c6SBarry Smith     Input Parameters:
69*be29d3c6SBarry Smith +   pc - the shell PC
70*be29d3c6SBarry Smith -   ctx - the context
71*be29d3c6SBarry Smith 
72*be29d3c6SBarry Smith    Level: advanced
73*be29d3c6SBarry Smith 
74*be29d3c6SBarry Smith    Fortran Notes: The context can only be an integer or a PetscObject
75*be29d3c6SBarry Smith       unfortunately it cannot be a Fortran array or derived type.
76*be29d3c6SBarry Smith 
77*be29d3c6SBarry Smith .seealso: PCCreateShell(), PCShellGetContext()
78*be29d3c6SBarry Smith @*/
79*be29d3c6SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetContext(PC pc,void *ctx)
80*be29d3c6SBarry Smith {
81*be29d3c6SBarry Smith   PC_Shell      *shell = (PC_Shell*)pc->data;
82*be29d3c6SBarry Smith   PetscErrorCode ierr;
83*be29d3c6SBarry Smith   PetscTruth     flg;
84*be29d3c6SBarry Smith 
85*be29d3c6SBarry Smith   PetscFunctionBegin;
86*be29d3c6SBarry Smith   PetscValidHeaderSpecific(pc,PC_COOKIE,1);
87*be29d3c6SBarry Smith   ierr = PetscTypeCompare((PetscObject)pc,PCSHELL,&flg);CHKERRQ(ierr);
88*be29d3c6SBarry Smith   if (flg) {
89*be29d3c6SBarry Smith     shell->ctx = ctx;
90*be29d3c6SBarry Smith   }
91*be29d3c6SBarry Smith   PetscFunctionReturn(0);
92*be29d3c6SBarry Smith }
93*be29d3c6SBarry Smith 
94*be29d3c6SBarry Smith #undef __FUNCT__
954b9ad928SBarry Smith #define __FUNCT__ "PCApply_SetUp"
966849ba73SBarry Smith static PetscErrorCode PCSetUp_Shell(PC pc)
974b9ad928SBarry Smith {
984b9ad928SBarry Smith   PC_Shell       *shell;
99dfbe8321SBarry Smith   PetscErrorCode ierr;
1004b9ad928SBarry Smith 
1014b9ad928SBarry Smith   PetscFunctionBegin;
1024b9ad928SBarry Smith   shell = (PC_Shell*)pc->data;
1034b9ad928SBarry Smith   if (shell->setup) {
1044b9ad928SBarry Smith     ierr  = (*shell->setup)(shell->ctx);CHKERRQ(ierr);
1054b9ad928SBarry Smith   }
1064b9ad928SBarry Smith   PetscFunctionReturn(0);
1074b9ad928SBarry Smith }
1084b9ad928SBarry Smith 
1094b9ad928SBarry Smith #undef __FUNCT__
1104b9ad928SBarry Smith #define __FUNCT__ "PCApply_Shell"
1116849ba73SBarry Smith static PetscErrorCode PCApply_Shell(PC pc,Vec x,Vec y)
1124b9ad928SBarry Smith {
1134b9ad928SBarry Smith   PC_Shell       *shell;
114dfbe8321SBarry Smith   PetscErrorCode ierr;
1154b9ad928SBarry Smith 
1164b9ad928SBarry Smith   PetscFunctionBegin;
1174b9ad928SBarry Smith   shell = (PC_Shell*)pc->data;
1181302d50aSBarry Smith   if (!shell->apply) SETERRQ(PETSC_ERR_USER,"No apply() routine provided to Shell PC");
1194b9ad928SBarry Smith   ierr  = (*shell->apply)(shell->ctx,x,y);CHKERRQ(ierr);
1204b9ad928SBarry Smith   PetscFunctionReturn(0);
1214b9ad928SBarry Smith }
1224b9ad928SBarry Smith 
1234b9ad928SBarry Smith #undef __FUNCT__
1247cdd61b2SBarry Smith #define __FUNCT__ "PCPreSolve_Shell"
1257cdd61b2SBarry Smith static PetscErrorCode PCPreSolve_Shell(PC pc,KSP ksp,Vec b,Vec x)
1267cdd61b2SBarry Smith {
1277cdd61b2SBarry Smith   PC_Shell       *shell;
1287cdd61b2SBarry Smith   PetscErrorCode ierr;
1297cdd61b2SBarry Smith 
1307cdd61b2SBarry Smith   PetscFunctionBegin;
1317cdd61b2SBarry Smith   shell = (PC_Shell*)pc->data;
13291ad8336SSatish Balay   if (!shell->presolve) SETERRQ(PETSC_ERR_USER,"No presolve() routine provided to Shell PC");
1337cdd61b2SBarry Smith   ierr  = (*shell->presolve)(shell->ctx,ksp,b,x);CHKERRQ(ierr);
1347cdd61b2SBarry Smith   PetscFunctionReturn(0);
1357cdd61b2SBarry Smith }
1367cdd61b2SBarry Smith 
1377cdd61b2SBarry Smith #undef __FUNCT__
1387cdd61b2SBarry Smith #define __FUNCT__ "PCPostSolve_Shell"
1397cdd61b2SBarry Smith static PetscErrorCode PCPostSolve_Shell(PC pc,KSP ksp,Vec b,Vec x)
1407cdd61b2SBarry Smith {
1417cdd61b2SBarry Smith   PC_Shell       *shell;
1427cdd61b2SBarry Smith   PetscErrorCode ierr;
1437cdd61b2SBarry Smith 
1447cdd61b2SBarry Smith   PetscFunctionBegin;
1457cdd61b2SBarry Smith   shell = (PC_Shell*)pc->data;
14691ad8336SSatish Balay   if (!shell->postsolve) SETERRQ(PETSC_ERR_USER,"No postsolve() routine provided to Shell PC");
14791ad8336SSatish Balay   ierr  = (*shell->postsolve)(shell->ctx,ksp,b,x);CHKERRQ(ierr);
1487cdd61b2SBarry Smith   PetscFunctionReturn(0);
1497cdd61b2SBarry Smith }
1507cdd61b2SBarry Smith 
1517cdd61b2SBarry Smith #undef __FUNCT__
1524b9ad928SBarry Smith #define __FUNCT__ "PCApplyTranspose_Shell"
1536849ba73SBarry Smith static PetscErrorCode PCApplyTranspose_Shell(PC pc,Vec x,Vec y)
1544b9ad928SBarry Smith {
1554b9ad928SBarry Smith   PC_Shell       *shell;
156dfbe8321SBarry Smith   PetscErrorCode ierr;
1574b9ad928SBarry Smith 
1584b9ad928SBarry Smith   PetscFunctionBegin;
1594b9ad928SBarry Smith   shell = (PC_Shell*)pc->data;
1601302d50aSBarry Smith   if (!shell->applytranspose) SETERRQ(PETSC_ERR_USER,"No applytranspose() routine provided to Shell PC");
1614b9ad928SBarry Smith   ierr  = (*shell->applytranspose)(shell->ctx,x,y);CHKERRQ(ierr);
1624b9ad928SBarry Smith   PetscFunctionReturn(0);
1634b9ad928SBarry Smith }
1644b9ad928SBarry Smith 
1654b9ad928SBarry Smith #undef __FUNCT__
1664b9ad928SBarry Smith #define __FUNCT__ "PCApplyRichardson_Shell"
16713f74950SBarry Smith static PetscErrorCode PCApplyRichardson_Shell(PC pc,Vec x,Vec y,Vec w,PetscReal rtol,PetscReal abstol, PetscReal dtol,PetscInt it)
1684b9ad928SBarry Smith {
169dfbe8321SBarry Smith   PetscErrorCode ierr;
1704b9ad928SBarry Smith   PC_Shell       *shell;
1714b9ad928SBarry Smith 
1724b9ad928SBarry Smith   PetscFunctionBegin;
1734b9ad928SBarry Smith   shell = (PC_Shell*)pc->data;
174*be29d3c6SBarry Smith   ierr  = (*shell->applyrich)(shell->ctx,x,y,w,rtol,abstol,dtol,it);CHKERRQ(ierr);
1754b9ad928SBarry Smith   PetscFunctionReturn(0);
1764b9ad928SBarry Smith }
1774b9ad928SBarry Smith 
1784b9ad928SBarry Smith #undef __FUNCT__
1794b9ad928SBarry Smith #define __FUNCT__ "PCDestroy_Shell"
1806849ba73SBarry Smith static PetscErrorCode PCDestroy_Shell(PC pc)
1814b9ad928SBarry Smith {
1824b9ad928SBarry Smith   PC_Shell       *shell = (PC_Shell*)pc->data;
183dfbe8321SBarry Smith   PetscErrorCode ierr;
1844b9ad928SBarry Smith 
1854b9ad928SBarry Smith   PetscFunctionBegin;
1864b9ad928SBarry Smith   if (shell->name) {ierr = PetscFree(shell->name);}
1874b9ad928SBarry Smith   ierr = PetscFree(shell);CHKERRQ(ierr);
1884b9ad928SBarry Smith   PetscFunctionReturn(0);
1894b9ad928SBarry Smith }
1904b9ad928SBarry Smith 
1914b9ad928SBarry Smith #undef __FUNCT__
1924b9ad928SBarry Smith #define __FUNCT__ "PCView_Shell"
1936849ba73SBarry Smith static PetscErrorCode PCView_Shell(PC pc,PetscViewer viewer)
1944b9ad928SBarry Smith {
1954b9ad928SBarry Smith   PC_Shell       *shell = (PC_Shell*)pc->data;
196dfbe8321SBarry Smith   PetscErrorCode ierr;
19732077d6dSBarry Smith   PetscTruth     iascii;
1984b9ad928SBarry Smith 
1994b9ad928SBarry Smith   PetscFunctionBegin;
20032077d6dSBarry Smith   ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_ASCII,&iascii);CHKERRQ(ierr);
20132077d6dSBarry Smith   if (iascii) {
2024b9ad928SBarry Smith     if (shell->name) {ierr = PetscViewerASCIIPrintf(viewer,"  Shell: %s\n",shell->name);CHKERRQ(ierr);}
2034b9ad928SBarry Smith     else             {ierr = PetscViewerASCIIPrintf(viewer,"  Shell: no name\n");CHKERRQ(ierr);}
2044b9ad928SBarry Smith   }
2054b9ad928SBarry Smith   if (shell->view) {
2064b9ad928SBarry Smith     ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
2074b9ad928SBarry Smith     ierr  = (*shell->view)(shell->ctx,viewer);CHKERRQ(ierr);
2084b9ad928SBarry Smith     ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
2094b9ad928SBarry Smith   }
2104b9ad928SBarry Smith   PetscFunctionReturn(0);
2114b9ad928SBarry Smith }
2124b9ad928SBarry Smith 
2134b9ad928SBarry Smith /* ------------------------------------------------------------------------------*/
2144b9ad928SBarry Smith EXTERN_C_BEGIN
2154b9ad928SBarry Smith #undef __FUNCT__
2164b9ad928SBarry Smith #define __FUNCT__ "PCShellSetSetUp_Shell"
217dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetSetUp_Shell(PC pc, PetscErrorCode (*setup)(void*))
2184b9ad928SBarry Smith {
2194b9ad928SBarry Smith   PC_Shell *shell;
2204b9ad928SBarry Smith 
2214b9ad928SBarry Smith   PetscFunctionBegin;
2224b9ad928SBarry Smith   shell        = (PC_Shell*)pc->data;
2234b9ad928SBarry Smith   shell->setup = setup;
2244b9ad928SBarry Smith   PetscFunctionReturn(0);
2254b9ad928SBarry Smith }
2264b9ad928SBarry Smith EXTERN_C_END
2274b9ad928SBarry Smith 
2284b9ad928SBarry Smith EXTERN_C_BEGIN
2294b9ad928SBarry Smith #undef __FUNCT__
2304b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApply_Shell"
231*be29d3c6SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApply_Shell(PC pc,PetscErrorCode (*apply)(void*,Vec,Vec))
2324b9ad928SBarry Smith {
2334b9ad928SBarry Smith   PC_Shell *shell;
2344b9ad928SBarry Smith 
2354b9ad928SBarry Smith   PetscFunctionBegin;
2364b9ad928SBarry Smith   shell        = (PC_Shell*)pc->data;
2374b9ad928SBarry Smith   shell->apply = apply;
2384b9ad928SBarry Smith   PetscFunctionReturn(0);
2394b9ad928SBarry Smith }
2404b9ad928SBarry Smith EXTERN_C_END
2414b9ad928SBarry Smith 
2424b9ad928SBarry Smith EXTERN_C_BEGIN
2434b9ad928SBarry Smith #undef __FUNCT__
2447cdd61b2SBarry Smith #define __FUNCT__ "PCShellSetPreSolve_Shell"
245*be29d3c6SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetPreSolve_Shell(PC pc,PetscErrorCode (*presolve)(void*,KSP,Vec,Vec))
2467cdd61b2SBarry Smith {
2477cdd61b2SBarry Smith   PC_Shell *shell;
2487cdd61b2SBarry Smith 
2497cdd61b2SBarry Smith   PetscFunctionBegin;
2507cdd61b2SBarry Smith   shell             = (PC_Shell*)pc->data;
2517cdd61b2SBarry Smith   shell->presolve   = presolve;
2529bbb2c88SBarry Smith   if (presolve) {
2539bbb2c88SBarry Smith     pc->ops->presolve = PCPreSolve_Shell;
2549bbb2c88SBarry Smith   } else {
2559bbb2c88SBarry Smith     pc->ops->presolve = 0;
2569bbb2c88SBarry Smith   }
2577cdd61b2SBarry Smith   PetscFunctionReturn(0);
2587cdd61b2SBarry Smith }
2597cdd61b2SBarry Smith EXTERN_C_END
2607cdd61b2SBarry Smith 
2617cdd61b2SBarry Smith EXTERN_C_BEGIN
2627cdd61b2SBarry Smith #undef __FUNCT__
2637cdd61b2SBarry Smith #define __FUNCT__ "PCShellSetPostSolve_Shell"
264*be29d3c6SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetPostSolve_Shell(PC pc,PetscErrorCode (*postsolve)(void*,KSP,Vec,Vec))
2657cdd61b2SBarry Smith {
2667cdd61b2SBarry Smith   PC_Shell *shell;
2677cdd61b2SBarry Smith 
2687cdd61b2SBarry Smith   PetscFunctionBegin;
2697cdd61b2SBarry Smith   shell           = (PC_Shell*)pc->data;
2707cdd61b2SBarry Smith   shell->postsolve = postsolve;
2719bbb2c88SBarry Smith   if (postsolve) {
2729bbb2c88SBarry Smith     pc->ops->postsolve = PCPostSolve_Shell;
2739bbb2c88SBarry Smith   } else {
2749bbb2c88SBarry Smith     pc->ops->postsolve = 0;
2759bbb2c88SBarry Smith   }
2767cdd61b2SBarry Smith   PetscFunctionReturn(0);
2777cdd61b2SBarry Smith }
2787cdd61b2SBarry Smith EXTERN_C_END
2797cdd61b2SBarry Smith 
2807cdd61b2SBarry Smith EXTERN_C_BEGIN
2817cdd61b2SBarry Smith #undef __FUNCT__
2824b9ad928SBarry Smith #define __FUNCT__ "PCShellSetView_Shell"
283dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetView_Shell(PC pc,PetscErrorCode (*view)(void*,PetscViewer))
2844b9ad928SBarry Smith {
2854b9ad928SBarry Smith   PC_Shell *shell;
2864b9ad928SBarry Smith 
2874b9ad928SBarry Smith   PetscFunctionBegin;
2884b9ad928SBarry Smith   shell        = (PC_Shell*)pc->data;
2894b9ad928SBarry Smith   shell->view = view;
2904b9ad928SBarry Smith   PetscFunctionReturn(0);
2914b9ad928SBarry Smith }
2924b9ad928SBarry Smith EXTERN_C_END
2934b9ad928SBarry Smith 
2944b9ad928SBarry Smith EXTERN_C_BEGIN
2954b9ad928SBarry Smith #undef __FUNCT__
2964b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApplyTranspose_Shell"
297dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApplyTranspose_Shell(PC pc,PetscErrorCode (*applytranspose)(void*,Vec,Vec))
2984b9ad928SBarry Smith {
2994b9ad928SBarry Smith   PC_Shell *shell;
3004b9ad928SBarry Smith 
3014b9ad928SBarry Smith   PetscFunctionBegin;
3024b9ad928SBarry Smith   shell                 = (PC_Shell*)pc->data;
3034b9ad928SBarry Smith   shell->applytranspose = applytranspose;
3044b9ad928SBarry Smith   PetscFunctionReturn(0);
3054b9ad928SBarry Smith }
3064b9ad928SBarry Smith EXTERN_C_END
3074b9ad928SBarry Smith 
3084b9ad928SBarry Smith EXTERN_C_BEGIN
3094b9ad928SBarry Smith #undef __FUNCT__
3104b9ad928SBarry Smith #define __FUNCT__ "PCShellSetName_Shell"
311dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetName_Shell(PC pc,const char name[])
3124b9ad928SBarry Smith {
3134b9ad928SBarry Smith   PC_Shell       *shell;
314dfbe8321SBarry Smith   PetscErrorCode ierr;
3154b9ad928SBarry Smith 
3164b9ad928SBarry Smith   PetscFunctionBegin;
3174b9ad928SBarry Smith   shell = (PC_Shell*)pc->data;
3184b9ad928SBarry Smith   ierr  = PetscStrallocpy(name,&shell->name);CHKERRQ(ierr);
3194b9ad928SBarry Smith   PetscFunctionReturn(0);
3204b9ad928SBarry Smith }
3214b9ad928SBarry Smith EXTERN_C_END
3224b9ad928SBarry Smith 
3234b9ad928SBarry Smith EXTERN_C_BEGIN
3244b9ad928SBarry Smith #undef __FUNCT__
3254b9ad928SBarry Smith #define __FUNCT__ "PCShellGetName_Shell"
326dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellGetName_Shell(PC pc,char *name[])
3274b9ad928SBarry Smith {
3284b9ad928SBarry Smith   PC_Shell *shell;
3294b9ad928SBarry Smith 
3304b9ad928SBarry Smith   PetscFunctionBegin;
3314b9ad928SBarry Smith   shell  = (PC_Shell*)pc->data;
3324b9ad928SBarry Smith   *name  = shell->name;
3334b9ad928SBarry Smith   PetscFunctionReturn(0);
3344b9ad928SBarry Smith }
3354b9ad928SBarry Smith EXTERN_C_END
3364b9ad928SBarry Smith 
3374b9ad928SBarry Smith EXTERN_C_BEGIN
3384b9ad928SBarry Smith #undef __FUNCT__
3394b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApplyRichardson_Shell"
340*be29d3c6SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApplyRichardson_Shell(PC pc,PetscErrorCode (*apply)(void*,Vec,Vec,Vec,PetscReal,PetscReal,PetscReal,PetscInt))
3414b9ad928SBarry Smith {
3424b9ad928SBarry Smith   PC_Shell *shell;
3434b9ad928SBarry Smith 
3444b9ad928SBarry Smith   PetscFunctionBegin;
3454b9ad928SBarry Smith   shell                     = (PC_Shell*)pc->data;
3464b9ad928SBarry Smith   pc->ops->applyrichardson  = PCApplyRichardson_Shell;
3474b9ad928SBarry Smith   shell->applyrich          = apply;
3484b9ad928SBarry Smith   PetscFunctionReturn(0);
3494b9ad928SBarry Smith }
3504b9ad928SBarry Smith EXTERN_C_END
3514b9ad928SBarry Smith 
3524b9ad928SBarry Smith /* -------------------------------------------------------------------------------*/
3534b9ad928SBarry Smith 
3544b9ad928SBarry Smith #undef __FUNCT__
3554b9ad928SBarry Smith #define __FUNCT__ "PCShellSetSetUp"
3564b9ad928SBarry Smith /*@C
3574b9ad928SBarry Smith    PCShellSetSetUp - Sets routine to use to "setup" the preconditioner whenever the
3584b9ad928SBarry Smith    matrix operator is changed.
3594b9ad928SBarry Smith 
3604b9ad928SBarry Smith    Collective on PC
3614b9ad928SBarry Smith 
3624b9ad928SBarry Smith    Input Parameters:
3634b9ad928SBarry Smith +  pc - the preconditioner context
3644b9ad928SBarry Smith .  setup - the application-provided setup routine
3654b9ad928SBarry Smith 
3664b9ad928SBarry Smith    Calling sequence of setup:
3674b9ad928SBarry Smith .vb
36813f74950SBarry Smith    PetscErrorCode setup (void *ptr)
3694b9ad928SBarry Smith .ve
3704b9ad928SBarry Smith 
3714b9ad928SBarry Smith .  ptr - the application context
3724b9ad928SBarry Smith 
3734b9ad928SBarry Smith    Level: developer
3744b9ad928SBarry Smith 
3754b9ad928SBarry Smith .keywords: PC, shell, set, setup, user-provided
3764b9ad928SBarry Smith 
377*be29d3c6SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetApply(), PCShellSetContext()
3784b9ad928SBarry Smith @*/
379dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetSetUp(PC pc,PetscErrorCode (*setup)(void*))
3804b9ad928SBarry Smith {
3816849ba73SBarry Smith   PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*));
3824b9ad928SBarry Smith 
3834b9ad928SBarry Smith   PetscFunctionBegin;
3844482741eSBarry Smith   PetscValidHeaderSpecific(pc,PC_COOKIE,1);
3854b9ad928SBarry Smith   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetSetUp_C",(void (**)(void))&f);CHKERRQ(ierr);
3864b9ad928SBarry Smith   if (f) {
3874b9ad928SBarry Smith     ierr = (*f)(pc,setup);CHKERRQ(ierr);
3884b9ad928SBarry Smith   }
3894b9ad928SBarry Smith   PetscFunctionReturn(0);
3904b9ad928SBarry Smith }
3914b9ad928SBarry Smith 
3924b9ad928SBarry Smith 
3934b9ad928SBarry Smith #undef __FUNCT__
3944b9ad928SBarry Smith #define __FUNCT__ "PCShellSetView"
3954b9ad928SBarry Smith /*@C
3964b9ad928SBarry Smith    PCShellSetView - Sets routine to use as viewer of shell preconditioner
3974b9ad928SBarry Smith 
3984b9ad928SBarry Smith    Collective on PC
3994b9ad928SBarry Smith 
4004b9ad928SBarry Smith    Input Parameters:
4014b9ad928SBarry Smith +  pc - the preconditioner context
4024b9ad928SBarry Smith -  view - the application-provided view routine
4034b9ad928SBarry Smith 
4044b9ad928SBarry Smith    Calling sequence of apply:
4054b9ad928SBarry Smith .vb
40613f74950SBarry Smith    PetscErrorCode view(void *ptr,PetscViewer v)
4074b9ad928SBarry Smith .ve
4084b9ad928SBarry Smith 
4094b9ad928SBarry Smith +  ptr - the application context
4104b9ad928SBarry Smith -  v   - viewer
4114b9ad928SBarry Smith 
4124b9ad928SBarry Smith    Level: developer
4134b9ad928SBarry Smith 
4144b9ad928SBarry Smith .keywords: PC, shell, set, apply, user-provided
4154b9ad928SBarry Smith 
4164b9ad928SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose()
4174b9ad928SBarry Smith @*/
418dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetView(PC pc,PetscErrorCode (*view)(void*,PetscViewer))
4194b9ad928SBarry Smith {
4206849ba73SBarry Smith   PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*,PetscViewer));
4214b9ad928SBarry Smith 
4224b9ad928SBarry Smith   PetscFunctionBegin;
4234482741eSBarry Smith   PetscValidHeaderSpecific(pc,PC_COOKIE,1);
4244b9ad928SBarry Smith   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetView_C",(void (**)(void))&f);CHKERRQ(ierr);
4254b9ad928SBarry Smith   if (f) {
4264b9ad928SBarry Smith     ierr = (*f)(pc,view);CHKERRQ(ierr);
4274b9ad928SBarry Smith   }
4284b9ad928SBarry Smith   PetscFunctionReturn(0);
4294b9ad928SBarry Smith }
4304b9ad928SBarry Smith 
4314b9ad928SBarry Smith #undef __FUNCT__
4324b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApply"
4334b9ad928SBarry Smith /*@C
4344b9ad928SBarry Smith    PCShellSetApply - Sets routine to use as preconditioner.
4354b9ad928SBarry Smith 
4364b9ad928SBarry Smith    Collective on PC
4374b9ad928SBarry Smith 
4384b9ad928SBarry Smith    Input Parameters:
4394b9ad928SBarry Smith +  pc - the preconditioner context
440*be29d3c6SBarry Smith -  apply - the application-provided preconditioning routine
4414b9ad928SBarry Smith 
4424b9ad928SBarry Smith    Calling sequence of apply:
4434b9ad928SBarry Smith .vb
44413f74950SBarry Smith    PetscErrorCode apply (void *ptr,Vec xin,Vec xout)
4454b9ad928SBarry Smith .ve
4464b9ad928SBarry Smith 
4474b9ad928SBarry Smith +  ptr - the application context
4484b9ad928SBarry Smith .  xin - input vector
4494b9ad928SBarry Smith -  xout - output vector
4504b9ad928SBarry Smith 
4514b9ad928SBarry Smith    Level: developer
4524b9ad928SBarry Smith 
4534b9ad928SBarry Smith .keywords: PC, shell, set, apply, user-provided
4544b9ad928SBarry Smith 
455*be29d3c6SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose(), PCShellSetContext()
4564b9ad928SBarry Smith @*/
457*be29d3c6SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApply(PC pc,PetscErrorCode (*apply)(void*,Vec,Vec))
4584b9ad928SBarry Smith {
459*be29d3c6SBarry Smith   PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*,Vec,Vec));
4604b9ad928SBarry Smith 
4614b9ad928SBarry Smith   PetscFunctionBegin;
4624482741eSBarry Smith   PetscValidHeaderSpecific(pc,PC_COOKIE,1);
4634b9ad928SBarry Smith   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetApply_C",(void (**)(void))&f);CHKERRQ(ierr);
4644b9ad928SBarry Smith   if (f) {
465*be29d3c6SBarry Smith     ierr = (*f)(pc,apply);CHKERRQ(ierr);
4664b9ad928SBarry Smith   }
4674b9ad928SBarry Smith   PetscFunctionReturn(0);
4684b9ad928SBarry Smith }
4694b9ad928SBarry Smith 
4704b9ad928SBarry Smith #undef __FUNCT__
4714b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApplyTranspose"
4724b9ad928SBarry Smith /*@C
4734b9ad928SBarry Smith    PCShellSetApplyTranspose - Sets routine to use as preconditioner transpose.
4744b9ad928SBarry Smith 
4754b9ad928SBarry Smith    Collective on PC
4764b9ad928SBarry Smith 
4774b9ad928SBarry Smith    Input Parameters:
4784b9ad928SBarry Smith +  pc - the preconditioner context
4794b9ad928SBarry Smith -  apply - the application-provided preconditioning transpose routine
4804b9ad928SBarry Smith 
4814b9ad928SBarry Smith    Calling sequence of apply:
4824b9ad928SBarry Smith .vb
48313f74950SBarry Smith    PetscErrorCode applytranspose (void *ptr,Vec xin,Vec xout)
4844b9ad928SBarry Smith .ve
4854b9ad928SBarry Smith 
4864b9ad928SBarry Smith +  ptr - the application context
4874b9ad928SBarry Smith .  xin - input vector
4884b9ad928SBarry Smith -  xout - output vector
4894b9ad928SBarry Smith 
4904b9ad928SBarry Smith    Level: developer
4914b9ad928SBarry Smith 
4924b9ad928SBarry Smith    Notes:
4934b9ad928SBarry Smith    Uses the same context variable as PCShellSetApply().
4944b9ad928SBarry Smith 
4954b9ad928SBarry Smith .keywords: PC, shell, set, apply, user-provided
4964b9ad928SBarry Smith 
497*be29d3c6SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApply(), PCSetContext()
4984b9ad928SBarry Smith @*/
499dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApplyTranspose(PC pc,PetscErrorCode (*applytranspose)(void*,Vec,Vec))
5004b9ad928SBarry Smith {
5016849ba73SBarry Smith   PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*,Vec,Vec));
5024b9ad928SBarry Smith 
5034b9ad928SBarry Smith   PetscFunctionBegin;
5044482741eSBarry Smith   PetscValidHeaderSpecific(pc,PC_COOKIE,1);
5054b9ad928SBarry Smith   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetApplyTranspose_C",(void (**)(void))&f);CHKERRQ(ierr);
5064b9ad928SBarry Smith   if (f) {
5074b9ad928SBarry Smith     ierr = (*f)(pc,applytranspose);CHKERRQ(ierr);
5084b9ad928SBarry Smith   }
5094b9ad928SBarry Smith   PetscFunctionReturn(0);
5104b9ad928SBarry Smith }
5114b9ad928SBarry Smith 
5124b9ad928SBarry Smith #undef __FUNCT__
5137cdd61b2SBarry Smith #define __FUNCT__ "PCShellSetPreSolve"
5147cdd61b2SBarry Smith /*@C
5157cdd61b2SBarry Smith    PCShellSetPreSolve - Sets routine to apply to the operators/vectors before a KSPSolve() is
5167cdd61b2SBarry Smith       applied. This usually does something like scale the linear system in some application
5177cdd61b2SBarry Smith       specific way.
5187cdd61b2SBarry Smith 
5197cdd61b2SBarry Smith    Collective on PC
5207cdd61b2SBarry Smith 
5217cdd61b2SBarry Smith    Input Parameters:
5227cdd61b2SBarry Smith +  pc - the preconditioner context
5237cdd61b2SBarry Smith -  presolve - the application-provided presolve routine
5247cdd61b2SBarry Smith 
5257cdd61b2SBarry Smith    Calling sequence of presolve:
5267cdd61b2SBarry Smith .vb
5277cdd61b2SBarry Smith    PetscErrorCode presolve (void *ptr,KSP ksp,Vec b,Vec x)
5287cdd61b2SBarry Smith .ve
5297cdd61b2SBarry Smith 
5307cdd61b2SBarry Smith +  ptr - the application context
5317cdd61b2SBarry Smith .  xin - input vector
5327cdd61b2SBarry Smith -  xout - output vector
5337cdd61b2SBarry Smith 
5347cdd61b2SBarry Smith    Level: developer
5357cdd61b2SBarry Smith 
5367cdd61b2SBarry Smith .keywords: PC, shell, set, apply, user-provided
5377cdd61b2SBarry Smith 
538*be29d3c6SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose(), PCShellSetPostSolve(), PCShellSetContext()
5397cdd61b2SBarry Smith @*/
5407cdd61b2SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetPreSolve(PC pc,PetscErrorCode (*presolve)(void*,KSP,Vec,Vec))
5417cdd61b2SBarry Smith {
5427cdd61b2SBarry Smith   PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*,KSP,Vec,Vec));
5437cdd61b2SBarry Smith 
5447cdd61b2SBarry Smith   PetscFunctionBegin;
5457cdd61b2SBarry Smith   PetscValidHeaderSpecific(pc,PC_COOKIE,1);
5467cdd61b2SBarry Smith   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetPreSolve_C",(void (**)(void))&f);CHKERRQ(ierr);
5477cdd61b2SBarry Smith   if (f) {
5487cdd61b2SBarry Smith     ierr = (*f)(pc,presolve);CHKERRQ(ierr);
5497cdd61b2SBarry Smith   }
5507cdd61b2SBarry Smith   PetscFunctionReturn(0);
5517cdd61b2SBarry Smith }
5527cdd61b2SBarry Smith 
5537cdd61b2SBarry Smith #undef __FUNCT__
5547cdd61b2SBarry Smith #define __FUNCT__ "PCShellSetPostSolve"
5557cdd61b2SBarry Smith /*@C
5567cdd61b2SBarry Smith    PCShellSetPostSolve - Sets routine to apply to the operators/vectors before a KSPSolve() is
5577cdd61b2SBarry Smith       applied. This usually does something like scale the linear system in some application
5587cdd61b2SBarry Smith       specific way.
5597cdd61b2SBarry Smith 
5607cdd61b2SBarry Smith    Collective on PC
5617cdd61b2SBarry Smith 
5627cdd61b2SBarry Smith    Input Parameters:
5637cdd61b2SBarry Smith +  pc - the preconditioner context
5647cdd61b2SBarry Smith -  postsolve - the application-provided presolve routine
5657cdd61b2SBarry Smith 
5667cdd61b2SBarry Smith    Calling sequence of postsolve:
5677cdd61b2SBarry Smith .vb
5687cdd61b2SBarry Smith    PetscErrorCode postsolve(void *ptr,KSP ksp,Vec b,Vec x)
5697cdd61b2SBarry Smith .ve
5707cdd61b2SBarry Smith 
5717cdd61b2SBarry Smith +  ptr - the application context
5727cdd61b2SBarry Smith .  xin - input vector
5737cdd61b2SBarry Smith -  xout - output vector
5747cdd61b2SBarry Smith 
5757cdd61b2SBarry Smith    Level: developer
5767cdd61b2SBarry Smith 
5777cdd61b2SBarry Smith .keywords: PC, shell, set, apply, user-provided
5787cdd61b2SBarry Smith 
579*be29d3c6SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose(), PCShellSetPreSolve(), PCShellSetContext()
5807cdd61b2SBarry Smith @*/
5817cdd61b2SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetPostSolve(PC pc,PetscErrorCode (*postsolve)(void*,KSP,Vec,Vec))
5827cdd61b2SBarry Smith {
5837cdd61b2SBarry Smith   PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*,KSP,Vec,Vec));
5847cdd61b2SBarry Smith 
5857cdd61b2SBarry Smith   PetscFunctionBegin;
5867cdd61b2SBarry Smith   PetscValidHeaderSpecific(pc,PC_COOKIE,1);
5877cdd61b2SBarry Smith   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetPostSolve_C",(void (**)(void))&f);CHKERRQ(ierr);
5887cdd61b2SBarry Smith   if (f) {
5897cdd61b2SBarry Smith     ierr = (*f)(pc,postsolve);CHKERRQ(ierr);
5907cdd61b2SBarry Smith   }
5917cdd61b2SBarry Smith   PetscFunctionReturn(0);
5927cdd61b2SBarry Smith }
5937cdd61b2SBarry Smith 
5947cdd61b2SBarry Smith #undef __FUNCT__
5954b9ad928SBarry Smith #define __FUNCT__ "PCShellSetName"
5964b9ad928SBarry Smith /*@C
5974b9ad928SBarry Smith    PCShellSetName - Sets an optional name to associate with a shell
5984b9ad928SBarry Smith    preconditioner.
5994b9ad928SBarry Smith 
6004b9ad928SBarry Smith    Not Collective
6014b9ad928SBarry Smith 
6024b9ad928SBarry Smith    Input Parameters:
6034b9ad928SBarry Smith +  pc - the preconditioner context
6044b9ad928SBarry Smith -  name - character string describing shell preconditioner
6054b9ad928SBarry Smith 
6064b9ad928SBarry Smith    Level: developer
6074b9ad928SBarry Smith 
6084b9ad928SBarry Smith .keywords: PC, shell, set, name, user-provided
6094b9ad928SBarry Smith 
6104b9ad928SBarry Smith .seealso: PCShellGetName()
6114b9ad928SBarry Smith @*/
612dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetName(PC pc,const char name[])
6134b9ad928SBarry Smith {
614dfbe8321SBarry Smith   PetscErrorCode ierr,(*f)(PC,const char []);
6154b9ad928SBarry Smith 
6164b9ad928SBarry Smith   PetscFunctionBegin;
6174482741eSBarry Smith   PetscValidHeaderSpecific(pc,PC_COOKIE,1);
6184b9ad928SBarry Smith   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetName_C",(void (**)(void))&f);CHKERRQ(ierr);
6194b9ad928SBarry Smith   if (f) {
6204b9ad928SBarry Smith     ierr = (*f)(pc,name);CHKERRQ(ierr);
6214b9ad928SBarry Smith   }
6224b9ad928SBarry Smith   PetscFunctionReturn(0);
6234b9ad928SBarry Smith }
6244b9ad928SBarry Smith 
6254b9ad928SBarry Smith #undef __FUNCT__
6264b9ad928SBarry Smith #define __FUNCT__ "PCShellGetName"
6274b9ad928SBarry Smith /*@C
6284b9ad928SBarry Smith    PCShellGetName - Gets an optional name that the user has set for a shell
6294b9ad928SBarry Smith    preconditioner.
6304b9ad928SBarry Smith 
6314b9ad928SBarry Smith    Not Collective
6324b9ad928SBarry Smith 
6334b9ad928SBarry Smith    Input Parameter:
6344b9ad928SBarry Smith .  pc - the preconditioner context
6354b9ad928SBarry Smith 
6364b9ad928SBarry Smith    Output Parameter:
6374b9ad928SBarry Smith .  name - character string describing shell preconditioner (you should not free this)
6384b9ad928SBarry Smith 
6394b9ad928SBarry Smith    Level: developer
6404b9ad928SBarry Smith 
6414b9ad928SBarry Smith .keywords: PC, shell, get, name, user-provided
6424b9ad928SBarry Smith 
6434b9ad928SBarry Smith .seealso: PCShellSetName()
6444b9ad928SBarry Smith @*/
645dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellGetName(PC pc,char *name[])
6464b9ad928SBarry Smith {
647dfbe8321SBarry Smith   PetscErrorCode ierr,(*f)(PC,char *[]);
6484b9ad928SBarry Smith 
6494b9ad928SBarry Smith   PetscFunctionBegin;
6504482741eSBarry Smith   PetscValidHeaderSpecific(pc,PC_COOKIE,1);
6514482741eSBarry Smith   PetscValidPointer(name,2);
6524b9ad928SBarry Smith   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellGetName_C",(void (**)(void))&f);CHKERRQ(ierr);
6534b9ad928SBarry Smith   if (f) {
6544b9ad928SBarry Smith     ierr = (*f)(pc,name);CHKERRQ(ierr);
6554b9ad928SBarry Smith   } else {
6561302d50aSBarry Smith     SETERRQ(PETSC_ERR_ARG_WRONG,"Not shell preconditioner, cannot get name");
6574b9ad928SBarry Smith   }
6584b9ad928SBarry Smith   PetscFunctionReturn(0);
6594b9ad928SBarry Smith }
6604b9ad928SBarry Smith 
6614b9ad928SBarry Smith #undef __FUNCT__
6624b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApplyRichardson"
6634b9ad928SBarry Smith /*@C
6644b9ad928SBarry Smith    PCShellSetApplyRichardson - Sets routine to use as preconditioner
6654b9ad928SBarry Smith    in Richardson iteration.
6664b9ad928SBarry Smith 
6674b9ad928SBarry Smith    Collective on PC
6684b9ad928SBarry Smith 
6694b9ad928SBarry Smith    Input Parameters:
6704b9ad928SBarry Smith +  pc - the preconditioner context
671*be29d3c6SBarry Smith -  apply - the application-provided preconditioning routine
6724b9ad928SBarry Smith 
6734b9ad928SBarry Smith    Calling sequence of apply:
6744b9ad928SBarry Smith .vb
67513f74950SBarry Smith    PetscErrorCode apply (void *ptr,Vec b,Vec x,Vec r,PetscReal rtol,PetscReal abstol,PetscReal dtol,PetscInt maxits)
6764b9ad928SBarry Smith .ve
6774b9ad928SBarry Smith 
6784b9ad928SBarry Smith +  ptr - the application context
6794b9ad928SBarry Smith .  b - right-hand-side
6804b9ad928SBarry Smith .  x - current iterate
6814b9ad928SBarry Smith .  r - work space
6824b9ad928SBarry Smith .  rtol - relative tolerance of residual norm to stop at
68370441072SBarry Smith .  abstol - absolute tolerance of residual norm to stop at
6844b9ad928SBarry Smith .  dtol - if residual norm increases by this factor than return
6854b9ad928SBarry Smith -  maxits - number of iterations to run
6864b9ad928SBarry Smith 
6874b9ad928SBarry Smith    Level: developer
6884b9ad928SBarry Smith 
6894b9ad928SBarry Smith .keywords: PC, shell, set, apply, Richardson, user-provided
6904b9ad928SBarry Smith 
691*be29d3c6SBarry Smith .seealso: PCShellSetApply(), PCShellSetContext()
6924b9ad928SBarry Smith @*/
693*be29d3c6SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApplyRichardson(PC pc,PetscErrorCode (*apply)(void*,Vec,Vec,Vec,PetscReal,PetscReal,PetscReal,PetscInt))
6944b9ad928SBarry Smith {
695*be29d3c6SBarry Smith   PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*,Vec,Vec,Vec,PetscReal,PetscReal,PetscReal,PetscInt));
6964b9ad928SBarry Smith 
6974b9ad928SBarry Smith   PetscFunctionBegin;
6984482741eSBarry Smith   PetscValidHeaderSpecific(pc,PC_COOKIE,1);
6994b9ad928SBarry Smith   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetApplyRichardson_C",(void (**)(void))&f);CHKERRQ(ierr);
7004b9ad928SBarry Smith   if (f) {
701*be29d3c6SBarry Smith     ierr = (*f)(pc,apply);CHKERRQ(ierr);
7024b9ad928SBarry Smith   }
7034b9ad928SBarry Smith   PetscFunctionReturn(0);
7044b9ad928SBarry Smith }
7054b9ad928SBarry Smith 
7064b9ad928SBarry Smith /*MC
7074b9ad928SBarry Smith    PCSHELL - Creates a new preconditioner class for use with your
7084b9ad928SBarry Smith               own private data storage format.
7094b9ad928SBarry Smith 
7104b9ad928SBarry Smith    Level: advanced
7114b9ad928SBarry Smith 
7124b9ad928SBarry Smith    Concepts: providing your own preconditioner
7134b9ad928SBarry Smith 
7144b9ad928SBarry Smith   Usage:
7156849ba73SBarry Smith $             PetscErrorCode (*mult)(void*,Vec,Vec);
7166849ba73SBarry Smith $             PetscErrorCode (*setup)(void*);
7174b9ad928SBarry Smith $             PCCreate(comm,&pc);
7184b9ad928SBarry Smith $             PCSetType(pc,PCSHELL);
719*be29d3c6SBarry Smith $             PCShellSetApply(pc,mult);
720*be29d3c6SBarry Smith $             PCShellSetContext(pc,ctx)
7214b9ad928SBarry Smith $             PCShellSetSetUp(pc,setup);       (optional)
7224b9ad928SBarry Smith 
7234b9ad928SBarry Smith .seealso:  PCCreate(), PCSetType(), PCType (for list of available types), PC,
724d07a9264SSatish Balay            MATSHELL, PCShellSetUp(), PCShellSetApply(), PCShellSetView(),
7254b9ad928SBarry Smith            PCShellSetApplyTranpose(), PCShellSetName(), PCShellSetApplyRichardson(),
726*be29d3c6SBarry Smith            PCShellGetName(), PCShellSetContext(), PCShellGetContext()
7274b9ad928SBarry Smith M*/
7284b9ad928SBarry Smith 
7294b9ad928SBarry Smith EXTERN_C_BEGIN
7304b9ad928SBarry Smith #undef __FUNCT__
7314b9ad928SBarry Smith #define __FUNCT__ "PCCreate_Shell"
732dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCCreate_Shell(PC pc)
7334b9ad928SBarry Smith {
734dfbe8321SBarry Smith   PetscErrorCode ierr;
7354b9ad928SBarry Smith   PC_Shell       *shell;
7364b9ad928SBarry Smith 
7374b9ad928SBarry Smith   PetscFunctionBegin;
7384b9ad928SBarry Smith   pc->ops->destroy    = PCDestroy_Shell;
7394b9ad928SBarry Smith   ierr                = PetscNew(PC_Shell,&shell);CHKERRQ(ierr);
74052e6d16bSBarry Smith   ierr = PetscLogObjectMemory(pc,sizeof(PC_Shell));CHKERRQ(ierr);
7414b9ad928SBarry Smith   pc->data         = (void*)shell;
7424b9ad928SBarry Smith   pc->name         = 0;
7434b9ad928SBarry Smith 
7444b9ad928SBarry Smith   pc->ops->apply           = PCApply_Shell;
7454b9ad928SBarry Smith   pc->ops->view            = PCView_Shell;
7464b9ad928SBarry Smith   pc->ops->applytranspose  = PCApplyTranspose_Shell;
7474b9ad928SBarry Smith   pc->ops->applyrichardson = 0;
7484b9ad928SBarry Smith   pc->ops->setup           = PCSetUp_Shell;
7499bbb2c88SBarry Smith   pc->ops->presolve        = 0;
7509bbb2c88SBarry Smith   pc->ops->postsolve       = 0;
7514b9ad928SBarry Smith   pc->ops->view            = PCView_Shell;
7524b9ad928SBarry Smith 
7534b9ad928SBarry Smith   shell->apply          = 0;
7544b9ad928SBarry Smith   shell->applytranspose = 0;
7554b9ad928SBarry Smith   shell->name           = 0;
7564b9ad928SBarry Smith   shell->applyrich      = 0;
7577cdd61b2SBarry Smith   shell->presolve       = 0;
7587cdd61b2SBarry Smith   shell->postsolve      = 0;
7594b9ad928SBarry Smith   shell->ctx            = 0;
7604b9ad928SBarry Smith   shell->setup          = 0;
7614b9ad928SBarry Smith   shell->view           = 0;
7624b9ad928SBarry Smith 
7634b9ad928SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetSetUp_C","PCShellSetSetUp_Shell",
7644b9ad928SBarry Smith                     PCShellSetSetUp_Shell);CHKERRQ(ierr);
7654b9ad928SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetApply_C","PCShellSetApply_Shell",
7664b9ad928SBarry Smith                     PCShellSetApply_Shell);CHKERRQ(ierr);
7677cdd61b2SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetPreSolve_C","PCShellSetPreSolve_Shell",
7687cdd61b2SBarry Smith                     PCShellSetPreSolve_Shell);CHKERRQ(ierr);
7697cdd61b2SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetPostSolve_C","PCShellSetPostSolve_Shell",
7707cdd61b2SBarry Smith                     PCShellSetPostSolve_Shell);CHKERRQ(ierr);
7714b9ad928SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetView_C","PCShellSetView_Shell",
7724b9ad928SBarry Smith                     PCShellSetView_Shell);CHKERRQ(ierr);
773*be29d3c6SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetApplyTranspose_C","PCShellSetApplyTranspose_Shell",
7744b9ad928SBarry Smith                     PCShellSetApplyTranspose_Shell);CHKERRQ(ierr);
7754b9ad928SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetName_C","PCShellSetName_Shell",
7764b9ad928SBarry Smith                     PCShellSetName_Shell);CHKERRQ(ierr);
7774b9ad928SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellGetName_C","PCShellGetName_Shell",
7784b9ad928SBarry Smith                     PCShellGetName_Shell);CHKERRQ(ierr);
779*be29d3c6SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetApplyRichardson_C","PCShellSetApplyRichardson_Shell",
7804b9ad928SBarry Smith                     PCShellSetApplyRichardson_Shell);CHKERRQ(ierr);
7814b9ad928SBarry Smith   PetscFunctionReturn(0);
7824b9ad928SBarry Smith }
7834b9ad928SBarry Smith EXTERN_C_END
7844b9ad928SBarry Smith 
7854b9ad928SBarry Smith 
7864b9ad928SBarry Smith 
7874b9ad928SBarry Smith 
7884b9ad928SBarry Smith 
7894b9ad928SBarry Smith 
790