xref: /petsc/src/ksp/pc/impls/shell/shellpc.c (revision 7cdd61b21a71b0472b46343462173f441bb92817)
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 {
134b9ad928SBarry Smith   void           *ctx,*ctxrich;    /* user provided contexts for preconditioner */
146849ba73SBarry Smith   PetscErrorCode (*setup)(void*);
156849ba73SBarry Smith   PetscErrorCode (*apply)(void*,Vec,Vec);
16*7cdd61b2SBarry Smith   PetscErrorCode (*presolve)(void*,KSP,Vec,Vec);
17*7cdd61b2SBarry 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__
264b9ad928SBarry Smith #define __FUNCT__ "PCApply_SetUp"
276849ba73SBarry Smith static PetscErrorCode PCSetUp_Shell(PC pc)
284b9ad928SBarry Smith {
294b9ad928SBarry Smith   PC_Shell       *shell;
30dfbe8321SBarry Smith   PetscErrorCode ierr;
314b9ad928SBarry Smith 
324b9ad928SBarry Smith   PetscFunctionBegin;
334b9ad928SBarry Smith   shell = (PC_Shell*)pc->data;
344b9ad928SBarry Smith   if (shell->setup) {
354b9ad928SBarry Smith     ierr  = (*shell->setup)(shell->ctx);CHKERRQ(ierr);
364b9ad928SBarry Smith   }
374b9ad928SBarry Smith   PetscFunctionReturn(0);
384b9ad928SBarry Smith }
394b9ad928SBarry Smith 
404b9ad928SBarry Smith #undef __FUNCT__
414b9ad928SBarry Smith #define __FUNCT__ "PCApply_Shell"
426849ba73SBarry Smith static PetscErrorCode PCApply_Shell(PC pc,Vec x,Vec y)
434b9ad928SBarry Smith {
444b9ad928SBarry Smith   PC_Shell       *shell;
45dfbe8321SBarry Smith   PetscErrorCode ierr;
464b9ad928SBarry Smith 
474b9ad928SBarry Smith   PetscFunctionBegin;
484b9ad928SBarry Smith   shell = (PC_Shell*)pc->data;
491302d50aSBarry Smith   if (!shell->apply) SETERRQ(PETSC_ERR_USER,"No apply() routine provided to Shell PC");
504b9ad928SBarry Smith   ierr  = (*shell->apply)(shell->ctx,x,y);CHKERRQ(ierr);
514b9ad928SBarry Smith   PetscFunctionReturn(0);
524b9ad928SBarry Smith }
534b9ad928SBarry Smith 
544b9ad928SBarry Smith #undef __FUNCT__
55*7cdd61b2SBarry Smith #define __FUNCT__ "PCPreSolve_Shell"
56*7cdd61b2SBarry Smith static PetscErrorCode PCPreSolve_Shell(PC pc,KSP ksp,Vec b,Vec x)
57*7cdd61b2SBarry Smith {
58*7cdd61b2SBarry Smith   PC_Shell       *shell;
59*7cdd61b2SBarry Smith   PetscErrorCode ierr;
60*7cdd61b2SBarry Smith 
61*7cdd61b2SBarry Smith   PetscFunctionBegin;
62*7cdd61b2SBarry Smith   shell = (PC_Shell*)pc->data;
63*7cdd61b2SBarry Smith   if (!shell->apply) SETERRQ(PETSC_ERR_USER,"No presolve() routine provided to Shell PC");
64*7cdd61b2SBarry Smith   ierr  = (*shell->presolve)(shell->ctx,ksp,b,x);CHKERRQ(ierr);
65*7cdd61b2SBarry Smith   PetscFunctionReturn(0);
66*7cdd61b2SBarry Smith }
67*7cdd61b2SBarry Smith 
68*7cdd61b2SBarry Smith #undef __FUNCT__
69*7cdd61b2SBarry Smith #define __FUNCT__ "PCPostSolve_Shell"
70*7cdd61b2SBarry Smith static PetscErrorCode PCPostSolve_Shell(PC pc,KSP ksp,Vec b,Vec x)
71*7cdd61b2SBarry Smith {
72*7cdd61b2SBarry Smith   PC_Shell       *shell;
73*7cdd61b2SBarry Smith   PetscErrorCode ierr;
74*7cdd61b2SBarry Smith 
75*7cdd61b2SBarry Smith   PetscFunctionBegin;
76*7cdd61b2SBarry Smith   shell = (PC_Shell*)pc->data;
77*7cdd61b2SBarry Smith   if (!shell->apply) SETERRQ(PETSC_ERR_USER,"No presolve() routine provided to Shell PC");
78*7cdd61b2SBarry Smith   ierr  = (*shell->presolve)(shell->ctx,ksp,b,x);CHKERRQ(ierr);
79*7cdd61b2SBarry Smith   PetscFunctionReturn(0);
80*7cdd61b2SBarry Smith }
81*7cdd61b2SBarry Smith 
82*7cdd61b2SBarry Smith #undef __FUNCT__
834b9ad928SBarry Smith #define __FUNCT__ "PCApplyTranspose_Shell"
846849ba73SBarry Smith static PetscErrorCode PCApplyTranspose_Shell(PC pc,Vec x,Vec y)
854b9ad928SBarry Smith {
864b9ad928SBarry Smith   PC_Shell       *shell;
87dfbe8321SBarry Smith   PetscErrorCode ierr;
884b9ad928SBarry Smith 
894b9ad928SBarry Smith   PetscFunctionBegin;
904b9ad928SBarry Smith   shell = (PC_Shell*)pc->data;
911302d50aSBarry Smith   if (!shell->applytranspose) SETERRQ(PETSC_ERR_USER,"No applytranspose() routine provided to Shell PC");
924b9ad928SBarry Smith   ierr  = (*shell->applytranspose)(shell->ctx,x,y);CHKERRQ(ierr);
934b9ad928SBarry Smith   PetscFunctionReturn(0);
944b9ad928SBarry Smith }
954b9ad928SBarry Smith 
964b9ad928SBarry Smith #undef __FUNCT__
974b9ad928SBarry Smith #define __FUNCT__ "PCApplyRichardson_Shell"
9813f74950SBarry Smith static PetscErrorCode PCApplyRichardson_Shell(PC pc,Vec x,Vec y,Vec w,PetscReal rtol,PetscReal abstol, PetscReal dtol,PetscInt it)
994b9ad928SBarry Smith {
100dfbe8321SBarry Smith   PetscErrorCode ierr;
1014b9ad928SBarry Smith   PC_Shell       *shell;
1024b9ad928SBarry Smith 
1034b9ad928SBarry Smith   PetscFunctionBegin;
1044b9ad928SBarry Smith   shell = (PC_Shell*)pc->data;
10570441072SBarry Smith   ierr  = (*shell->applyrich)(shell->ctxrich,x,y,w,rtol,abstol,dtol,it);CHKERRQ(ierr);
1064b9ad928SBarry Smith   PetscFunctionReturn(0);
1074b9ad928SBarry Smith }
1084b9ad928SBarry Smith 
1094b9ad928SBarry Smith #undef __FUNCT__
1104b9ad928SBarry Smith #define __FUNCT__ "PCDestroy_Shell"
1116849ba73SBarry Smith static PetscErrorCode PCDestroy_Shell(PC pc)
1124b9ad928SBarry Smith {
1134b9ad928SBarry Smith   PC_Shell       *shell = (PC_Shell*)pc->data;
114dfbe8321SBarry Smith   PetscErrorCode ierr;
1154b9ad928SBarry Smith 
1164b9ad928SBarry Smith   PetscFunctionBegin;
1174b9ad928SBarry Smith   if (shell->name) {ierr = PetscFree(shell->name);}
1184b9ad928SBarry Smith   ierr = PetscFree(shell);CHKERRQ(ierr);
1194b9ad928SBarry Smith   PetscFunctionReturn(0);
1204b9ad928SBarry Smith }
1214b9ad928SBarry Smith 
1224b9ad928SBarry Smith #undef __FUNCT__
1234b9ad928SBarry Smith #define __FUNCT__ "PCView_Shell"
1246849ba73SBarry Smith static PetscErrorCode PCView_Shell(PC pc,PetscViewer viewer)
1254b9ad928SBarry Smith {
1264b9ad928SBarry Smith   PC_Shell       *shell = (PC_Shell*)pc->data;
127dfbe8321SBarry Smith   PetscErrorCode ierr;
12832077d6dSBarry Smith   PetscTruth     iascii;
1294b9ad928SBarry Smith 
1304b9ad928SBarry Smith   PetscFunctionBegin;
13132077d6dSBarry Smith   ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_ASCII,&iascii);CHKERRQ(ierr);
13232077d6dSBarry Smith   if (iascii) {
1334b9ad928SBarry Smith     if (shell->name) {ierr = PetscViewerASCIIPrintf(viewer,"  Shell: %s\n",shell->name);CHKERRQ(ierr);}
1344b9ad928SBarry Smith     else             {ierr = PetscViewerASCIIPrintf(viewer,"  Shell: no name\n");CHKERRQ(ierr);}
1354b9ad928SBarry Smith   }
1364b9ad928SBarry Smith   if (shell->view) {
1374b9ad928SBarry Smith     ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
1384b9ad928SBarry Smith     ierr  = (*shell->view)(shell->ctx,viewer);CHKERRQ(ierr);
1394b9ad928SBarry Smith     ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
1404b9ad928SBarry Smith   }
1414b9ad928SBarry Smith   PetscFunctionReturn(0);
1424b9ad928SBarry Smith }
1434b9ad928SBarry Smith 
1444b9ad928SBarry Smith /* ------------------------------------------------------------------------------*/
1454b9ad928SBarry Smith EXTERN_C_BEGIN
1464b9ad928SBarry Smith #undef __FUNCT__
1474b9ad928SBarry Smith #define __FUNCT__ "PCShellSetSetUp_Shell"
148dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetSetUp_Shell(PC pc, PetscErrorCode (*setup)(void*))
1494b9ad928SBarry Smith {
1504b9ad928SBarry Smith   PC_Shell *shell;
1514b9ad928SBarry Smith 
1524b9ad928SBarry Smith   PetscFunctionBegin;
1534b9ad928SBarry Smith   shell        = (PC_Shell*)pc->data;
1544b9ad928SBarry Smith   shell->setup = setup;
1554b9ad928SBarry Smith   PetscFunctionReturn(0);
1564b9ad928SBarry Smith }
1574b9ad928SBarry Smith EXTERN_C_END
1584b9ad928SBarry Smith 
1594b9ad928SBarry Smith EXTERN_C_BEGIN
1604b9ad928SBarry Smith #undef __FUNCT__
1614b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApply_Shell"
162dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApply_Shell(PC pc,PetscErrorCode (*apply)(void*,Vec,Vec),void *ptr)
1634b9ad928SBarry Smith {
1644b9ad928SBarry Smith   PC_Shell *shell;
1654b9ad928SBarry Smith 
1664b9ad928SBarry Smith   PetscFunctionBegin;
1674b9ad928SBarry Smith   shell        = (PC_Shell*)pc->data;
1684b9ad928SBarry Smith   shell->apply = apply;
1694b9ad928SBarry Smith   shell->ctx   = ptr;
1704b9ad928SBarry Smith   PetscFunctionReturn(0);
1714b9ad928SBarry Smith }
1724b9ad928SBarry Smith EXTERN_C_END
1734b9ad928SBarry Smith 
1744b9ad928SBarry Smith EXTERN_C_BEGIN
1754b9ad928SBarry Smith #undef __FUNCT__
176*7cdd61b2SBarry Smith #define __FUNCT__ "PCShellSetPreSolve_Shell"
177*7cdd61b2SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetPreSolve_Shell(PC pc,PetscErrorCode (*presolve)(void*,KSP,Vec,Vec),void *ptr)
178*7cdd61b2SBarry Smith {
179*7cdd61b2SBarry Smith   PC_Shell *shell;
180*7cdd61b2SBarry Smith 
181*7cdd61b2SBarry Smith   PetscFunctionBegin;
182*7cdd61b2SBarry Smith   shell           = (PC_Shell*)pc->data;
183*7cdd61b2SBarry Smith   shell->presolve = presolve;
184*7cdd61b2SBarry Smith   PetscFunctionReturn(0);
185*7cdd61b2SBarry Smith }
186*7cdd61b2SBarry Smith EXTERN_C_END
187*7cdd61b2SBarry Smith 
188*7cdd61b2SBarry Smith EXTERN_C_BEGIN
189*7cdd61b2SBarry Smith #undef __FUNCT__
190*7cdd61b2SBarry Smith #define __FUNCT__ "PCShellSetPostSolve_Shell"
191*7cdd61b2SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetPostSolve_Shell(PC pc,PetscErrorCode (*postsolve)(void*,KSP,Vec,Vec),void *ptr)
192*7cdd61b2SBarry Smith {
193*7cdd61b2SBarry Smith   PC_Shell *shell;
194*7cdd61b2SBarry Smith 
195*7cdd61b2SBarry Smith   PetscFunctionBegin;
196*7cdd61b2SBarry Smith   shell           = (PC_Shell*)pc->data;
197*7cdd61b2SBarry Smith   shell->postsolve = postsolve;
198*7cdd61b2SBarry Smith   PetscFunctionReturn(0);
199*7cdd61b2SBarry Smith }
200*7cdd61b2SBarry Smith EXTERN_C_END
201*7cdd61b2SBarry Smith 
202*7cdd61b2SBarry Smith EXTERN_C_BEGIN
203*7cdd61b2SBarry Smith #undef __FUNCT__
2044b9ad928SBarry Smith #define __FUNCT__ "PCShellSetView_Shell"
205dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetView_Shell(PC pc,PetscErrorCode (*view)(void*,PetscViewer))
2064b9ad928SBarry Smith {
2074b9ad928SBarry Smith   PC_Shell *shell;
2084b9ad928SBarry Smith 
2094b9ad928SBarry Smith   PetscFunctionBegin;
2104b9ad928SBarry Smith   shell        = (PC_Shell*)pc->data;
2114b9ad928SBarry Smith   shell->view = view;
2124b9ad928SBarry Smith   PetscFunctionReturn(0);
2134b9ad928SBarry Smith }
2144b9ad928SBarry Smith EXTERN_C_END
2154b9ad928SBarry Smith 
2164b9ad928SBarry Smith EXTERN_C_BEGIN
2174b9ad928SBarry Smith #undef __FUNCT__
2184b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApplyTranspose_Shell"
219dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApplyTranspose_Shell(PC pc,PetscErrorCode (*applytranspose)(void*,Vec,Vec))
2204b9ad928SBarry Smith {
2214b9ad928SBarry Smith   PC_Shell *shell;
2224b9ad928SBarry Smith 
2234b9ad928SBarry Smith   PetscFunctionBegin;
2244b9ad928SBarry Smith   shell                 = (PC_Shell*)pc->data;
2254b9ad928SBarry Smith   shell->applytranspose = applytranspose;
2264b9ad928SBarry Smith   PetscFunctionReturn(0);
2274b9ad928SBarry Smith }
2284b9ad928SBarry Smith EXTERN_C_END
2294b9ad928SBarry Smith 
2304b9ad928SBarry Smith EXTERN_C_BEGIN
2314b9ad928SBarry Smith #undef __FUNCT__
2324b9ad928SBarry Smith #define __FUNCT__ "PCShellSetName_Shell"
233dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetName_Shell(PC pc,const char name[])
2344b9ad928SBarry Smith {
2354b9ad928SBarry Smith   PC_Shell       *shell;
236dfbe8321SBarry Smith   PetscErrorCode ierr;
2374b9ad928SBarry Smith 
2384b9ad928SBarry Smith   PetscFunctionBegin;
2394b9ad928SBarry Smith   shell = (PC_Shell*)pc->data;
2404b9ad928SBarry Smith   ierr  = PetscStrallocpy(name,&shell->name);CHKERRQ(ierr);
2414b9ad928SBarry Smith   PetscFunctionReturn(0);
2424b9ad928SBarry Smith }
2434b9ad928SBarry Smith EXTERN_C_END
2444b9ad928SBarry Smith 
2454b9ad928SBarry Smith EXTERN_C_BEGIN
2464b9ad928SBarry Smith #undef __FUNCT__
2474b9ad928SBarry Smith #define __FUNCT__ "PCShellGetName_Shell"
248dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellGetName_Shell(PC pc,char *name[])
2494b9ad928SBarry Smith {
2504b9ad928SBarry Smith   PC_Shell *shell;
2514b9ad928SBarry Smith 
2524b9ad928SBarry Smith   PetscFunctionBegin;
2534b9ad928SBarry Smith   shell  = (PC_Shell*)pc->data;
2544b9ad928SBarry Smith   *name  = shell->name;
2554b9ad928SBarry Smith   PetscFunctionReturn(0);
2564b9ad928SBarry Smith }
2574b9ad928SBarry Smith EXTERN_C_END
2584b9ad928SBarry Smith 
2594b9ad928SBarry Smith EXTERN_C_BEGIN
2604b9ad928SBarry Smith #undef __FUNCT__
2614b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApplyRichardson_Shell"
262dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApplyRichardson_Shell(PC pc,PetscErrorCode (*apply)(void*,Vec,Vec,Vec,PetscReal,PetscReal,PetscReal,PetscInt),void *ptr)
2634b9ad928SBarry Smith {
2644b9ad928SBarry Smith   PC_Shell *shell;
2654b9ad928SBarry Smith 
2664b9ad928SBarry Smith   PetscFunctionBegin;
2674b9ad928SBarry Smith   shell                     = (PC_Shell*)pc->data;
2684b9ad928SBarry Smith   pc->ops->applyrichardson  = PCApplyRichardson_Shell;
2694b9ad928SBarry Smith   shell->applyrich          = apply;
2704b9ad928SBarry Smith   shell->ctxrich            = ptr;
2714b9ad928SBarry Smith   PetscFunctionReturn(0);
2724b9ad928SBarry Smith }
2734b9ad928SBarry Smith EXTERN_C_END
2744b9ad928SBarry Smith 
2754b9ad928SBarry Smith /* -------------------------------------------------------------------------------*/
2764b9ad928SBarry Smith 
2774b9ad928SBarry Smith #undef __FUNCT__
2784b9ad928SBarry Smith #define __FUNCT__ "PCShellSetSetUp"
2794b9ad928SBarry Smith /*@C
2804b9ad928SBarry Smith    PCShellSetSetUp - Sets routine to use to "setup" the preconditioner whenever the
2814b9ad928SBarry Smith    matrix operator is changed.
2824b9ad928SBarry Smith 
2834b9ad928SBarry Smith    Collective on PC
2844b9ad928SBarry Smith 
2854b9ad928SBarry Smith    Input Parameters:
2864b9ad928SBarry Smith +  pc - the preconditioner context
2874b9ad928SBarry Smith .  setup - the application-provided setup routine
2884b9ad928SBarry Smith 
2894b9ad928SBarry Smith    Calling sequence of setup:
2904b9ad928SBarry Smith .vb
29113f74950SBarry Smith    PetscErrorCode setup (void *ptr)
2924b9ad928SBarry Smith .ve
2934b9ad928SBarry Smith 
2944b9ad928SBarry Smith .  ptr - the application context
2954b9ad928SBarry Smith 
2964b9ad928SBarry Smith    Level: developer
2974b9ad928SBarry Smith 
2984b9ad928SBarry Smith .keywords: PC, shell, set, setup, user-provided
2994b9ad928SBarry Smith 
3004b9ad928SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetApply()
3014b9ad928SBarry Smith @*/
302dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetSetUp(PC pc,PetscErrorCode (*setup)(void*))
3034b9ad928SBarry Smith {
3046849ba73SBarry Smith   PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*));
3054b9ad928SBarry Smith 
3064b9ad928SBarry Smith   PetscFunctionBegin;
3074482741eSBarry Smith   PetscValidHeaderSpecific(pc,PC_COOKIE,1);
3084b9ad928SBarry Smith   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetSetUp_C",(void (**)(void))&f);CHKERRQ(ierr);
3094b9ad928SBarry Smith   if (f) {
3104b9ad928SBarry Smith     ierr = (*f)(pc,setup);CHKERRQ(ierr);
3114b9ad928SBarry Smith   }
3124b9ad928SBarry Smith   PetscFunctionReturn(0);
3134b9ad928SBarry Smith }
3144b9ad928SBarry Smith 
3154b9ad928SBarry Smith 
3164b9ad928SBarry Smith #undef __FUNCT__
3174b9ad928SBarry Smith #define __FUNCT__ "PCShellSetView"
3184b9ad928SBarry Smith /*@C
3194b9ad928SBarry Smith    PCShellSetView - Sets routine to use as viewer of shell preconditioner
3204b9ad928SBarry Smith 
3214b9ad928SBarry Smith    Collective on PC
3224b9ad928SBarry Smith 
3234b9ad928SBarry Smith    Input Parameters:
3244b9ad928SBarry Smith +  pc - the preconditioner context
3254b9ad928SBarry Smith -  view - the application-provided view routine
3264b9ad928SBarry Smith 
3274b9ad928SBarry Smith    Calling sequence of apply:
3284b9ad928SBarry Smith .vb
32913f74950SBarry Smith    PetscErrorCode view(void *ptr,PetscViewer v)
3304b9ad928SBarry Smith .ve
3314b9ad928SBarry Smith 
3324b9ad928SBarry Smith +  ptr - the application context
3334b9ad928SBarry Smith -  v   - viewer
3344b9ad928SBarry Smith 
3354b9ad928SBarry Smith    Level: developer
3364b9ad928SBarry Smith 
3374b9ad928SBarry Smith .keywords: PC, shell, set, apply, user-provided
3384b9ad928SBarry Smith 
3394b9ad928SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose()
3404b9ad928SBarry Smith @*/
341dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetView(PC pc,PetscErrorCode (*view)(void*,PetscViewer))
3424b9ad928SBarry Smith {
3436849ba73SBarry Smith   PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*,PetscViewer));
3444b9ad928SBarry Smith 
3454b9ad928SBarry Smith   PetscFunctionBegin;
3464482741eSBarry Smith   PetscValidHeaderSpecific(pc,PC_COOKIE,1);
3474b9ad928SBarry Smith   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetView_C",(void (**)(void))&f);CHKERRQ(ierr);
3484b9ad928SBarry Smith   if (f) {
3494b9ad928SBarry Smith     ierr = (*f)(pc,view);CHKERRQ(ierr);
3504b9ad928SBarry Smith   }
3514b9ad928SBarry Smith   PetscFunctionReturn(0);
3524b9ad928SBarry Smith }
3534b9ad928SBarry Smith 
3544b9ad928SBarry Smith #undef __FUNCT__
3554b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApply"
3564b9ad928SBarry Smith /*@C
3574b9ad928SBarry Smith    PCShellSetApply - Sets routine to use as preconditioner.
3584b9ad928SBarry Smith 
3594b9ad928SBarry Smith    Collective on PC
3604b9ad928SBarry Smith 
3614b9ad928SBarry Smith    Input Parameters:
3624b9ad928SBarry Smith +  pc - the preconditioner context
3634b9ad928SBarry Smith .  apply - the application-provided preconditioning routine
3644b9ad928SBarry Smith -  ptr - pointer to data needed by this routine
3654b9ad928SBarry Smith 
3664b9ad928SBarry Smith    Calling sequence of apply:
3674b9ad928SBarry Smith .vb
36813f74950SBarry Smith    PetscErrorCode apply (void *ptr,Vec xin,Vec xout)
3694b9ad928SBarry Smith .ve
3704b9ad928SBarry Smith 
3714b9ad928SBarry Smith +  ptr - the application context
3724b9ad928SBarry Smith .  xin - input vector
3734b9ad928SBarry Smith -  xout - output vector
3744b9ad928SBarry Smith 
3754b9ad928SBarry Smith    Level: developer
3764b9ad928SBarry Smith 
3774b9ad928SBarry Smith .keywords: PC, shell, set, apply, user-provided
3784b9ad928SBarry Smith 
3794b9ad928SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose()
3804b9ad928SBarry Smith @*/
381dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApply(PC pc,PetscErrorCode (*apply)(void*,Vec,Vec),void *ptr)
3824b9ad928SBarry Smith {
3836849ba73SBarry Smith   PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*,Vec,Vec),void *);
3844b9ad928SBarry Smith 
3854b9ad928SBarry Smith   PetscFunctionBegin;
3864482741eSBarry Smith   PetscValidHeaderSpecific(pc,PC_COOKIE,1);
3874b9ad928SBarry Smith   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetApply_C",(void (**)(void))&f);CHKERRQ(ierr);
3884b9ad928SBarry Smith   if (f) {
3894b9ad928SBarry Smith     ierr = (*f)(pc,apply,ptr);CHKERRQ(ierr);
3904b9ad928SBarry Smith   }
3914b9ad928SBarry Smith   PetscFunctionReturn(0);
3924b9ad928SBarry Smith }
3934b9ad928SBarry Smith 
3944b9ad928SBarry Smith #undef __FUNCT__
3954b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApplyTranspose"
3964b9ad928SBarry Smith /*@C
3974b9ad928SBarry Smith    PCShellSetApplyTranspose - Sets routine to use as preconditioner transpose.
3984b9ad928SBarry Smith 
3994b9ad928SBarry Smith    Collective on PC
4004b9ad928SBarry Smith 
4014b9ad928SBarry Smith    Input Parameters:
4024b9ad928SBarry Smith +  pc - the preconditioner context
4034b9ad928SBarry Smith -  apply - the application-provided preconditioning transpose routine
4044b9ad928SBarry Smith 
4054b9ad928SBarry Smith    Calling sequence of apply:
4064b9ad928SBarry Smith .vb
40713f74950SBarry Smith    PetscErrorCode applytranspose (void *ptr,Vec xin,Vec xout)
4084b9ad928SBarry Smith .ve
4094b9ad928SBarry Smith 
4104b9ad928SBarry Smith +  ptr - the application context
4114b9ad928SBarry Smith .  xin - input vector
4124b9ad928SBarry Smith -  xout - output vector
4134b9ad928SBarry Smith 
4144b9ad928SBarry Smith    Level: developer
4154b9ad928SBarry Smith 
4164b9ad928SBarry Smith    Notes:
4174b9ad928SBarry Smith    Uses the same context variable as PCShellSetApply().
4184b9ad928SBarry Smith 
4194b9ad928SBarry Smith .keywords: PC, shell, set, apply, user-provided
4204b9ad928SBarry Smith 
4214b9ad928SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApply()
4224b9ad928SBarry Smith @*/
423dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApplyTranspose(PC pc,PetscErrorCode (*applytranspose)(void*,Vec,Vec))
4244b9ad928SBarry Smith {
4256849ba73SBarry Smith   PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*,Vec,Vec));
4264b9ad928SBarry Smith 
4274b9ad928SBarry Smith   PetscFunctionBegin;
4284482741eSBarry Smith   PetscValidHeaderSpecific(pc,PC_COOKIE,1);
4294b9ad928SBarry Smith   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetApplyTranspose_C",(void (**)(void))&f);CHKERRQ(ierr);
4304b9ad928SBarry Smith   if (f) {
4314b9ad928SBarry Smith     ierr = (*f)(pc,applytranspose);CHKERRQ(ierr);
4324b9ad928SBarry Smith   }
4334b9ad928SBarry Smith   PetscFunctionReturn(0);
4344b9ad928SBarry Smith }
4354b9ad928SBarry Smith 
4364b9ad928SBarry Smith #undef __FUNCT__
437*7cdd61b2SBarry Smith #define __FUNCT__ "PCShellSetPreSolve"
438*7cdd61b2SBarry Smith /*@C
439*7cdd61b2SBarry Smith    PCShellSetPreSolve - Sets routine to apply to the operators/vectors before a KSPSolve() is
440*7cdd61b2SBarry Smith       applied. This usually does something like scale the linear system in some application
441*7cdd61b2SBarry Smith       specific way.
442*7cdd61b2SBarry Smith 
443*7cdd61b2SBarry Smith    Collective on PC
444*7cdd61b2SBarry Smith 
445*7cdd61b2SBarry Smith    Input Parameters:
446*7cdd61b2SBarry Smith +  pc - the preconditioner context
447*7cdd61b2SBarry Smith -  presolve - the application-provided presolve routine
448*7cdd61b2SBarry Smith 
449*7cdd61b2SBarry Smith    Calling sequence of presolve:
450*7cdd61b2SBarry Smith .vb
451*7cdd61b2SBarry Smith    PetscErrorCode presolve (void *ptr,KSP ksp,Vec b,Vec x)
452*7cdd61b2SBarry Smith .ve
453*7cdd61b2SBarry Smith 
454*7cdd61b2SBarry Smith +  ptr - the application context
455*7cdd61b2SBarry Smith .  xin - input vector
456*7cdd61b2SBarry Smith -  xout - output vector
457*7cdd61b2SBarry Smith 
458*7cdd61b2SBarry Smith    Level: developer
459*7cdd61b2SBarry Smith 
460*7cdd61b2SBarry Smith .keywords: PC, shell, set, apply, user-provided
461*7cdd61b2SBarry Smith 
462*7cdd61b2SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose(), PCShellSetPostSolve()
463*7cdd61b2SBarry Smith @*/
464*7cdd61b2SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetPreSolve(PC pc,PetscErrorCode (*presolve)(void*,KSP,Vec,Vec))
465*7cdd61b2SBarry Smith {
466*7cdd61b2SBarry Smith   PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*,KSP,Vec,Vec));
467*7cdd61b2SBarry Smith 
468*7cdd61b2SBarry Smith   PetscFunctionBegin;
469*7cdd61b2SBarry Smith   PetscValidHeaderSpecific(pc,PC_COOKIE,1);
470*7cdd61b2SBarry Smith   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetPreSolve_C",(void (**)(void))&f);CHKERRQ(ierr);
471*7cdd61b2SBarry Smith   if (f) {
472*7cdd61b2SBarry Smith     ierr = (*f)(pc,presolve);CHKERRQ(ierr);
473*7cdd61b2SBarry Smith   }
474*7cdd61b2SBarry Smith   PetscFunctionReturn(0);
475*7cdd61b2SBarry Smith }
476*7cdd61b2SBarry Smith 
477*7cdd61b2SBarry Smith #undef __FUNCT__
478*7cdd61b2SBarry Smith #define __FUNCT__ "PCShellSetPostSolve"
479*7cdd61b2SBarry Smith /*@C
480*7cdd61b2SBarry Smith    PCShellSetPostSolve - Sets routine to apply to the operators/vectors before a KSPSolve() is
481*7cdd61b2SBarry Smith       applied. This usually does something like scale the linear system in some application
482*7cdd61b2SBarry Smith       specific way.
483*7cdd61b2SBarry Smith 
484*7cdd61b2SBarry Smith    Collective on PC
485*7cdd61b2SBarry Smith 
486*7cdd61b2SBarry Smith    Input Parameters:
487*7cdd61b2SBarry Smith +  pc - the preconditioner context
488*7cdd61b2SBarry Smith -  postsolve - the application-provided presolve routine
489*7cdd61b2SBarry Smith 
490*7cdd61b2SBarry Smith    Calling sequence of postsolve:
491*7cdd61b2SBarry Smith .vb
492*7cdd61b2SBarry Smith    PetscErrorCode postsolve(void *ptr,KSP ksp,Vec b,Vec x)
493*7cdd61b2SBarry Smith .ve
494*7cdd61b2SBarry Smith 
495*7cdd61b2SBarry Smith +  ptr - the application context
496*7cdd61b2SBarry Smith .  xin - input vector
497*7cdd61b2SBarry Smith -  xout - output vector
498*7cdd61b2SBarry Smith 
499*7cdd61b2SBarry Smith    Level: developer
500*7cdd61b2SBarry Smith 
501*7cdd61b2SBarry Smith .keywords: PC, shell, set, apply, user-provided
502*7cdd61b2SBarry Smith 
503*7cdd61b2SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose(), PCShellSetPreSolve()
504*7cdd61b2SBarry Smith @*/
505*7cdd61b2SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetPostSolve(PC pc,PetscErrorCode (*postsolve)(void*,KSP,Vec,Vec))
506*7cdd61b2SBarry Smith {
507*7cdd61b2SBarry Smith   PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*,KSP,Vec,Vec));
508*7cdd61b2SBarry Smith 
509*7cdd61b2SBarry Smith   PetscFunctionBegin;
510*7cdd61b2SBarry Smith   PetscValidHeaderSpecific(pc,PC_COOKIE,1);
511*7cdd61b2SBarry Smith   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetPostSolve_C",(void (**)(void))&f);CHKERRQ(ierr);
512*7cdd61b2SBarry Smith   if (f) {
513*7cdd61b2SBarry Smith     ierr = (*f)(pc,postsolve);CHKERRQ(ierr);
514*7cdd61b2SBarry Smith   }
515*7cdd61b2SBarry Smith   PetscFunctionReturn(0);
516*7cdd61b2SBarry Smith }
517*7cdd61b2SBarry Smith 
518*7cdd61b2SBarry Smith #undef __FUNCT__
5194b9ad928SBarry Smith #define __FUNCT__ "PCShellSetName"
5204b9ad928SBarry Smith /*@C
5214b9ad928SBarry Smith    PCShellSetName - Sets an optional name to associate with a shell
5224b9ad928SBarry Smith    preconditioner.
5234b9ad928SBarry Smith 
5244b9ad928SBarry Smith    Not Collective
5254b9ad928SBarry Smith 
5264b9ad928SBarry Smith    Input Parameters:
5274b9ad928SBarry Smith +  pc - the preconditioner context
5284b9ad928SBarry Smith -  name - character string describing shell preconditioner
5294b9ad928SBarry Smith 
5304b9ad928SBarry Smith    Level: developer
5314b9ad928SBarry Smith 
5324b9ad928SBarry Smith .keywords: PC, shell, set, name, user-provided
5334b9ad928SBarry Smith 
5344b9ad928SBarry Smith .seealso: PCShellGetName()
5354b9ad928SBarry Smith @*/
536dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetName(PC pc,const char name[])
5374b9ad928SBarry Smith {
538dfbe8321SBarry Smith   PetscErrorCode ierr,(*f)(PC,const char []);
5394b9ad928SBarry Smith 
5404b9ad928SBarry Smith   PetscFunctionBegin;
5414482741eSBarry Smith   PetscValidHeaderSpecific(pc,PC_COOKIE,1);
5424b9ad928SBarry Smith   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetName_C",(void (**)(void))&f);CHKERRQ(ierr);
5434b9ad928SBarry Smith   if (f) {
5444b9ad928SBarry Smith     ierr = (*f)(pc,name);CHKERRQ(ierr);
5454b9ad928SBarry Smith   }
5464b9ad928SBarry Smith   PetscFunctionReturn(0);
5474b9ad928SBarry Smith }
5484b9ad928SBarry Smith 
5494b9ad928SBarry Smith #undef __FUNCT__
5504b9ad928SBarry Smith #define __FUNCT__ "PCShellGetName"
5514b9ad928SBarry Smith /*@C
5524b9ad928SBarry Smith    PCShellGetName - Gets an optional name that the user has set for a shell
5534b9ad928SBarry Smith    preconditioner.
5544b9ad928SBarry Smith 
5554b9ad928SBarry Smith    Not Collective
5564b9ad928SBarry Smith 
5574b9ad928SBarry Smith    Input Parameter:
5584b9ad928SBarry Smith .  pc - the preconditioner context
5594b9ad928SBarry Smith 
5604b9ad928SBarry Smith    Output Parameter:
5614b9ad928SBarry Smith .  name - character string describing shell preconditioner (you should not free this)
5624b9ad928SBarry Smith 
5634b9ad928SBarry Smith    Level: developer
5644b9ad928SBarry Smith 
5654b9ad928SBarry Smith .keywords: PC, shell, get, name, user-provided
5664b9ad928SBarry Smith 
5674b9ad928SBarry Smith .seealso: PCShellSetName()
5684b9ad928SBarry Smith @*/
569dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellGetName(PC pc,char *name[])
5704b9ad928SBarry Smith {
571dfbe8321SBarry Smith   PetscErrorCode ierr,(*f)(PC,char *[]);
5724b9ad928SBarry Smith 
5734b9ad928SBarry Smith   PetscFunctionBegin;
5744482741eSBarry Smith   PetscValidHeaderSpecific(pc,PC_COOKIE,1);
5754482741eSBarry Smith   PetscValidPointer(name,2);
5764b9ad928SBarry Smith   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellGetName_C",(void (**)(void))&f);CHKERRQ(ierr);
5774b9ad928SBarry Smith   if (f) {
5784b9ad928SBarry Smith     ierr = (*f)(pc,name);CHKERRQ(ierr);
5794b9ad928SBarry Smith   } else {
5801302d50aSBarry Smith     SETERRQ(PETSC_ERR_ARG_WRONG,"Not shell preconditioner, cannot get name");
5814b9ad928SBarry Smith   }
5824b9ad928SBarry Smith   PetscFunctionReturn(0);
5834b9ad928SBarry Smith }
5844b9ad928SBarry Smith 
5854b9ad928SBarry Smith #undef __FUNCT__
5864b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApplyRichardson"
5874b9ad928SBarry Smith /*@C
5884b9ad928SBarry Smith    PCShellSetApplyRichardson - Sets routine to use as preconditioner
5894b9ad928SBarry Smith    in Richardson iteration.
5904b9ad928SBarry Smith 
5914b9ad928SBarry Smith    Collective on PC
5924b9ad928SBarry Smith 
5934b9ad928SBarry Smith    Input Parameters:
5944b9ad928SBarry Smith +  pc - the preconditioner context
5954b9ad928SBarry Smith .  apply - the application-provided preconditioning routine
5964b9ad928SBarry Smith -  ptr - pointer to data needed by this routine
5974b9ad928SBarry Smith 
5984b9ad928SBarry Smith    Calling sequence of apply:
5994b9ad928SBarry Smith .vb
60013f74950SBarry Smith    PetscErrorCode apply (void *ptr,Vec b,Vec x,Vec r,PetscReal rtol,PetscReal abstol,PetscReal dtol,PetscInt maxits)
6014b9ad928SBarry Smith .ve
6024b9ad928SBarry Smith 
6034b9ad928SBarry Smith +  ptr - the application context
6044b9ad928SBarry Smith .  b - right-hand-side
6054b9ad928SBarry Smith .  x - current iterate
6064b9ad928SBarry Smith .  r - work space
6074b9ad928SBarry Smith .  rtol - relative tolerance of residual norm to stop at
60870441072SBarry Smith .  abstol - absolute tolerance of residual norm to stop at
6094b9ad928SBarry Smith .  dtol - if residual norm increases by this factor than return
6104b9ad928SBarry Smith -  maxits - number of iterations to run
6114b9ad928SBarry Smith 
6124b9ad928SBarry Smith    Level: developer
6134b9ad928SBarry Smith 
6144b9ad928SBarry Smith .keywords: PC, shell, set, apply, Richardson, user-provided
6154b9ad928SBarry Smith 
6164b9ad928SBarry Smith .seealso: PCShellSetApply()
6174b9ad928SBarry Smith @*/
618dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApplyRichardson(PC pc,PetscErrorCode (*apply)(void*,Vec,Vec,Vec,PetscReal,PetscReal,PetscReal,PetscInt),void *ptr)
6194b9ad928SBarry Smith {
62013f74950SBarry Smith   PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*,Vec,Vec,Vec,PetscReal,PetscReal,PetscReal,PetscInt),void *);
6214b9ad928SBarry Smith 
6224b9ad928SBarry Smith   PetscFunctionBegin;
6234482741eSBarry Smith   PetscValidHeaderSpecific(pc,PC_COOKIE,1);
6244b9ad928SBarry Smith   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetApplyRichardson_C",(void (**)(void))&f);CHKERRQ(ierr);
6254b9ad928SBarry Smith   if (f) {
6264b9ad928SBarry Smith     ierr = (*f)(pc,apply,ptr);CHKERRQ(ierr);
6274b9ad928SBarry Smith   }
6284b9ad928SBarry Smith   PetscFunctionReturn(0);
6294b9ad928SBarry Smith }
6304b9ad928SBarry Smith 
6314b9ad928SBarry Smith /*MC
6324b9ad928SBarry Smith    PCSHELL - Creates a new preconditioner class for use with your
6334b9ad928SBarry Smith               own private data storage format.
6344b9ad928SBarry Smith 
6354b9ad928SBarry Smith    Level: advanced
6364b9ad928SBarry Smith 
6374b9ad928SBarry Smith    Concepts: providing your own preconditioner
6384b9ad928SBarry Smith 
6394b9ad928SBarry Smith   Usage:
6406849ba73SBarry Smith $             PetscErrorCode (*mult)(void*,Vec,Vec);
6416849ba73SBarry Smith $             PetscErrorCode (*setup)(void*);
6424b9ad928SBarry Smith $             PCCreate(comm,&pc);
6434b9ad928SBarry Smith $             PCSetType(pc,PCSHELL);
6444b9ad928SBarry Smith $             PCShellSetApply(pc,mult,ctx);
6454b9ad928SBarry Smith $             PCShellSetSetUp(pc,setup);       (optional)
6464b9ad928SBarry Smith 
6474b9ad928SBarry Smith .seealso:  PCCreate(), PCSetType(), PCType (for list of available types), PC,
648d07a9264SSatish Balay            MATSHELL, PCShellSetUp(), PCShellSetApply(), PCShellSetView(),
6494b9ad928SBarry Smith            PCShellSetApplyTranpose(), PCShellSetName(), PCShellSetApplyRichardson(),
6504b9ad928SBarry Smith            PCShellGetName()
6514b9ad928SBarry Smith M*/
6524b9ad928SBarry Smith 
6534b9ad928SBarry Smith EXTERN_C_BEGIN
6544b9ad928SBarry Smith #undef __FUNCT__
6554b9ad928SBarry Smith #define __FUNCT__ "PCCreate_Shell"
656dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCCreate_Shell(PC pc)
6574b9ad928SBarry Smith {
658dfbe8321SBarry Smith   PetscErrorCode ierr;
6594b9ad928SBarry Smith   PC_Shell       *shell;
6604b9ad928SBarry Smith 
6614b9ad928SBarry Smith   PetscFunctionBegin;
6624b9ad928SBarry Smith   pc->ops->destroy    = PCDestroy_Shell;
6634b9ad928SBarry Smith   ierr                = PetscNew(PC_Shell,&shell);CHKERRQ(ierr);
66452e6d16bSBarry Smith   ierr = PetscLogObjectMemory(pc,sizeof(PC_Shell));CHKERRQ(ierr);
6654b9ad928SBarry Smith   pc->data         = (void*)shell;
6664b9ad928SBarry Smith   pc->name         = 0;
6674b9ad928SBarry Smith 
6684b9ad928SBarry Smith   pc->ops->apply           = PCApply_Shell;
6694b9ad928SBarry Smith   pc->ops->view            = PCView_Shell;
6704b9ad928SBarry Smith   pc->ops->applytranspose  = PCApplyTranspose_Shell;
6714b9ad928SBarry Smith   pc->ops->applyrichardson = 0;
6724b9ad928SBarry Smith   pc->ops->setup           = PCSetUp_Shell;
673*7cdd61b2SBarry Smith   pc->ops->presolve        = PCPreSolve_Shell;
674*7cdd61b2SBarry Smith   pc->ops->postsolve       = PCPostSolve_Shell;
6754b9ad928SBarry Smith   pc->ops->view            = PCView_Shell;
6764b9ad928SBarry Smith 
6774b9ad928SBarry Smith   shell->apply          = 0;
6784b9ad928SBarry Smith   shell->applytranspose = 0;
6794b9ad928SBarry Smith   shell->name           = 0;
6804b9ad928SBarry Smith   shell->applyrich      = 0;
681*7cdd61b2SBarry Smith   shell->presolve       = 0;
682*7cdd61b2SBarry Smith   shell->postsolve      = 0;
6834b9ad928SBarry Smith   shell->ctxrich        = 0;
6844b9ad928SBarry Smith   shell->ctx            = 0;
6854b9ad928SBarry Smith   shell->setup          = 0;
6864b9ad928SBarry Smith   shell->view           = 0;
6874b9ad928SBarry Smith 
6884b9ad928SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetSetUp_C","PCShellSetSetUp_Shell",
6894b9ad928SBarry Smith                     PCShellSetSetUp_Shell);CHKERRQ(ierr);
6904b9ad928SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetApply_C","PCShellSetApply_Shell",
6914b9ad928SBarry Smith                     PCShellSetApply_Shell);CHKERRQ(ierr);
692*7cdd61b2SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetPreSolve_C","PCShellSetPreSolve_Shell",
693*7cdd61b2SBarry Smith                     PCShellSetPreSolve_Shell);CHKERRQ(ierr);
694*7cdd61b2SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetPostSolve_C","PCShellSetPostSolve_Shell",
695*7cdd61b2SBarry Smith                     PCShellSetPostSolve_Shell);CHKERRQ(ierr);
6964b9ad928SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetView_C","PCShellSetView_Shell",
6974b9ad928SBarry Smith                     PCShellSetView_Shell);CHKERRQ(ierr);
6984b9ad928SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetApplyTranspose_C",
6994b9ad928SBarry Smith                     "PCShellSetApplyTranspose_Shell",
7004b9ad928SBarry Smith                     PCShellSetApplyTranspose_Shell);CHKERRQ(ierr);
7014b9ad928SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetName_C","PCShellSetName_Shell",
7024b9ad928SBarry Smith                     PCShellSetName_Shell);CHKERRQ(ierr);
7034b9ad928SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellGetName_C","PCShellGetName_Shell",
7044b9ad928SBarry Smith                     PCShellGetName_Shell);CHKERRQ(ierr);
7054b9ad928SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetApplyRichardson_C",
7064b9ad928SBarry Smith                     "PCShellSetApplyRichardson_Shell",
7074b9ad928SBarry Smith                     PCShellSetApplyRichardson_Shell);CHKERRQ(ierr);
7084b9ad928SBarry Smith 
7094b9ad928SBarry Smith   PetscFunctionReturn(0);
7104b9ad928SBarry Smith }
7114b9ad928SBarry Smith EXTERN_C_END
7124b9ad928SBarry Smith 
7134b9ad928SBarry Smith 
7144b9ad928SBarry Smith 
7154b9ad928SBarry Smith 
7164b9ad928SBarry Smith 
7174b9ad928SBarry Smith 
718