xref: /petsc/src/ksp/pc/impls/shell/shellpc.c (revision 9bbb2c8819ed26c3c8bceed3cb2a23d8d8ad297f)
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);
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__
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__
557cdd61b2SBarry Smith #define __FUNCT__ "PCPreSolve_Shell"
567cdd61b2SBarry Smith static PetscErrorCode PCPreSolve_Shell(PC pc,KSP ksp,Vec b,Vec x)
577cdd61b2SBarry Smith {
587cdd61b2SBarry Smith   PC_Shell       *shell;
597cdd61b2SBarry Smith   PetscErrorCode ierr;
607cdd61b2SBarry Smith 
617cdd61b2SBarry Smith   PetscFunctionBegin;
627cdd61b2SBarry Smith   shell = (PC_Shell*)pc->data;
637cdd61b2SBarry Smith   if (!shell->apply) SETERRQ(PETSC_ERR_USER,"No presolve() routine provided to Shell PC");
647cdd61b2SBarry Smith   ierr  = (*shell->presolve)(shell->ctx,ksp,b,x);CHKERRQ(ierr);
657cdd61b2SBarry Smith   PetscFunctionReturn(0);
667cdd61b2SBarry Smith }
677cdd61b2SBarry Smith 
687cdd61b2SBarry Smith #undef __FUNCT__
697cdd61b2SBarry Smith #define __FUNCT__ "PCPostSolve_Shell"
707cdd61b2SBarry Smith static PetscErrorCode PCPostSolve_Shell(PC pc,KSP ksp,Vec b,Vec x)
717cdd61b2SBarry Smith {
727cdd61b2SBarry Smith   PC_Shell       *shell;
737cdd61b2SBarry Smith   PetscErrorCode ierr;
747cdd61b2SBarry Smith 
757cdd61b2SBarry Smith   PetscFunctionBegin;
767cdd61b2SBarry Smith   shell = (PC_Shell*)pc->data;
777cdd61b2SBarry Smith   if (!shell->apply) SETERRQ(PETSC_ERR_USER,"No presolve() routine provided to Shell PC");
787cdd61b2SBarry Smith   ierr  = (*shell->presolve)(shell->ctx,ksp,b,x);CHKERRQ(ierr);
797cdd61b2SBarry Smith   PetscFunctionReturn(0);
807cdd61b2SBarry Smith }
817cdd61b2SBarry Smith 
827cdd61b2SBarry 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__
1767cdd61b2SBarry Smith #define __FUNCT__ "PCShellSetPreSolve_Shell"
1777cdd61b2SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetPreSolve_Shell(PC pc,PetscErrorCode (*presolve)(void*,KSP,Vec,Vec),void *ptr)
1787cdd61b2SBarry Smith {
1797cdd61b2SBarry Smith   PC_Shell *shell;
1807cdd61b2SBarry Smith 
1817cdd61b2SBarry Smith   PetscFunctionBegin;
1827cdd61b2SBarry Smith   shell             = (PC_Shell*)pc->data;
1837cdd61b2SBarry Smith   shell->presolve   = presolve;
184*9bbb2c88SBarry Smith   if (presolve) {
185*9bbb2c88SBarry Smith     pc->ops->presolve = PCPreSolve_Shell;
186*9bbb2c88SBarry Smith   } else {
187*9bbb2c88SBarry Smith     pc->ops->presolve = 0;
188*9bbb2c88SBarry Smith   }
1897cdd61b2SBarry Smith   PetscFunctionReturn(0);
1907cdd61b2SBarry Smith }
1917cdd61b2SBarry Smith EXTERN_C_END
1927cdd61b2SBarry Smith 
1937cdd61b2SBarry Smith EXTERN_C_BEGIN
1947cdd61b2SBarry Smith #undef __FUNCT__
1957cdd61b2SBarry Smith #define __FUNCT__ "PCShellSetPostSolve_Shell"
1967cdd61b2SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetPostSolve_Shell(PC pc,PetscErrorCode (*postsolve)(void*,KSP,Vec,Vec),void *ptr)
1977cdd61b2SBarry Smith {
1987cdd61b2SBarry Smith   PC_Shell *shell;
1997cdd61b2SBarry Smith 
2007cdd61b2SBarry Smith   PetscFunctionBegin;
2017cdd61b2SBarry Smith   shell           = (PC_Shell*)pc->data;
2027cdd61b2SBarry Smith   shell->postsolve = postsolve;
203*9bbb2c88SBarry Smith   if (postsolve) {
204*9bbb2c88SBarry Smith     pc->ops->postsolve = PCPostSolve_Shell;
205*9bbb2c88SBarry Smith   } else {
206*9bbb2c88SBarry Smith     pc->ops->postsolve = 0;
207*9bbb2c88SBarry Smith   }
2087cdd61b2SBarry Smith   PetscFunctionReturn(0);
2097cdd61b2SBarry Smith }
2107cdd61b2SBarry Smith EXTERN_C_END
2117cdd61b2SBarry Smith 
2127cdd61b2SBarry Smith EXTERN_C_BEGIN
2137cdd61b2SBarry Smith #undef __FUNCT__
2144b9ad928SBarry Smith #define __FUNCT__ "PCShellSetView_Shell"
215dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetView_Shell(PC pc,PetscErrorCode (*view)(void*,PetscViewer))
2164b9ad928SBarry Smith {
2174b9ad928SBarry Smith   PC_Shell *shell;
2184b9ad928SBarry Smith 
2194b9ad928SBarry Smith   PetscFunctionBegin;
2204b9ad928SBarry Smith   shell        = (PC_Shell*)pc->data;
2214b9ad928SBarry Smith   shell->view = view;
2224b9ad928SBarry Smith   PetscFunctionReturn(0);
2234b9ad928SBarry Smith }
2244b9ad928SBarry Smith EXTERN_C_END
2254b9ad928SBarry Smith 
2264b9ad928SBarry Smith EXTERN_C_BEGIN
2274b9ad928SBarry Smith #undef __FUNCT__
2284b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApplyTranspose_Shell"
229dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApplyTranspose_Shell(PC pc,PetscErrorCode (*applytranspose)(void*,Vec,Vec))
2304b9ad928SBarry Smith {
2314b9ad928SBarry Smith   PC_Shell *shell;
2324b9ad928SBarry Smith 
2334b9ad928SBarry Smith   PetscFunctionBegin;
2344b9ad928SBarry Smith   shell                 = (PC_Shell*)pc->data;
2354b9ad928SBarry Smith   shell->applytranspose = applytranspose;
2364b9ad928SBarry Smith   PetscFunctionReturn(0);
2374b9ad928SBarry Smith }
2384b9ad928SBarry Smith EXTERN_C_END
2394b9ad928SBarry Smith 
2404b9ad928SBarry Smith EXTERN_C_BEGIN
2414b9ad928SBarry Smith #undef __FUNCT__
2424b9ad928SBarry Smith #define __FUNCT__ "PCShellSetName_Shell"
243dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetName_Shell(PC pc,const char name[])
2444b9ad928SBarry Smith {
2454b9ad928SBarry Smith   PC_Shell       *shell;
246dfbe8321SBarry Smith   PetscErrorCode ierr;
2474b9ad928SBarry Smith 
2484b9ad928SBarry Smith   PetscFunctionBegin;
2494b9ad928SBarry Smith   shell = (PC_Shell*)pc->data;
2504b9ad928SBarry Smith   ierr  = PetscStrallocpy(name,&shell->name);CHKERRQ(ierr);
2514b9ad928SBarry Smith   PetscFunctionReturn(0);
2524b9ad928SBarry Smith }
2534b9ad928SBarry Smith EXTERN_C_END
2544b9ad928SBarry Smith 
2554b9ad928SBarry Smith EXTERN_C_BEGIN
2564b9ad928SBarry Smith #undef __FUNCT__
2574b9ad928SBarry Smith #define __FUNCT__ "PCShellGetName_Shell"
258dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellGetName_Shell(PC pc,char *name[])
2594b9ad928SBarry Smith {
2604b9ad928SBarry Smith   PC_Shell *shell;
2614b9ad928SBarry Smith 
2624b9ad928SBarry Smith   PetscFunctionBegin;
2634b9ad928SBarry Smith   shell  = (PC_Shell*)pc->data;
2644b9ad928SBarry Smith   *name  = shell->name;
2654b9ad928SBarry Smith   PetscFunctionReturn(0);
2664b9ad928SBarry Smith }
2674b9ad928SBarry Smith EXTERN_C_END
2684b9ad928SBarry Smith 
2694b9ad928SBarry Smith EXTERN_C_BEGIN
2704b9ad928SBarry Smith #undef __FUNCT__
2714b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApplyRichardson_Shell"
272dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApplyRichardson_Shell(PC pc,PetscErrorCode (*apply)(void*,Vec,Vec,Vec,PetscReal,PetscReal,PetscReal,PetscInt),void *ptr)
2734b9ad928SBarry Smith {
2744b9ad928SBarry Smith   PC_Shell *shell;
2754b9ad928SBarry Smith 
2764b9ad928SBarry Smith   PetscFunctionBegin;
2774b9ad928SBarry Smith   shell                     = (PC_Shell*)pc->data;
2784b9ad928SBarry Smith   pc->ops->applyrichardson  = PCApplyRichardson_Shell;
2794b9ad928SBarry Smith   shell->applyrich          = apply;
2804b9ad928SBarry Smith   shell->ctxrich            = ptr;
2814b9ad928SBarry Smith   PetscFunctionReturn(0);
2824b9ad928SBarry Smith }
2834b9ad928SBarry Smith EXTERN_C_END
2844b9ad928SBarry Smith 
2854b9ad928SBarry Smith /* -------------------------------------------------------------------------------*/
2864b9ad928SBarry Smith 
2874b9ad928SBarry Smith #undef __FUNCT__
2884b9ad928SBarry Smith #define __FUNCT__ "PCShellSetSetUp"
2894b9ad928SBarry Smith /*@C
2904b9ad928SBarry Smith    PCShellSetSetUp - Sets routine to use to "setup" the preconditioner whenever the
2914b9ad928SBarry Smith    matrix operator is changed.
2924b9ad928SBarry Smith 
2934b9ad928SBarry Smith    Collective on PC
2944b9ad928SBarry Smith 
2954b9ad928SBarry Smith    Input Parameters:
2964b9ad928SBarry Smith +  pc - the preconditioner context
2974b9ad928SBarry Smith .  setup - the application-provided setup routine
2984b9ad928SBarry Smith 
2994b9ad928SBarry Smith    Calling sequence of setup:
3004b9ad928SBarry Smith .vb
30113f74950SBarry Smith    PetscErrorCode setup (void *ptr)
3024b9ad928SBarry Smith .ve
3034b9ad928SBarry Smith 
3044b9ad928SBarry Smith .  ptr - the application context
3054b9ad928SBarry Smith 
3064b9ad928SBarry Smith    Level: developer
3074b9ad928SBarry Smith 
3084b9ad928SBarry Smith .keywords: PC, shell, set, setup, user-provided
3094b9ad928SBarry Smith 
3104b9ad928SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetApply()
3114b9ad928SBarry Smith @*/
312dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetSetUp(PC pc,PetscErrorCode (*setup)(void*))
3134b9ad928SBarry Smith {
3146849ba73SBarry Smith   PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*));
3154b9ad928SBarry Smith 
3164b9ad928SBarry Smith   PetscFunctionBegin;
3174482741eSBarry Smith   PetscValidHeaderSpecific(pc,PC_COOKIE,1);
3184b9ad928SBarry Smith   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetSetUp_C",(void (**)(void))&f);CHKERRQ(ierr);
3194b9ad928SBarry Smith   if (f) {
3204b9ad928SBarry Smith     ierr = (*f)(pc,setup);CHKERRQ(ierr);
3214b9ad928SBarry Smith   }
3224b9ad928SBarry Smith   PetscFunctionReturn(0);
3234b9ad928SBarry Smith }
3244b9ad928SBarry Smith 
3254b9ad928SBarry Smith 
3264b9ad928SBarry Smith #undef __FUNCT__
3274b9ad928SBarry Smith #define __FUNCT__ "PCShellSetView"
3284b9ad928SBarry Smith /*@C
3294b9ad928SBarry Smith    PCShellSetView - Sets routine to use as viewer of shell preconditioner
3304b9ad928SBarry Smith 
3314b9ad928SBarry Smith    Collective on PC
3324b9ad928SBarry Smith 
3334b9ad928SBarry Smith    Input Parameters:
3344b9ad928SBarry Smith +  pc - the preconditioner context
3354b9ad928SBarry Smith -  view - the application-provided view routine
3364b9ad928SBarry Smith 
3374b9ad928SBarry Smith    Calling sequence of apply:
3384b9ad928SBarry Smith .vb
33913f74950SBarry Smith    PetscErrorCode view(void *ptr,PetscViewer v)
3404b9ad928SBarry Smith .ve
3414b9ad928SBarry Smith 
3424b9ad928SBarry Smith +  ptr - the application context
3434b9ad928SBarry Smith -  v   - viewer
3444b9ad928SBarry Smith 
3454b9ad928SBarry Smith    Level: developer
3464b9ad928SBarry Smith 
3474b9ad928SBarry Smith .keywords: PC, shell, set, apply, user-provided
3484b9ad928SBarry Smith 
3494b9ad928SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose()
3504b9ad928SBarry Smith @*/
351dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetView(PC pc,PetscErrorCode (*view)(void*,PetscViewer))
3524b9ad928SBarry Smith {
3536849ba73SBarry Smith   PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*,PetscViewer));
3544b9ad928SBarry Smith 
3554b9ad928SBarry Smith   PetscFunctionBegin;
3564482741eSBarry Smith   PetscValidHeaderSpecific(pc,PC_COOKIE,1);
3574b9ad928SBarry Smith   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetView_C",(void (**)(void))&f);CHKERRQ(ierr);
3584b9ad928SBarry Smith   if (f) {
3594b9ad928SBarry Smith     ierr = (*f)(pc,view);CHKERRQ(ierr);
3604b9ad928SBarry Smith   }
3614b9ad928SBarry Smith   PetscFunctionReturn(0);
3624b9ad928SBarry Smith }
3634b9ad928SBarry Smith 
3644b9ad928SBarry Smith #undef __FUNCT__
3654b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApply"
3664b9ad928SBarry Smith /*@C
3674b9ad928SBarry Smith    PCShellSetApply - Sets routine to use as preconditioner.
3684b9ad928SBarry Smith 
3694b9ad928SBarry Smith    Collective on PC
3704b9ad928SBarry Smith 
3714b9ad928SBarry Smith    Input Parameters:
3724b9ad928SBarry Smith +  pc - the preconditioner context
3734b9ad928SBarry Smith .  apply - the application-provided preconditioning routine
3744b9ad928SBarry Smith -  ptr - pointer to data needed by this routine
3754b9ad928SBarry Smith 
3764b9ad928SBarry Smith    Calling sequence of apply:
3774b9ad928SBarry Smith .vb
37813f74950SBarry Smith    PetscErrorCode apply (void *ptr,Vec xin,Vec xout)
3794b9ad928SBarry Smith .ve
3804b9ad928SBarry Smith 
3814b9ad928SBarry Smith +  ptr - the application context
3824b9ad928SBarry Smith .  xin - input vector
3834b9ad928SBarry Smith -  xout - output vector
3844b9ad928SBarry Smith 
3854b9ad928SBarry Smith    Level: developer
3864b9ad928SBarry Smith 
3874b9ad928SBarry Smith .keywords: PC, shell, set, apply, user-provided
3884b9ad928SBarry Smith 
3894b9ad928SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose()
3904b9ad928SBarry Smith @*/
391dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApply(PC pc,PetscErrorCode (*apply)(void*,Vec,Vec),void *ptr)
3924b9ad928SBarry Smith {
3936849ba73SBarry Smith   PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*,Vec,Vec),void *);
3944b9ad928SBarry Smith 
3954b9ad928SBarry Smith   PetscFunctionBegin;
3964482741eSBarry Smith   PetscValidHeaderSpecific(pc,PC_COOKIE,1);
3974b9ad928SBarry Smith   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetApply_C",(void (**)(void))&f);CHKERRQ(ierr);
3984b9ad928SBarry Smith   if (f) {
3994b9ad928SBarry Smith     ierr = (*f)(pc,apply,ptr);CHKERRQ(ierr);
4004b9ad928SBarry Smith   }
4014b9ad928SBarry Smith   PetscFunctionReturn(0);
4024b9ad928SBarry Smith }
4034b9ad928SBarry Smith 
4044b9ad928SBarry Smith #undef __FUNCT__
4054b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApplyTranspose"
4064b9ad928SBarry Smith /*@C
4074b9ad928SBarry Smith    PCShellSetApplyTranspose - Sets routine to use as preconditioner transpose.
4084b9ad928SBarry Smith 
4094b9ad928SBarry Smith    Collective on PC
4104b9ad928SBarry Smith 
4114b9ad928SBarry Smith    Input Parameters:
4124b9ad928SBarry Smith +  pc - the preconditioner context
4134b9ad928SBarry Smith -  apply - the application-provided preconditioning transpose routine
4144b9ad928SBarry Smith 
4154b9ad928SBarry Smith    Calling sequence of apply:
4164b9ad928SBarry Smith .vb
41713f74950SBarry Smith    PetscErrorCode applytranspose (void *ptr,Vec xin,Vec xout)
4184b9ad928SBarry Smith .ve
4194b9ad928SBarry Smith 
4204b9ad928SBarry Smith +  ptr - the application context
4214b9ad928SBarry Smith .  xin - input vector
4224b9ad928SBarry Smith -  xout - output vector
4234b9ad928SBarry Smith 
4244b9ad928SBarry Smith    Level: developer
4254b9ad928SBarry Smith 
4264b9ad928SBarry Smith    Notes:
4274b9ad928SBarry Smith    Uses the same context variable as PCShellSetApply().
4284b9ad928SBarry Smith 
4294b9ad928SBarry Smith .keywords: PC, shell, set, apply, user-provided
4304b9ad928SBarry Smith 
4314b9ad928SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApply()
4324b9ad928SBarry Smith @*/
433dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApplyTranspose(PC pc,PetscErrorCode (*applytranspose)(void*,Vec,Vec))
4344b9ad928SBarry Smith {
4356849ba73SBarry Smith   PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*,Vec,Vec));
4364b9ad928SBarry Smith 
4374b9ad928SBarry Smith   PetscFunctionBegin;
4384482741eSBarry Smith   PetscValidHeaderSpecific(pc,PC_COOKIE,1);
4394b9ad928SBarry Smith   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetApplyTranspose_C",(void (**)(void))&f);CHKERRQ(ierr);
4404b9ad928SBarry Smith   if (f) {
4414b9ad928SBarry Smith     ierr = (*f)(pc,applytranspose);CHKERRQ(ierr);
4424b9ad928SBarry Smith   }
4434b9ad928SBarry Smith   PetscFunctionReturn(0);
4444b9ad928SBarry Smith }
4454b9ad928SBarry Smith 
4464b9ad928SBarry Smith #undef __FUNCT__
4477cdd61b2SBarry Smith #define __FUNCT__ "PCShellSetPreSolve"
4487cdd61b2SBarry Smith /*@C
4497cdd61b2SBarry Smith    PCShellSetPreSolve - Sets routine to apply to the operators/vectors before a KSPSolve() is
4507cdd61b2SBarry Smith       applied. This usually does something like scale the linear system in some application
4517cdd61b2SBarry Smith       specific way.
4527cdd61b2SBarry Smith 
4537cdd61b2SBarry Smith    Collective on PC
4547cdd61b2SBarry Smith 
4557cdd61b2SBarry Smith    Input Parameters:
4567cdd61b2SBarry Smith +  pc - the preconditioner context
4577cdd61b2SBarry Smith -  presolve - the application-provided presolve routine
4587cdd61b2SBarry Smith 
4597cdd61b2SBarry Smith    Calling sequence of presolve:
4607cdd61b2SBarry Smith .vb
4617cdd61b2SBarry Smith    PetscErrorCode presolve (void *ptr,KSP ksp,Vec b,Vec x)
4627cdd61b2SBarry Smith .ve
4637cdd61b2SBarry Smith 
4647cdd61b2SBarry Smith +  ptr - the application context
4657cdd61b2SBarry Smith .  xin - input vector
4667cdd61b2SBarry Smith -  xout - output vector
4677cdd61b2SBarry Smith 
4687cdd61b2SBarry Smith    Level: developer
4697cdd61b2SBarry Smith 
4707cdd61b2SBarry Smith .keywords: PC, shell, set, apply, user-provided
4717cdd61b2SBarry Smith 
4727cdd61b2SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose(), PCShellSetPostSolve()
4737cdd61b2SBarry Smith @*/
4747cdd61b2SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetPreSolve(PC pc,PetscErrorCode (*presolve)(void*,KSP,Vec,Vec))
4757cdd61b2SBarry Smith {
4767cdd61b2SBarry Smith   PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*,KSP,Vec,Vec));
4777cdd61b2SBarry Smith 
4787cdd61b2SBarry Smith   PetscFunctionBegin;
4797cdd61b2SBarry Smith   PetscValidHeaderSpecific(pc,PC_COOKIE,1);
4807cdd61b2SBarry Smith   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetPreSolve_C",(void (**)(void))&f);CHKERRQ(ierr);
4817cdd61b2SBarry Smith   if (f) {
4827cdd61b2SBarry Smith     ierr = (*f)(pc,presolve);CHKERRQ(ierr);
4837cdd61b2SBarry Smith   }
4847cdd61b2SBarry Smith   PetscFunctionReturn(0);
4857cdd61b2SBarry Smith }
4867cdd61b2SBarry Smith 
4877cdd61b2SBarry Smith #undef __FUNCT__
4887cdd61b2SBarry Smith #define __FUNCT__ "PCShellSetPostSolve"
4897cdd61b2SBarry Smith /*@C
4907cdd61b2SBarry Smith    PCShellSetPostSolve - Sets routine to apply to the operators/vectors before a KSPSolve() is
4917cdd61b2SBarry Smith       applied. This usually does something like scale the linear system in some application
4927cdd61b2SBarry Smith       specific way.
4937cdd61b2SBarry Smith 
4947cdd61b2SBarry Smith    Collective on PC
4957cdd61b2SBarry Smith 
4967cdd61b2SBarry Smith    Input Parameters:
4977cdd61b2SBarry Smith +  pc - the preconditioner context
4987cdd61b2SBarry Smith -  postsolve - the application-provided presolve routine
4997cdd61b2SBarry Smith 
5007cdd61b2SBarry Smith    Calling sequence of postsolve:
5017cdd61b2SBarry Smith .vb
5027cdd61b2SBarry Smith    PetscErrorCode postsolve(void *ptr,KSP ksp,Vec b,Vec x)
5037cdd61b2SBarry Smith .ve
5047cdd61b2SBarry Smith 
5057cdd61b2SBarry Smith +  ptr - the application context
5067cdd61b2SBarry Smith .  xin - input vector
5077cdd61b2SBarry Smith -  xout - output vector
5087cdd61b2SBarry Smith 
5097cdd61b2SBarry Smith    Level: developer
5107cdd61b2SBarry Smith 
5117cdd61b2SBarry Smith .keywords: PC, shell, set, apply, user-provided
5127cdd61b2SBarry Smith 
5137cdd61b2SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose(), PCShellSetPreSolve()
5147cdd61b2SBarry Smith @*/
5157cdd61b2SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetPostSolve(PC pc,PetscErrorCode (*postsolve)(void*,KSP,Vec,Vec))
5167cdd61b2SBarry Smith {
5177cdd61b2SBarry Smith   PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*,KSP,Vec,Vec));
5187cdd61b2SBarry Smith 
5197cdd61b2SBarry Smith   PetscFunctionBegin;
5207cdd61b2SBarry Smith   PetscValidHeaderSpecific(pc,PC_COOKIE,1);
5217cdd61b2SBarry Smith   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetPostSolve_C",(void (**)(void))&f);CHKERRQ(ierr);
5227cdd61b2SBarry Smith   if (f) {
5237cdd61b2SBarry Smith     ierr = (*f)(pc,postsolve);CHKERRQ(ierr);
5247cdd61b2SBarry Smith   }
5257cdd61b2SBarry Smith   PetscFunctionReturn(0);
5267cdd61b2SBarry Smith }
5277cdd61b2SBarry Smith 
5287cdd61b2SBarry Smith #undef __FUNCT__
5294b9ad928SBarry Smith #define __FUNCT__ "PCShellSetName"
5304b9ad928SBarry Smith /*@C
5314b9ad928SBarry Smith    PCShellSetName - Sets an optional name to associate with a shell
5324b9ad928SBarry Smith    preconditioner.
5334b9ad928SBarry Smith 
5344b9ad928SBarry Smith    Not Collective
5354b9ad928SBarry Smith 
5364b9ad928SBarry Smith    Input Parameters:
5374b9ad928SBarry Smith +  pc - the preconditioner context
5384b9ad928SBarry Smith -  name - character string describing shell preconditioner
5394b9ad928SBarry Smith 
5404b9ad928SBarry Smith    Level: developer
5414b9ad928SBarry Smith 
5424b9ad928SBarry Smith .keywords: PC, shell, set, name, user-provided
5434b9ad928SBarry Smith 
5444b9ad928SBarry Smith .seealso: PCShellGetName()
5454b9ad928SBarry Smith @*/
546dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetName(PC pc,const char name[])
5474b9ad928SBarry Smith {
548dfbe8321SBarry Smith   PetscErrorCode ierr,(*f)(PC,const char []);
5494b9ad928SBarry Smith 
5504b9ad928SBarry Smith   PetscFunctionBegin;
5514482741eSBarry Smith   PetscValidHeaderSpecific(pc,PC_COOKIE,1);
5524b9ad928SBarry Smith   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetName_C",(void (**)(void))&f);CHKERRQ(ierr);
5534b9ad928SBarry Smith   if (f) {
5544b9ad928SBarry Smith     ierr = (*f)(pc,name);CHKERRQ(ierr);
5554b9ad928SBarry Smith   }
5564b9ad928SBarry Smith   PetscFunctionReturn(0);
5574b9ad928SBarry Smith }
5584b9ad928SBarry Smith 
5594b9ad928SBarry Smith #undef __FUNCT__
5604b9ad928SBarry Smith #define __FUNCT__ "PCShellGetName"
5614b9ad928SBarry Smith /*@C
5624b9ad928SBarry Smith    PCShellGetName - Gets an optional name that the user has set for a shell
5634b9ad928SBarry Smith    preconditioner.
5644b9ad928SBarry Smith 
5654b9ad928SBarry Smith    Not Collective
5664b9ad928SBarry Smith 
5674b9ad928SBarry Smith    Input Parameter:
5684b9ad928SBarry Smith .  pc - the preconditioner context
5694b9ad928SBarry Smith 
5704b9ad928SBarry Smith    Output Parameter:
5714b9ad928SBarry Smith .  name - character string describing shell preconditioner (you should not free this)
5724b9ad928SBarry Smith 
5734b9ad928SBarry Smith    Level: developer
5744b9ad928SBarry Smith 
5754b9ad928SBarry Smith .keywords: PC, shell, get, name, user-provided
5764b9ad928SBarry Smith 
5774b9ad928SBarry Smith .seealso: PCShellSetName()
5784b9ad928SBarry Smith @*/
579dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellGetName(PC pc,char *name[])
5804b9ad928SBarry Smith {
581dfbe8321SBarry Smith   PetscErrorCode ierr,(*f)(PC,char *[]);
5824b9ad928SBarry Smith 
5834b9ad928SBarry Smith   PetscFunctionBegin;
5844482741eSBarry Smith   PetscValidHeaderSpecific(pc,PC_COOKIE,1);
5854482741eSBarry Smith   PetscValidPointer(name,2);
5864b9ad928SBarry Smith   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellGetName_C",(void (**)(void))&f);CHKERRQ(ierr);
5874b9ad928SBarry Smith   if (f) {
5884b9ad928SBarry Smith     ierr = (*f)(pc,name);CHKERRQ(ierr);
5894b9ad928SBarry Smith   } else {
5901302d50aSBarry Smith     SETERRQ(PETSC_ERR_ARG_WRONG,"Not shell preconditioner, cannot get name");
5914b9ad928SBarry Smith   }
5924b9ad928SBarry Smith   PetscFunctionReturn(0);
5934b9ad928SBarry Smith }
5944b9ad928SBarry Smith 
5954b9ad928SBarry Smith #undef __FUNCT__
5964b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApplyRichardson"
5974b9ad928SBarry Smith /*@C
5984b9ad928SBarry Smith    PCShellSetApplyRichardson - Sets routine to use as preconditioner
5994b9ad928SBarry Smith    in Richardson iteration.
6004b9ad928SBarry Smith 
6014b9ad928SBarry Smith    Collective on PC
6024b9ad928SBarry Smith 
6034b9ad928SBarry Smith    Input Parameters:
6044b9ad928SBarry Smith +  pc - the preconditioner context
6054b9ad928SBarry Smith .  apply - the application-provided preconditioning routine
6064b9ad928SBarry Smith -  ptr - pointer to data needed by this routine
6074b9ad928SBarry Smith 
6084b9ad928SBarry Smith    Calling sequence of apply:
6094b9ad928SBarry Smith .vb
61013f74950SBarry Smith    PetscErrorCode apply (void *ptr,Vec b,Vec x,Vec r,PetscReal rtol,PetscReal abstol,PetscReal dtol,PetscInt maxits)
6114b9ad928SBarry Smith .ve
6124b9ad928SBarry Smith 
6134b9ad928SBarry Smith +  ptr - the application context
6144b9ad928SBarry Smith .  b - right-hand-side
6154b9ad928SBarry Smith .  x - current iterate
6164b9ad928SBarry Smith .  r - work space
6174b9ad928SBarry Smith .  rtol - relative tolerance of residual norm to stop at
61870441072SBarry Smith .  abstol - absolute tolerance of residual norm to stop at
6194b9ad928SBarry Smith .  dtol - if residual norm increases by this factor than return
6204b9ad928SBarry Smith -  maxits - number of iterations to run
6214b9ad928SBarry Smith 
6224b9ad928SBarry Smith    Level: developer
6234b9ad928SBarry Smith 
6244b9ad928SBarry Smith .keywords: PC, shell, set, apply, Richardson, user-provided
6254b9ad928SBarry Smith 
6264b9ad928SBarry Smith .seealso: PCShellSetApply()
6274b9ad928SBarry Smith @*/
628dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApplyRichardson(PC pc,PetscErrorCode (*apply)(void*,Vec,Vec,Vec,PetscReal,PetscReal,PetscReal,PetscInt),void *ptr)
6294b9ad928SBarry Smith {
63013f74950SBarry Smith   PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*,Vec,Vec,Vec,PetscReal,PetscReal,PetscReal,PetscInt),void *);
6314b9ad928SBarry Smith 
6324b9ad928SBarry Smith   PetscFunctionBegin;
6334482741eSBarry Smith   PetscValidHeaderSpecific(pc,PC_COOKIE,1);
6344b9ad928SBarry Smith   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetApplyRichardson_C",(void (**)(void))&f);CHKERRQ(ierr);
6354b9ad928SBarry Smith   if (f) {
6364b9ad928SBarry Smith     ierr = (*f)(pc,apply,ptr);CHKERRQ(ierr);
6374b9ad928SBarry Smith   }
6384b9ad928SBarry Smith   PetscFunctionReturn(0);
6394b9ad928SBarry Smith }
6404b9ad928SBarry Smith 
6414b9ad928SBarry Smith /*MC
6424b9ad928SBarry Smith    PCSHELL - Creates a new preconditioner class for use with your
6434b9ad928SBarry Smith               own private data storage format.
6444b9ad928SBarry Smith 
6454b9ad928SBarry Smith    Level: advanced
6464b9ad928SBarry Smith 
6474b9ad928SBarry Smith    Concepts: providing your own preconditioner
6484b9ad928SBarry Smith 
6494b9ad928SBarry Smith   Usage:
6506849ba73SBarry Smith $             PetscErrorCode (*mult)(void*,Vec,Vec);
6516849ba73SBarry Smith $             PetscErrorCode (*setup)(void*);
6524b9ad928SBarry Smith $             PCCreate(comm,&pc);
6534b9ad928SBarry Smith $             PCSetType(pc,PCSHELL);
6544b9ad928SBarry Smith $             PCShellSetApply(pc,mult,ctx);
6554b9ad928SBarry Smith $             PCShellSetSetUp(pc,setup);       (optional)
6564b9ad928SBarry Smith 
6574b9ad928SBarry Smith .seealso:  PCCreate(), PCSetType(), PCType (for list of available types), PC,
658d07a9264SSatish Balay            MATSHELL, PCShellSetUp(), PCShellSetApply(), PCShellSetView(),
6594b9ad928SBarry Smith            PCShellSetApplyTranpose(), PCShellSetName(), PCShellSetApplyRichardson(),
6604b9ad928SBarry Smith            PCShellGetName()
6614b9ad928SBarry Smith M*/
6624b9ad928SBarry Smith 
6634b9ad928SBarry Smith EXTERN_C_BEGIN
6644b9ad928SBarry Smith #undef __FUNCT__
6654b9ad928SBarry Smith #define __FUNCT__ "PCCreate_Shell"
666dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCCreate_Shell(PC pc)
6674b9ad928SBarry Smith {
668dfbe8321SBarry Smith   PetscErrorCode ierr;
6694b9ad928SBarry Smith   PC_Shell       *shell;
6704b9ad928SBarry Smith 
6714b9ad928SBarry Smith   PetscFunctionBegin;
6724b9ad928SBarry Smith   pc->ops->destroy    = PCDestroy_Shell;
6734b9ad928SBarry Smith   ierr                = PetscNew(PC_Shell,&shell);CHKERRQ(ierr);
67452e6d16bSBarry Smith   ierr = PetscLogObjectMemory(pc,sizeof(PC_Shell));CHKERRQ(ierr);
6754b9ad928SBarry Smith   pc->data         = (void*)shell;
6764b9ad928SBarry Smith   pc->name         = 0;
6774b9ad928SBarry Smith 
6784b9ad928SBarry Smith   pc->ops->apply           = PCApply_Shell;
6794b9ad928SBarry Smith   pc->ops->view            = PCView_Shell;
6804b9ad928SBarry Smith   pc->ops->applytranspose  = PCApplyTranspose_Shell;
6814b9ad928SBarry Smith   pc->ops->applyrichardson = 0;
6824b9ad928SBarry Smith   pc->ops->setup           = PCSetUp_Shell;
683*9bbb2c88SBarry Smith   pc->ops->presolve        = 0;
684*9bbb2c88SBarry Smith   pc->ops->postsolve       = 0;
6854b9ad928SBarry Smith   pc->ops->view            = PCView_Shell;
6864b9ad928SBarry Smith 
6874b9ad928SBarry Smith   shell->apply          = 0;
6884b9ad928SBarry Smith   shell->applytranspose = 0;
6894b9ad928SBarry Smith   shell->name           = 0;
6904b9ad928SBarry Smith   shell->applyrich      = 0;
6917cdd61b2SBarry Smith   shell->presolve       = 0;
6927cdd61b2SBarry Smith   shell->postsolve      = 0;
6934b9ad928SBarry Smith   shell->ctxrich        = 0;
6944b9ad928SBarry Smith   shell->ctx            = 0;
6954b9ad928SBarry Smith   shell->setup          = 0;
6964b9ad928SBarry Smith   shell->view           = 0;
6974b9ad928SBarry Smith 
6984b9ad928SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetSetUp_C","PCShellSetSetUp_Shell",
6994b9ad928SBarry Smith                     PCShellSetSetUp_Shell);CHKERRQ(ierr);
7004b9ad928SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetApply_C","PCShellSetApply_Shell",
7014b9ad928SBarry Smith                     PCShellSetApply_Shell);CHKERRQ(ierr);
7027cdd61b2SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetPreSolve_C","PCShellSetPreSolve_Shell",
7037cdd61b2SBarry Smith                     PCShellSetPreSolve_Shell);CHKERRQ(ierr);
7047cdd61b2SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetPostSolve_C","PCShellSetPostSolve_Shell",
7057cdd61b2SBarry Smith                     PCShellSetPostSolve_Shell);CHKERRQ(ierr);
7064b9ad928SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetView_C","PCShellSetView_Shell",
7074b9ad928SBarry Smith                     PCShellSetView_Shell);CHKERRQ(ierr);
7084b9ad928SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetApplyTranspose_C",
7094b9ad928SBarry Smith                     "PCShellSetApplyTranspose_Shell",
7104b9ad928SBarry Smith                     PCShellSetApplyTranspose_Shell);CHKERRQ(ierr);
7114b9ad928SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetName_C","PCShellSetName_Shell",
7124b9ad928SBarry Smith                     PCShellSetName_Shell);CHKERRQ(ierr);
7134b9ad928SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellGetName_C","PCShellGetName_Shell",
7144b9ad928SBarry Smith                     PCShellGetName_Shell);CHKERRQ(ierr);
7154b9ad928SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetApplyRichardson_C",
7164b9ad928SBarry Smith                     "PCShellSetApplyRichardson_Shell",
7174b9ad928SBarry Smith                     PCShellSetApplyRichardson_Shell);CHKERRQ(ierr);
7184b9ad928SBarry Smith 
7194b9ad928SBarry Smith   PetscFunctionReturn(0);
7204b9ad928SBarry Smith }
7214b9ad928SBarry Smith EXTERN_C_END
7224b9ad928SBarry Smith 
7234b9ad928SBarry Smith 
7244b9ad928SBarry Smith 
7254b9ad928SBarry Smith 
7264b9ad928SBarry Smith 
7274b9ad928SBarry Smith 
728