xref: /petsc/src/ksp/pc/impls/shell/shellpc.c (revision 18be62a5feccf172f7bc80c15c4be8f6d6443e8b)
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 {
13be29d3c6SBarry Smith   void           *ctx;                     /* user provided contexts for preconditioner */
14*18be62a5SSatish Balay   PetscErrorCode (*destroy)(void*);
156849ba73SBarry Smith   PetscErrorCode (*setup)(void*);
166849ba73SBarry Smith   PetscErrorCode (*apply)(void*,Vec,Vec);
177cdd61b2SBarry Smith   PetscErrorCode (*presolve)(void*,KSP,Vec,Vec);
187cdd61b2SBarry Smith   PetscErrorCode (*postsolve)(void*,KSP,Vec,Vec);
196849ba73SBarry Smith   PetscErrorCode (*view)(void*,PetscViewer);
206849ba73SBarry Smith   PetscErrorCode (*applytranspose)(void*,Vec,Vec);
2113f74950SBarry Smith   PetscErrorCode (*applyrich)(void*,Vec,Vec,Vec,PetscReal,PetscReal,PetscReal,PetscInt);
224b9ad928SBarry Smith   char           *name;
234b9ad928SBarry Smith } PC_Shell;
24ac226902SBarry Smith EXTERN_C_END
254b9ad928SBarry Smith 
264b9ad928SBarry Smith #undef __FUNCT__
27be29d3c6SBarry Smith #define __FUNCT__ "PCShellGetContext"
28be29d3c6SBarry Smith /*@
29be29d3c6SBarry Smith     PCShellGetContext - Returns the user-provided context associated with a shell PC
30be29d3c6SBarry Smith 
31be29d3c6SBarry Smith     Not Collective
32be29d3c6SBarry Smith 
33be29d3c6SBarry Smith     Input Parameter:
34be29d3c6SBarry Smith .   pc - should have been created with PCCreateShell()
35be29d3c6SBarry Smith 
36be29d3c6SBarry Smith     Output Parameter:
37be29d3c6SBarry Smith .   ctx - the user provided context
38be29d3c6SBarry Smith 
39be29d3c6SBarry Smith     Level: advanced
40be29d3c6SBarry Smith 
41be29d3c6SBarry Smith     Notes:
42be29d3c6SBarry Smith     This routine is intended for use within various shell routines
43be29d3c6SBarry Smith 
44be29d3c6SBarry Smith .keywords: PC, shell, get, context
45be29d3c6SBarry Smith 
46be29d3c6SBarry Smith .seealso: PCCreateShell(), PCShellSetContext()
47be29d3c6SBarry Smith @*/
48be29d3c6SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellGetContext(PC pc,void **ctx)
49be29d3c6SBarry Smith {
50be29d3c6SBarry Smith   PetscErrorCode ierr;
51be29d3c6SBarry Smith   PetscTruth     flg;
52be29d3c6SBarry Smith 
53be29d3c6SBarry Smith   PetscFunctionBegin;
54be29d3c6SBarry Smith   PetscValidHeaderSpecific(pc,PC_COOKIE,1);
55be29d3c6SBarry Smith   PetscValidPointer(ctx,2);
56be29d3c6SBarry Smith   ierr = PetscTypeCompare((PetscObject)pc,PCSHELL,&flg);CHKERRQ(ierr);
57be29d3c6SBarry Smith   if (!flg) *ctx = 0;
58be29d3c6SBarry Smith   else      *ctx = ((PC_Shell*)(pc->data))->ctx;
59be29d3c6SBarry Smith   PetscFunctionReturn(0);
60be29d3c6SBarry Smith }
61be29d3c6SBarry Smith 
62be29d3c6SBarry Smith #undef __FUNCT__
63be29d3c6SBarry Smith #define __FUNCT__ "PCShellSetContext"
64be29d3c6SBarry Smith /*@C
65be29d3c6SBarry Smith     PCShellSetContext - sets the context for a shell PC
66be29d3c6SBarry Smith 
67be29d3c6SBarry Smith    Collective on PC
68be29d3c6SBarry Smith 
69be29d3c6SBarry Smith     Input Parameters:
70be29d3c6SBarry Smith +   pc - the shell PC
71be29d3c6SBarry Smith -   ctx - the context
72be29d3c6SBarry Smith 
73be29d3c6SBarry Smith    Level: advanced
74be29d3c6SBarry Smith 
75be29d3c6SBarry Smith    Fortran Notes: The context can only be an integer or a PetscObject
76be29d3c6SBarry Smith       unfortunately it cannot be a Fortran array or derived type.
77be29d3c6SBarry Smith 
78be29d3c6SBarry Smith .seealso: PCCreateShell(), PCShellGetContext()
79be29d3c6SBarry Smith @*/
80be29d3c6SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetContext(PC pc,void *ctx)
81be29d3c6SBarry Smith {
82be29d3c6SBarry Smith   PC_Shell      *shell = (PC_Shell*)pc->data;
83be29d3c6SBarry Smith   PetscErrorCode ierr;
84be29d3c6SBarry Smith   PetscTruth     flg;
85be29d3c6SBarry Smith 
86be29d3c6SBarry Smith   PetscFunctionBegin;
87be29d3c6SBarry Smith   PetscValidHeaderSpecific(pc,PC_COOKIE,1);
88be29d3c6SBarry Smith   ierr = PetscTypeCompare((PetscObject)pc,PCSHELL,&flg);CHKERRQ(ierr);
89be29d3c6SBarry Smith   if (flg) {
90be29d3c6SBarry Smith     shell->ctx = ctx;
91be29d3c6SBarry Smith   }
92be29d3c6SBarry Smith   PetscFunctionReturn(0);
93be29d3c6SBarry Smith }
94be29d3c6SBarry Smith 
95be29d3c6SBarry Smith #undef __FUNCT__
96*18be62a5SSatish Balay #define __FUNCT__ "PCSetUp_Shell"
976849ba73SBarry Smith static PetscErrorCode PCSetUp_Shell(PC pc)
984b9ad928SBarry Smith {
994b9ad928SBarry Smith   PC_Shell       *shell;
100dfbe8321SBarry Smith   PetscErrorCode ierr;
1014b9ad928SBarry Smith 
1024b9ad928SBarry Smith   PetscFunctionBegin;
1034b9ad928SBarry Smith   shell = (PC_Shell*)pc->data;
1044b9ad928SBarry Smith   if (shell->setup) {
1054b9ad928SBarry Smith     ierr  = (*shell->setup)(shell->ctx);CHKERRQ(ierr);
1064b9ad928SBarry Smith   }
1074b9ad928SBarry Smith   PetscFunctionReturn(0);
1084b9ad928SBarry Smith }
1094b9ad928SBarry Smith 
1104b9ad928SBarry Smith #undef __FUNCT__
1114b9ad928SBarry Smith #define __FUNCT__ "PCApply_Shell"
1126849ba73SBarry Smith static PetscErrorCode PCApply_Shell(PC pc,Vec x,Vec y)
1134b9ad928SBarry Smith {
1144b9ad928SBarry Smith   PC_Shell       *shell;
115dfbe8321SBarry Smith   PetscErrorCode ierr;
1164b9ad928SBarry Smith 
1174b9ad928SBarry Smith   PetscFunctionBegin;
1184b9ad928SBarry Smith   shell = (PC_Shell*)pc->data;
1191302d50aSBarry Smith   if (!shell->apply) SETERRQ(PETSC_ERR_USER,"No apply() routine provided to Shell PC");
1204b9ad928SBarry Smith   ierr  = (*shell->apply)(shell->ctx,x,y);CHKERRQ(ierr);
1214b9ad928SBarry Smith   PetscFunctionReturn(0);
1224b9ad928SBarry Smith }
1234b9ad928SBarry Smith 
1244b9ad928SBarry Smith #undef __FUNCT__
1257cdd61b2SBarry Smith #define __FUNCT__ "PCPreSolve_Shell"
1267cdd61b2SBarry Smith static PetscErrorCode PCPreSolve_Shell(PC pc,KSP ksp,Vec b,Vec x)
1277cdd61b2SBarry Smith {
1287cdd61b2SBarry Smith   PC_Shell       *shell;
1297cdd61b2SBarry Smith   PetscErrorCode ierr;
1307cdd61b2SBarry Smith 
1317cdd61b2SBarry Smith   PetscFunctionBegin;
1327cdd61b2SBarry Smith   shell = (PC_Shell*)pc->data;
13391ad8336SSatish Balay   if (!shell->presolve) SETERRQ(PETSC_ERR_USER,"No presolve() routine provided to Shell PC");
1347cdd61b2SBarry Smith   ierr  = (*shell->presolve)(shell->ctx,ksp,b,x);CHKERRQ(ierr);
1357cdd61b2SBarry Smith   PetscFunctionReturn(0);
1367cdd61b2SBarry Smith }
1377cdd61b2SBarry Smith 
1387cdd61b2SBarry Smith #undef __FUNCT__
1397cdd61b2SBarry Smith #define __FUNCT__ "PCPostSolve_Shell"
1407cdd61b2SBarry Smith static PetscErrorCode PCPostSolve_Shell(PC pc,KSP ksp,Vec b,Vec x)
1417cdd61b2SBarry Smith {
1427cdd61b2SBarry Smith   PC_Shell       *shell;
1437cdd61b2SBarry Smith   PetscErrorCode ierr;
1447cdd61b2SBarry Smith 
1457cdd61b2SBarry Smith   PetscFunctionBegin;
1467cdd61b2SBarry Smith   shell = (PC_Shell*)pc->data;
14791ad8336SSatish Balay   if (!shell->postsolve) SETERRQ(PETSC_ERR_USER,"No postsolve() routine provided to Shell PC");
14891ad8336SSatish Balay   ierr  = (*shell->postsolve)(shell->ctx,ksp,b,x);CHKERRQ(ierr);
1497cdd61b2SBarry Smith   PetscFunctionReturn(0);
1507cdd61b2SBarry Smith }
1517cdd61b2SBarry Smith 
1527cdd61b2SBarry Smith #undef __FUNCT__
1534b9ad928SBarry Smith #define __FUNCT__ "PCApplyTranspose_Shell"
1546849ba73SBarry Smith static PetscErrorCode PCApplyTranspose_Shell(PC pc,Vec x,Vec y)
1554b9ad928SBarry Smith {
1564b9ad928SBarry Smith   PC_Shell       *shell;
157dfbe8321SBarry Smith   PetscErrorCode ierr;
1584b9ad928SBarry Smith 
1594b9ad928SBarry Smith   PetscFunctionBegin;
1604b9ad928SBarry Smith   shell = (PC_Shell*)pc->data;
1611302d50aSBarry Smith   if (!shell->applytranspose) SETERRQ(PETSC_ERR_USER,"No applytranspose() routine provided to Shell PC");
1624b9ad928SBarry Smith   ierr  = (*shell->applytranspose)(shell->ctx,x,y);CHKERRQ(ierr);
1634b9ad928SBarry Smith   PetscFunctionReturn(0);
1644b9ad928SBarry Smith }
1654b9ad928SBarry Smith 
1664b9ad928SBarry Smith #undef __FUNCT__
1674b9ad928SBarry Smith #define __FUNCT__ "PCApplyRichardson_Shell"
16813f74950SBarry Smith static PetscErrorCode PCApplyRichardson_Shell(PC pc,Vec x,Vec y,Vec w,PetscReal rtol,PetscReal abstol, PetscReal dtol,PetscInt it)
1694b9ad928SBarry Smith {
170dfbe8321SBarry Smith   PetscErrorCode ierr;
1714b9ad928SBarry Smith   PC_Shell       *shell;
1724b9ad928SBarry Smith 
1734b9ad928SBarry Smith   PetscFunctionBegin;
1744b9ad928SBarry Smith   shell = (PC_Shell*)pc->data;
175be29d3c6SBarry Smith   ierr  = (*shell->applyrich)(shell->ctx,x,y,w,rtol,abstol,dtol,it);CHKERRQ(ierr);
1764b9ad928SBarry Smith   PetscFunctionReturn(0);
1774b9ad928SBarry Smith }
1784b9ad928SBarry Smith 
1794b9ad928SBarry Smith #undef __FUNCT__
1804b9ad928SBarry Smith #define __FUNCT__ "PCDestroy_Shell"
1816849ba73SBarry Smith static PetscErrorCode PCDestroy_Shell(PC pc)
1824b9ad928SBarry Smith {
1834b9ad928SBarry Smith   PC_Shell       *shell = (PC_Shell*)pc->data;
184dfbe8321SBarry Smith   PetscErrorCode ierr;
1854b9ad928SBarry Smith 
1864b9ad928SBarry Smith   PetscFunctionBegin;
187*18be62a5SSatish Balay   if (shell->name) {ierr = PetscFree(shell->name);CHKERRQ(ierr);}
188*18be62a5SSatish Balay   if (shell->destroy) {
189*18be62a5SSatish Balay     ierr  = (*shell->destroy)(shell->ctx);CHKERRQ(ierr);
190*18be62a5SSatish Balay   }
1914b9ad928SBarry Smith   ierr = PetscFree(shell);CHKERRQ(ierr);
1924b9ad928SBarry Smith   PetscFunctionReturn(0);
1934b9ad928SBarry Smith }
1944b9ad928SBarry Smith 
1954b9ad928SBarry Smith #undef __FUNCT__
1964b9ad928SBarry Smith #define __FUNCT__ "PCView_Shell"
1976849ba73SBarry Smith static PetscErrorCode PCView_Shell(PC pc,PetscViewer viewer)
1984b9ad928SBarry Smith {
1994b9ad928SBarry Smith   PC_Shell       *shell = (PC_Shell*)pc->data;
200dfbe8321SBarry Smith   PetscErrorCode ierr;
20132077d6dSBarry Smith   PetscTruth     iascii;
2024b9ad928SBarry Smith 
2034b9ad928SBarry Smith   PetscFunctionBegin;
20432077d6dSBarry Smith   ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_ASCII,&iascii);CHKERRQ(ierr);
20532077d6dSBarry Smith   if (iascii) {
2064b9ad928SBarry Smith     if (shell->name) {ierr = PetscViewerASCIIPrintf(viewer,"  Shell: %s\n",shell->name);CHKERRQ(ierr);}
2074b9ad928SBarry Smith     else             {ierr = PetscViewerASCIIPrintf(viewer,"  Shell: no name\n");CHKERRQ(ierr);}
2084b9ad928SBarry Smith   }
2094b9ad928SBarry Smith   if (shell->view) {
2104b9ad928SBarry Smith     ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
2114b9ad928SBarry Smith     ierr  = (*shell->view)(shell->ctx,viewer);CHKERRQ(ierr);
2124b9ad928SBarry Smith     ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
2134b9ad928SBarry Smith   }
2144b9ad928SBarry Smith   PetscFunctionReturn(0);
2154b9ad928SBarry Smith }
2164b9ad928SBarry Smith 
2174b9ad928SBarry Smith /* ------------------------------------------------------------------------------*/
2184b9ad928SBarry Smith EXTERN_C_BEGIN
2194b9ad928SBarry Smith #undef __FUNCT__
220*18be62a5SSatish Balay #define __FUNCT__ "PCShellSetDestroy_Shell"
221*18be62a5SSatish Balay PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetDestroy_Shell(PC pc, PetscErrorCode (*destroy)(void*))
222*18be62a5SSatish Balay {
223*18be62a5SSatish Balay   PC_Shell *shell;
224*18be62a5SSatish Balay 
225*18be62a5SSatish Balay   PetscFunctionBegin;
226*18be62a5SSatish Balay   shell          = (PC_Shell*)pc->data;
227*18be62a5SSatish Balay   shell->destroy = destroy;
228*18be62a5SSatish Balay   PetscFunctionReturn(0);
229*18be62a5SSatish Balay }
230*18be62a5SSatish Balay EXTERN_C_END
231*18be62a5SSatish Balay 
232*18be62a5SSatish Balay EXTERN_C_BEGIN
233*18be62a5SSatish Balay #undef __FUNCT__
2344b9ad928SBarry Smith #define __FUNCT__ "PCShellSetSetUp_Shell"
235dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetSetUp_Shell(PC pc, PetscErrorCode (*setup)(void*))
2364b9ad928SBarry Smith {
2374b9ad928SBarry Smith   PC_Shell *shell;
2384b9ad928SBarry Smith 
2394b9ad928SBarry Smith   PetscFunctionBegin;
2404b9ad928SBarry Smith   shell        = (PC_Shell*)pc->data;
2414b9ad928SBarry Smith   shell->setup = setup;
2424b9ad928SBarry Smith   PetscFunctionReturn(0);
2434b9ad928SBarry Smith }
2444b9ad928SBarry Smith EXTERN_C_END
2454b9ad928SBarry Smith 
2464b9ad928SBarry Smith EXTERN_C_BEGIN
2474b9ad928SBarry Smith #undef __FUNCT__
2484b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApply_Shell"
249be29d3c6SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApply_Shell(PC pc,PetscErrorCode (*apply)(void*,Vec,Vec))
2504b9ad928SBarry Smith {
2514b9ad928SBarry Smith   PC_Shell *shell;
2524b9ad928SBarry Smith 
2534b9ad928SBarry Smith   PetscFunctionBegin;
2544b9ad928SBarry Smith   shell        = (PC_Shell*)pc->data;
2554b9ad928SBarry Smith   shell->apply = apply;
2564b9ad928SBarry Smith   PetscFunctionReturn(0);
2574b9ad928SBarry Smith }
2584b9ad928SBarry Smith EXTERN_C_END
2594b9ad928SBarry Smith 
2604b9ad928SBarry Smith EXTERN_C_BEGIN
2614b9ad928SBarry Smith #undef __FUNCT__
2627cdd61b2SBarry Smith #define __FUNCT__ "PCShellSetPreSolve_Shell"
263be29d3c6SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetPreSolve_Shell(PC pc,PetscErrorCode (*presolve)(void*,KSP,Vec,Vec))
2647cdd61b2SBarry Smith {
2657cdd61b2SBarry Smith   PC_Shell *shell;
2667cdd61b2SBarry Smith 
2677cdd61b2SBarry Smith   PetscFunctionBegin;
2687cdd61b2SBarry Smith   shell             = (PC_Shell*)pc->data;
2697cdd61b2SBarry Smith   shell->presolve   = presolve;
2709bbb2c88SBarry Smith   if (presolve) {
2719bbb2c88SBarry Smith     pc->ops->presolve = PCPreSolve_Shell;
2729bbb2c88SBarry Smith   } else {
2739bbb2c88SBarry Smith     pc->ops->presolve = 0;
2749bbb2c88SBarry Smith   }
2757cdd61b2SBarry Smith   PetscFunctionReturn(0);
2767cdd61b2SBarry Smith }
2777cdd61b2SBarry Smith EXTERN_C_END
2787cdd61b2SBarry Smith 
2797cdd61b2SBarry Smith EXTERN_C_BEGIN
2807cdd61b2SBarry Smith #undef __FUNCT__
2817cdd61b2SBarry Smith #define __FUNCT__ "PCShellSetPostSolve_Shell"
282be29d3c6SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetPostSolve_Shell(PC pc,PetscErrorCode (*postsolve)(void*,KSP,Vec,Vec))
2837cdd61b2SBarry Smith {
2847cdd61b2SBarry Smith   PC_Shell *shell;
2857cdd61b2SBarry Smith 
2867cdd61b2SBarry Smith   PetscFunctionBegin;
2877cdd61b2SBarry Smith   shell           = (PC_Shell*)pc->data;
2887cdd61b2SBarry Smith   shell->postsolve = postsolve;
2899bbb2c88SBarry Smith   if (postsolve) {
2909bbb2c88SBarry Smith     pc->ops->postsolve = PCPostSolve_Shell;
2919bbb2c88SBarry Smith   } else {
2929bbb2c88SBarry Smith     pc->ops->postsolve = 0;
2939bbb2c88SBarry Smith   }
2947cdd61b2SBarry Smith   PetscFunctionReturn(0);
2957cdd61b2SBarry Smith }
2967cdd61b2SBarry Smith EXTERN_C_END
2977cdd61b2SBarry Smith 
2987cdd61b2SBarry Smith EXTERN_C_BEGIN
2997cdd61b2SBarry Smith #undef __FUNCT__
3004b9ad928SBarry Smith #define __FUNCT__ "PCShellSetView_Shell"
301dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetView_Shell(PC pc,PetscErrorCode (*view)(void*,PetscViewer))
3024b9ad928SBarry Smith {
3034b9ad928SBarry Smith   PC_Shell *shell;
3044b9ad928SBarry Smith 
3054b9ad928SBarry Smith   PetscFunctionBegin;
3064b9ad928SBarry Smith   shell        = (PC_Shell*)pc->data;
3074b9ad928SBarry Smith   shell->view = view;
3084b9ad928SBarry Smith   PetscFunctionReturn(0);
3094b9ad928SBarry Smith }
3104b9ad928SBarry Smith EXTERN_C_END
3114b9ad928SBarry Smith 
3124b9ad928SBarry Smith EXTERN_C_BEGIN
3134b9ad928SBarry Smith #undef __FUNCT__
3144b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApplyTranspose_Shell"
315dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApplyTranspose_Shell(PC pc,PetscErrorCode (*applytranspose)(void*,Vec,Vec))
3164b9ad928SBarry Smith {
3174b9ad928SBarry Smith   PC_Shell *shell;
3184b9ad928SBarry Smith 
3194b9ad928SBarry Smith   PetscFunctionBegin;
3204b9ad928SBarry Smith   shell                 = (PC_Shell*)pc->data;
3214b9ad928SBarry Smith   shell->applytranspose = applytranspose;
3224b9ad928SBarry Smith   PetscFunctionReturn(0);
3234b9ad928SBarry Smith }
3244b9ad928SBarry Smith EXTERN_C_END
3254b9ad928SBarry Smith 
3264b9ad928SBarry Smith EXTERN_C_BEGIN
3274b9ad928SBarry Smith #undef __FUNCT__
3284b9ad928SBarry Smith #define __FUNCT__ "PCShellSetName_Shell"
329dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetName_Shell(PC pc,const char name[])
3304b9ad928SBarry Smith {
3314b9ad928SBarry Smith   PC_Shell       *shell;
332dfbe8321SBarry Smith   PetscErrorCode ierr;
3334b9ad928SBarry Smith 
3344b9ad928SBarry Smith   PetscFunctionBegin;
3354b9ad928SBarry Smith   shell = (PC_Shell*)pc->data;
336*18be62a5SSatish Balay   ierr  = PetscStrfree(shell->name);CHKERRQ(ierr);
3374b9ad928SBarry Smith   ierr  = PetscStrallocpy(name,&shell->name);CHKERRQ(ierr);
3384b9ad928SBarry Smith   PetscFunctionReturn(0);
3394b9ad928SBarry Smith }
3404b9ad928SBarry Smith EXTERN_C_END
3414b9ad928SBarry Smith 
3424b9ad928SBarry Smith EXTERN_C_BEGIN
3434b9ad928SBarry Smith #undef __FUNCT__
3444b9ad928SBarry Smith #define __FUNCT__ "PCShellGetName_Shell"
345dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellGetName_Shell(PC pc,char *name[])
3464b9ad928SBarry Smith {
3474b9ad928SBarry Smith   PC_Shell *shell;
3484b9ad928SBarry Smith 
3494b9ad928SBarry Smith   PetscFunctionBegin;
3504b9ad928SBarry Smith   shell  = (PC_Shell*)pc->data;
3514b9ad928SBarry Smith   *name  = shell->name;
3524b9ad928SBarry Smith   PetscFunctionReturn(0);
3534b9ad928SBarry Smith }
3544b9ad928SBarry Smith EXTERN_C_END
3554b9ad928SBarry Smith 
3564b9ad928SBarry Smith EXTERN_C_BEGIN
3574b9ad928SBarry Smith #undef __FUNCT__
3584b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApplyRichardson_Shell"
359be29d3c6SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApplyRichardson_Shell(PC pc,PetscErrorCode (*apply)(void*,Vec,Vec,Vec,PetscReal,PetscReal,PetscReal,PetscInt))
3604b9ad928SBarry Smith {
3614b9ad928SBarry Smith   PC_Shell *shell;
3624b9ad928SBarry Smith 
3634b9ad928SBarry Smith   PetscFunctionBegin;
3644b9ad928SBarry Smith   shell                     = (PC_Shell*)pc->data;
3654b9ad928SBarry Smith   pc->ops->applyrichardson  = PCApplyRichardson_Shell;
3664b9ad928SBarry Smith   shell->applyrich          = apply;
3674b9ad928SBarry Smith   PetscFunctionReturn(0);
3684b9ad928SBarry Smith }
3694b9ad928SBarry Smith EXTERN_C_END
3704b9ad928SBarry Smith 
3714b9ad928SBarry Smith /* -------------------------------------------------------------------------------*/
3724b9ad928SBarry Smith 
3734b9ad928SBarry Smith #undef __FUNCT__
374*18be62a5SSatish Balay #define __FUNCT__ "PCShellSetDestroy"
375*18be62a5SSatish Balay /*@C
376*18be62a5SSatish Balay    PCShellSetDestroy - Sets routine to use to destroy the user-provided
377*18be62a5SSatish Balay    application context.
378*18be62a5SSatish Balay 
379*18be62a5SSatish Balay    Collective on PC
380*18be62a5SSatish Balay 
381*18be62a5SSatish Balay    Input Parameters:
382*18be62a5SSatish Balay +  pc - the preconditioner context
383*18be62a5SSatish Balay .  destroy - the application-provided destroy routine
384*18be62a5SSatish Balay 
385*18be62a5SSatish Balay    Calling sequence of destroy:
386*18be62a5SSatish Balay .vb
387*18be62a5SSatish Balay    PetscErrorCode destroy (void *ptr)
388*18be62a5SSatish Balay .ve
389*18be62a5SSatish Balay 
390*18be62a5SSatish Balay .  ptr - the application context
391*18be62a5SSatish Balay 
392*18be62a5SSatish Balay    Level: developer
393*18be62a5SSatish Balay 
394*18be62a5SSatish Balay .keywords: PC, shell, set, destroy, user-provided
395*18be62a5SSatish Balay 
396*18be62a5SSatish Balay .seealso: PCShellSetApply(), PCShellSetContext()
397*18be62a5SSatish Balay @*/
398*18be62a5SSatish Balay PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetDestroy(PC pc,PetscErrorCode (*destroy)(void*))
399*18be62a5SSatish Balay {
400*18be62a5SSatish Balay   PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*));
401*18be62a5SSatish Balay 
402*18be62a5SSatish Balay   PetscFunctionBegin;
403*18be62a5SSatish Balay   PetscValidHeaderSpecific(pc,PC_COOKIE,1);
404*18be62a5SSatish Balay   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetDestroy_C",(void (**)(void))&f);CHKERRQ(ierr);
405*18be62a5SSatish Balay   if (f) {
406*18be62a5SSatish Balay     ierr = (*f)(pc,destroy);CHKERRQ(ierr);
407*18be62a5SSatish Balay   }
408*18be62a5SSatish Balay   PetscFunctionReturn(0);
409*18be62a5SSatish Balay }
410*18be62a5SSatish Balay 
411*18be62a5SSatish Balay 
412*18be62a5SSatish Balay #undef __FUNCT__
4134b9ad928SBarry Smith #define __FUNCT__ "PCShellSetSetUp"
4144b9ad928SBarry Smith /*@C
4154b9ad928SBarry Smith    PCShellSetSetUp - Sets routine to use to "setup" the preconditioner whenever the
4164b9ad928SBarry Smith    matrix operator is changed.
4174b9ad928SBarry Smith 
4184b9ad928SBarry Smith    Collective on PC
4194b9ad928SBarry Smith 
4204b9ad928SBarry Smith    Input Parameters:
4214b9ad928SBarry Smith +  pc - the preconditioner context
4224b9ad928SBarry Smith .  setup - the application-provided setup routine
4234b9ad928SBarry Smith 
4244b9ad928SBarry Smith    Calling sequence of setup:
4254b9ad928SBarry Smith .vb
42613f74950SBarry Smith    PetscErrorCode setup (void *ptr)
4274b9ad928SBarry Smith .ve
4284b9ad928SBarry Smith 
4294b9ad928SBarry Smith .  ptr - the application context
4304b9ad928SBarry Smith 
4314b9ad928SBarry Smith    Level: developer
4324b9ad928SBarry Smith 
4334b9ad928SBarry Smith .keywords: PC, shell, set, setup, user-provided
4344b9ad928SBarry Smith 
435be29d3c6SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetApply(), PCShellSetContext()
4364b9ad928SBarry Smith @*/
437dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetSetUp(PC pc,PetscErrorCode (*setup)(void*))
4384b9ad928SBarry Smith {
4396849ba73SBarry Smith   PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*));
4404b9ad928SBarry Smith 
4414b9ad928SBarry Smith   PetscFunctionBegin;
4424482741eSBarry Smith   PetscValidHeaderSpecific(pc,PC_COOKIE,1);
4434b9ad928SBarry Smith   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetSetUp_C",(void (**)(void))&f);CHKERRQ(ierr);
4444b9ad928SBarry Smith   if (f) {
4454b9ad928SBarry Smith     ierr = (*f)(pc,setup);CHKERRQ(ierr);
4464b9ad928SBarry Smith   }
4474b9ad928SBarry Smith   PetscFunctionReturn(0);
4484b9ad928SBarry Smith }
4494b9ad928SBarry Smith 
4504b9ad928SBarry Smith 
4514b9ad928SBarry Smith #undef __FUNCT__
4524b9ad928SBarry Smith #define __FUNCT__ "PCShellSetView"
4534b9ad928SBarry Smith /*@C
4544b9ad928SBarry Smith    PCShellSetView - Sets routine to use as viewer of shell preconditioner
4554b9ad928SBarry Smith 
4564b9ad928SBarry Smith    Collective on PC
4574b9ad928SBarry Smith 
4584b9ad928SBarry Smith    Input Parameters:
4594b9ad928SBarry Smith +  pc - the preconditioner context
4604b9ad928SBarry Smith -  view - the application-provided view routine
4614b9ad928SBarry Smith 
4624b9ad928SBarry Smith    Calling sequence of apply:
4634b9ad928SBarry Smith .vb
46413f74950SBarry Smith    PetscErrorCode view(void *ptr,PetscViewer v)
4654b9ad928SBarry Smith .ve
4664b9ad928SBarry Smith 
4674b9ad928SBarry Smith +  ptr - the application context
4684b9ad928SBarry Smith -  v   - viewer
4694b9ad928SBarry Smith 
4704b9ad928SBarry Smith    Level: developer
4714b9ad928SBarry Smith 
4724b9ad928SBarry Smith .keywords: PC, shell, set, apply, user-provided
4734b9ad928SBarry Smith 
4744b9ad928SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose()
4754b9ad928SBarry Smith @*/
476dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetView(PC pc,PetscErrorCode (*view)(void*,PetscViewer))
4774b9ad928SBarry Smith {
4786849ba73SBarry Smith   PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*,PetscViewer));
4794b9ad928SBarry Smith 
4804b9ad928SBarry Smith   PetscFunctionBegin;
4814482741eSBarry Smith   PetscValidHeaderSpecific(pc,PC_COOKIE,1);
4824b9ad928SBarry Smith   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetView_C",(void (**)(void))&f);CHKERRQ(ierr);
4834b9ad928SBarry Smith   if (f) {
4844b9ad928SBarry Smith     ierr = (*f)(pc,view);CHKERRQ(ierr);
4854b9ad928SBarry Smith   }
4864b9ad928SBarry Smith   PetscFunctionReturn(0);
4874b9ad928SBarry Smith }
4884b9ad928SBarry Smith 
4894b9ad928SBarry Smith #undef __FUNCT__
4904b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApply"
4914b9ad928SBarry Smith /*@C
4924b9ad928SBarry Smith    PCShellSetApply - Sets routine to use as preconditioner.
4934b9ad928SBarry Smith 
4944b9ad928SBarry Smith    Collective on PC
4954b9ad928SBarry Smith 
4964b9ad928SBarry Smith    Input Parameters:
4974b9ad928SBarry Smith +  pc - the preconditioner context
498be29d3c6SBarry Smith -  apply - the application-provided preconditioning routine
4994b9ad928SBarry Smith 
5004b9ad928SBarry Smith    Calling sequence of apply:
5014b9ad928SBarry Smith .vb
50213f74950SBarry Smith    PetscErrorCode apply (void *ptr,Vec xin,Vec xout)
5034b9ad928SBarry Smith .ve
5044b9ad928SBarry Smith 
5054b9ad928SBarry Smith +  ptr - the application context
5064b9ad928SBarry Smith .  xin - input vector
5074b9ad928SBarry Smith -  xout - output vector
5084b9ad928SBarry Smith 
5094b9ad928SBarry Smith    Level: developer
5104b9ad928SBarry Smith 
5114b9ad928SBarry Smith .keywords: PC, shell, set, apply, user-provided
5124b9ad928SBarry Smith 
513be29d3c6SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose(), PCShellSetContext()
5144b9ad928SBarry Smith @*/
515be29d3c6SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApply(PC pc,PetscErrorCode (*apply)(void*,Vec,Vec))
5164b9ad928SBarry Smith {
517be29d3c6SBarry Smith   PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*,Vec,Vec));
5184b9ad928SBarry Smith 
5194b9ad928SBarry Smith   PetscFunctionBegin;
5204482741eSBarry Smith   PetscValidHeaderSpecific(pc,PC_COOKIE,1);
5214b9ad928SBarry Smith   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetApply_C",(void (**)(void))&f);CHKERRQ(ierr);
5224b9ad928SBarry Smith   if (f) {
523be29d3c6SBarry Smith     ierr = (*f)(pc,apply);CHKERRQ(ierr);
5244b9ad928SBarry Smith   }
5254b9ad928SBarry Smith   PetscFunctionReturn(0);
5264b9ad928SBarry Smith }
5274b9ad928SBarry Smith 
5284b9ad928SBarry Smith #undef __FUNCT__
5294b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApplyTranspose"
5304b9ad928SBarry Smith /*@C
5314b9ad928SBarry Smith    PCShellSetApplyTranspose - Sets routine to use as preconditioner transpose.
5324b9ad928SBarry Smith 
5334b9ad928SBarry Smith    Collective on PC
5344b9ad928SBarry Smith 
5354b9ad928SBarry Smith    Input Parameters:
5364b9ad928SBarry Smith +  pc - the preconditioner context
5374b9ad928SBarry Smith -  apply - the application-provided preconditioning transpose routine
5384b9ad928SBarry Smith 
5394b9ad928SBarry Smith    Calling sequence of apply:
5404b9ad928SBarry Smith .vb
54113f74950SBarry Smith    PetscErrorCode applytranspose (void *ptr,Vec xin,Vec xout)
5424b9ad928SBarry Smith .ve
5434b9ad928SBarry Smith 
5444b9ad928SBarry Smith +  ptr - the application context
5454b9ad928SBarry Smith .  xin - input vector
5464b9ad928SBarry Smith -  xout - output vector
5474b9ad928SBarry Smith 
5484b9ad928SBarry Smith    Level: developer
5494b9ad928SBarry Smith 
5504b9ad928SBarry Smith    Notes:
5514b9ad928SBarry Smith    Uses the same context variable as PCShellSetApply().
5524b9ad928SBarry Smith 
5534b9ad928SBarry Smith .keywords: PC, shell, set, apply, user-provided
5544b9ad928SBarry Smith 
555be29d3c6SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApply(), PCSetContext()
5564b9ad928SBarry Smith @*/
557dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApplyTranspose(PC pc,PetscErrorCode (*applytranspose)(void*,Vec,Vec))
5584b9ad928SBarry Smith {
5596849ba73SBarry Smith   PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*,Vec,Vec));
5604b9ad928SBarry Smith 
5614b9ad928SBarry Smith   PetscFunctionBegin;
5624482741eSBarry Smith   PetscValidHeaderSpecific(pc,PC_COOKIE,1);
5634b9ad928SBarry Smith   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetApplyTranspose_C",(void (**)(void))&f);CHKERRQ(ierr);
5644b9ad928SBarry Smith   if (f) {
5654b9ad928SBarry Smith     ierr = (*f)(pc,applytranspose);CHKERRQ(ierr);
5664b9ad928SBarry Smith   }
5674b9ad928SBarry Smith   PetscFunctionReturn(0);
5684b9ad928SBarry Smith }
5694b9ad928SBarry Smith 
5704b9ad928SBarry Smith #undef __FUNCT__
5717cdd61b2SBarry Smith #define __FUNCT__ "PCShellSetPreSolve"
5727cdd61b2SBarry Smith /*@C
5737cdd61b2SBarry Smith    PCShellSetPreSolve - Sets routine to apply to the operators/vectors before a KSPSolve() is
5747cdd61b2SBarry Smith       applied. This usually does something like scale the linear system in some application
5757cdd61b2SBarry Smith       specific way.
5767cdd61b2SBarry Smith 
5777cdd61b2SBarry Smith    Collective on PC
5787cdd61b2SBarry Smith 
5797cdd61b2SBarry Smith    Input Parameters:
5807cdd61b2SBarry Smith +  pc - the preconditioner context
5817cdd61b2SBarry Smith -  presolve - the application-provided presolve routine
5827cdd61b2SBarry Smith 
5837cdd61b2SBarry Smith    Calling sequence of presolve:
5847cdd61b2SBarry Smith .vb
5857cdd61b2SBarry Smith    PetscErrorCode presolve (void *ptr,KSP ksp,Vec b,Vec x)
5867cdd61b2SBarry Smith .ve
5877cdd61b2SBarry Smith 
5887cdd61b2SBarry Smith +  ptr - the application context
5897cdd61b2SBarry Smith .  xin - input vector
5907cdd61b2SBarry Smith -  xout - output vector
5917cdd61b2SBarry Smith 
5927cdd61b2SBarry Smith    Level: developer
5937cdd61b2SBarry Smith 
5947cdd61b2SBarry Smith .keywords: PC, shell, set, apply, user-provided
5957cdd61b2SBarry Smith 
596be29d3c6SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose(), PCShellSetPostSolve(), PCShellSetContext()
5977cdd61b2SBarry Smith @*/
5987cdd61b2SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetPreSolve(PC pc,PetscErrorCode (*presolve)(void*,KSP,Vec,Vec))
5997cdd61b2SBarry Smith {
6007cdd61b2SBarry Smith   PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*,KSP,Vec,Vec));
6017cdd61b2SBarry Smith 
6027cdd61b2SBarry Smith   PetscFunctionBegin;
6037cdd61b2SBarry Smith   PetscValidHeaderSpecific(pc,PC_COOKIE,1);
6047cdd61b2SBarry Smith   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetPreSolve_C",(void (**)(void))&f);CHKERRQ(ierr);
6057cdd61b2SBarry Smith   if (f) {
6067cdd61b2SBarry Smith     ierr = (*f)(pc,presolve);CHKERRQ(ierr);
6077cdd61b2SBarry Smith   }
6087cdd61b2SBarry Smith   PetscFunctionReturn(0);
6097cdd61b2SBarry Smith }
6107cdd61b2SBarry Smith 
6117cdd61b2SBarry Smith #undef __FUNCT__
6127cdd61b2SBarry Smith #define __FUNCT__ "PCShellSetPostSolve"
6137cdd61b2SBarry Smith /*@C
6147cdd61b2SBarry Smith    PCShellSetPostSolve - Sets routine to apply to the operators/vectors before a KSPSolve() is
6157cdd61b2SBarry Smith       applied. This usually does something like scale the linear system in some application
6167cdd61b2SBarry Smith       specific way.
6177cdd61b2SBarry Smith 
6187cdd61b2SBarry Smith    Collective on PC
6197cdd61b2SBarry Smith 
6207cdd61b2SBarry Smith    Input Parameters:
6217cdd61b2SBarry Smith +  pc - the preconditioner context
6227cdd61b2SBarry Smith -  postsolve - the application-provided presolve routine
6237cdd61b2SBarry Smith 
6247cdd61b2SBarry Smith    Calling sequence of postsolve:
6257cdd61b2SBarry Smith .vb
6267cdd61b2SBarry Smith    PetscErrorCode postsolve(void *ptr,KSP ksp,Vec b,Vec x)
6277cdd61b2SBarry Smith .ve
6287cdd61b2SBarry Smith 
6297cdd61b2SBarry Smith +  ptr - the application context
6307cdd61b2SBarry Smith .  xin - input vector
6317cdd61b2SBarry Smith -  xout - output vector
6327cdd61b2SBarry Smith 
6337cdd61b2SBarry Smith    Level: developer
6347cdd61b2SBarry Smith 
6357cdd61b2SBarry Smith .keywords: PC, shell, set, apply, user-provided
6367cdd61b2SBarry Smith 
637be29d3c6SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose(), PCShellSetPreSolve(), PCShellSetContext()
6387cdd61b2SBarry Smith @*/
6397cdd61b2SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetPostSolve(PC pc,PetscErrorCode (*postsolve)(void*,KSP,Vec,Vec))
6407cdd61b2SBarry Smith {
6417cdd61b2SBarry Smith   PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*,KSP,Vec,Vec));
6427cdd61b2SBarry Smith 
6437cdd61b2SBarry Smith   PetscFunctionBegin;
6447cdd61b2SBarry Smith   PetscValidHeaderSpecific(pc,PC_COOKIE,1);
6457cdd61b2SBarry Smith   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetPostSolve_C",(void (**)(void))&f);CHKERRQ(ierr);
6467cdd61b2SBarry Smith   if (f) {
6477cdd61b2SBarry Smith     ierr = (*f)(pc,postsolve);CHKERRQ(ierr);
6487cdd61b2SBarry Smith   }
6497cdd61b2SBarry Smith   PetscFunctionReturn(0);
6507cdd61b2SBarry Smith }
6517cdd61b2SBarry Smith 
6527cdd61b2SBarry Smith #undef __FUNCT__
6534b9ad928SBarry Smith #define __FUNCT__ "PCShellSetName"
6544b9ad928SBarry Smith /*@C
6554b9ad928SBarry Smith    PCShellSetName - Sets an optional name to associate with a shell
6564b9ad928SBarry Smith    preconditioner.
6574b9ad928SBarry Smith 
6584b9ad928SBarry Smith    Not Collective
6594b9ad928SBarry Smith 
6604b9ad928SBarry Smith    Input Parameters:
6614b9ad928SBarry Smith +  pc - the preconditioner context
6624b9ad928SBarry Smith -  name - character string describing shell preconditioner
6634b9ad928SBarry Smith 
6644b9ad928SBarry Smith    Level: developer
6654b9ad928SBarry Smith 
6664b9ad928SBarry Smith .keywords: PC, shell, set, name, user-provided
6674b9ad928SBarry Smith 
6684b9ad928SBarry Smith .seealso: PCShellGetName()
6694b9ad928SBarry Smith @*/
670dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetName(PC pc,const char name[])
6714b9ad928SBarry Smith {
672dfbe8321SBarry Smith   PetscErrorCode ierr,(*f)(PC,const char []);
6734b9ad928SBarry Smith 
6744b9ad928SBarry Smith   PetscFunctionBegin;
6754482741eSBarry Smith   PetscValidHeaderSpecific(pc,PC_COOKIE,1);
6764b9ad928SBarry Smith   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetName_C",(void (**)(void))&f);CHKERRQ(ierr);
6774b9ad928SBarry Smith   if (f) {
6784b9ad928SBarry Smith     ierr = (*f)(pc,name);CHKERRQ(ierr);
6794b9ad928SBarry Smith   }
6804b9ad928SBarry Smith   PetscFunctionReturn(0);
6814b9ad928SBarry Smith }
6824b9ad928SBarry Smith 
6834b9ad928SBarry Smith #undef __FUNCT__
6844b9ad928SBarry Smith #define __FUNCT__ "PCShellGetName"
6854b9ad928SBarry Smith /*@C
6864b9ad928SBarry Smith    PCShellGetName - Gets an optional name that the user has set for a shell
6874b9ad928SBarry Smith    preconditioner.
6884b9ad928SBarry Smith 
6894b9ad928SBarry Smith    Not Collective
6904b9ad928SBarry Smith 
6914b9ad928SBarry Smith    Input Parameter:
6924b9ad928SBarry Smith .  pc - the preconditioner context
6934b9ad928SBarry Smith 
6944b9ad928SBarry Smith    Output Parameter:
6954b9ad928SBarry Smith .  name - character string describing shell preconditioner (you should not free this)
6964b9ad928SBarry Smith 
6974b9ad928SBarry Smith    Level: developer
6984b9ad928SBarry Smith 
6994b9ad928SBarry Smith .keywords: PC, shell, get, name, user-provided
7004b9ad928SBarry Smith 
7014b9ad928SBarry Smith .seealso: PCShellSetName()
7024b9ad928SBarry Smith @*/
703dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellGetName(PC pc,char *name[])
7044b9ad928SBarry Smith {
705dfbe8321SBarry Smith   PetscErrorCode ierr,(*f)(PC,char *[]);
7064b9ad928SBarry Smith 
7074b9ad928SBarry Smith   PetscFunctionBegin;
7084482741eSBarry Smith   PetscValidHeaderSpecific(pc,PC_COOKIE,1);
7094482741eSBarry Smith   PetscValidPointer(name,2);
7104b9ad928SBarry Smith   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellGetName_C",(void (**)(void))&f);CHKERRQ(ierr);
7114b9ad928SBarry Smith   if (f) {
7124b9ad928SBarry Smith     ierr = (*f)(pc,name);CHKERRQ(ierr);
7134b9ad928SBarry Smith   } else {
7141302d50aSBarry Smith     SETERRQ(PETSC_ERR_ARG_WRONG,"Not shell preconditioner, cannot get name");
7154b9ad928SBarry Smith   }
7164b9ad928SBarry Smith   PetscFunctionReturn(0);
7174b9ad928SBarry Smith }
7184b9ad928SBarry Smith 
7194b9ad928SBarry Smith #undef __FUNCT__
7204b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApplyRichardson"
7214b9ad928SBarry Smith /*@C
7224b9ad928SBarry Smith    PCShellSetApplyRichardson - Sets routine to use as preconditioner
7234b9ad928SBarry Smith    in Richardson iteration.
7244b9ad928SBarry Smith 
7254b9ad928SBarry Smith    Collective on PC
7264b9ad928SBarry Smith 
7274b9ad928SBarry Smith    Input Parameters:
7284b9ad928SBarry Smith +  pc - the preconditioner context
729be29d3c6SBarry Smith -  apply - the application-provided preconditioning routine
7304b9ad928SBarry Smith 
7314b9ad928SBarry Smith    Calling sequence of apply:
7324b9ad928SBarry Smith .vb
73313f74950SBarry Smith    PetscErrorCode apply (void *ptr,Vec b,Vec x,Vec r,PetscReal rtol,PetscReal abstol,PetscReal dtol,PetscInt maxits)
7344b9ad928SBarry Smith .ve
7354b9ad928SBarry Smith 
7364b9ad928SBarry Smith +  ptr - the application context
7374b9ad928SBarry Smith .  b - right-hand-side
7384b9ad928SBarry Smith .  x - current iterate
7394b9ad928SBarry Smith .  r - work space
7404b9ad928SBarry Smith .  rtol - relative tolerance of residual norm to stop at
74170441072SBarry Smith .  abstol - absolute tolerance of residual norm to stop at
7424b9ad928SBarry Smith .  dtol - if residual norm increases by this factor than return
7434b9ad928SBarry Smith -  maxits - number of iterations to run
7444b9ad928SBarry Smith 
7454b9ad928SBarry Smith    Level: developer
7464b9ad928SBarry Smith 
7474b9ad928SBarry Smith .keywords: PC, shell, set, apply, Richardson, user-provided
7484b9ad928SBarry Smith 
749be29d3c6SBarry Smith .seealso: PCShellSetApply(), PCShellSetContext()
7504b9ad928SBarry Smith @*/
751be29d3c6SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApplyRichardson(PC pc,PetscErrorCode (*apply)(void*,Vec,Vec,Vec,PetscReal,PetscReal,PetscReal,PetscInt))
7524b9ad928SBarry Smith {
753be29d3c6SBarry Smith   PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*,Vec,Vec,Vec,PetscReal,PetscReal,PetscReal,PetscInt));
7544b9ad928SBarry Smith 
7554b9ad928SBarry Smith   PetscFunctionBegin;
7564482741eSBarry Smith   PetscValidHeaderSpecific(pc,PC_COOKIE,1);
7574b9ad928SBarry Smith   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetApplyRichardson_C",(void (**)(void))&f);CHKERRQ(ierr);
7584b9ad928SBarry Smith   if (f) {
759be29d3c6SBarry Smith     ierr = (*f)(pc,apply);CHKERRQ(ierr);
7604b9ad928SBarry Smith   }
7614b9ad928SBarry Smith   PetscFunctionReturn(0);
7624b9ad928SBarry Smith }
7634b9ad928SBarry Smith 
7644b9ad928SBarry Smith /*MC
7654b9ad928SBarry Smith    PCSHELL - Creates a new preconditioner class for use with your
7664b9ad928SBarry Smith               own private data storage format.
7674b9ad928SBarry Smith 
7684b9ad928SBarry Smith    Level: advanced
7694b9ad928SBarry Smith 
7704b9ad928SBarry Smith    Concepts: providing your own preconditioner
7714b9ad928SBarry Smith 
7724b9ad928SBarry Smith   Usage:
7736849ba73SBarry Smith $             PetscErrorCode (*mult)(void*,Vec,Vec);
7746849ba73SBarry Smith $             PetscErrorCode (*setup)(void*);
7754b9ad928SBarry Smith $             PCCreate(comm,&pc);
7764b9ad928SBarry Smith $             PCSetType(pc,PCSHELL);
777be29d3c6SBarry Smith $             PCShellSetApply(pc,mult);
778be29d3c6SBarry Smith $             PCShellSetContext(pc,ctx)
7794b9ad928SBarry Smith $             PCShellSetSetUp(pc,setup);       (optional)
7804b9ad928SBarry Smith 
7814b9ad928SBarry Smith .seealso:  PCCreate(), PCSetType(), PCType (for list of available types), PC,
782d07a9264SSatish Balay            MATSHELL, PCShellSetUp(), PCShellSetApply(), PCShellSetView(),
7834b9ad928SBarry Smith            PCShellSetApplyTranpose(), PCShellSetName(), PCShellSetApplyRichardson(),
784be29d3c6SBarry Smith            PCShellGetName(), PCShellSetContext(), PCShellGetContext()
7854b9ad928SBarry Smith M*/
7864b9ad928SBarry Smith 
7874b9ad928SBarry Smith EXTERN_C_BEGIN
7884b9ad928SBarry Smith #undef __FUNCT__
7894b9ad928SBarry Smith #define __FUNCT__ "PCCreate_Shell"
790dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCCreate_Shell(PC pc)
7914b9ad928SBarry Smith {
792dfbe8321SBarry Smith   PetscErrorCode ierr;
7934b9ad928SBarry Smith   PC_Shell       *shell;
7944b9ad928SBarry Smith 
7954b9ad928SBarry Smith   PetscFunctionBegin;
7964b9ad928SBarry Smith   pc->ops->destroy    = PCDestroy_Shell;
7974b9ad928SBarry Smith   ierr                = PetscNew(PC_Shell,&shell);CHKERRQ(ierr);
79852e6d16bSBarry Smith   ierr = PetscLogObjectMemory(pc,sizeof(PC_Shell));CHKERRQ(ierr);
7994b9ad928SBarry Smith   pc->data         = (void*)shell;
8004b9ad928SBarry Smith   pc->name         = 0;
8014b9ad928SBarry Smith 
8024b9ad928SBarry Smith   pc->ops->apply           = PCApply_Shell;
8034b9ad928SBarry Smith   pc->ops->view            = PCView_Shell;
8044b9ad928SBarry Smith   pc->ops->applytranspose  = PCApplyTranspose_Shell;
8054b9ad928SBarry Smith   pc->ops->applyrichardson = 0;
8064b9ad928SBarry Smith   pc->ops->setup           = PCSetUp_Shell;
8079bbb2c88SBarry Smith   pc->ops->presolve        = 0;
8089bbb2c88SBarry Smith   pc->ops->postsolve       = 0;
8094b9ad928SBarry Smith   pc->ops->view            = PCView_Shell;
8104b9ad928SBarry Smith 
8114b9ad928SBarry Smith   shell->apply          = 0;
8124b9ad928SBarry Smith   shell->applytranspose = 0;
8134b9ad928SBarry Smith   shell->name           = 0;
8144b9ad928SBarry Smith   shell->applyrich      = 0;
8157cdd61b2SBarry Smith   shell->presolve       = 0;
8167cdd61b2SBarry Smith   shell->postsolve      = 0;
8174b9ad928SBarry Smith   shell->ctx            = 0;
8184b9ad928SBarry Smith   shell->setup          = 0;
8194b9ad928SBarry Smith   shell->view           = 0;
820*18be62a5SSatish Balay   shell->destroy        = 0;
8214b9ad928SBarry Smith 
822*18be62a5SSatish Balay   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetDestroy_C","PCShellSetDestroy_Shell",
823*18be62a5SSatish Balay                     PCShellSetDestroy_Shell);CHKERRQ(ierr);
8244b9ad928SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetSetUp_C","PCShellSetSetUp_Shell",
8254b9ad928SBarry Smith                     PCShellSetSetUp_Shell);CHKERRQ(ierr);
8264b9ad928SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetApply_C","PCShellSetApply_Shell",
8274b9ad928SBarry Smith                     PCShellSetApply_Shell);CHKERRQ(ierr);
8287cdd61b2SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetPreSolve_C","PCShellSetPreSolve_Shell",
8297cdd61b2SBarry Smith                     PCShellSetPreSolve_Shell);CHKERRQ(ierr);
8307cdd61b2SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetPostSolve_C","PCShellSetPostSolve_Shell",
8317cdd61b2SBarry Smith                     PCShellSetPostSolve_Shell);CHKERRQ(ierr);
8324b9ad928SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetView_C","PCShellSetView_Shell",
8334b9ad928SBarry Smith                     PCShellSetView_Shell);CHKERRQ(ierr);
834be29d3c6SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetApplyTranspose_C","PCShellSetApplyTranspose_Shell",
8354b9ad928SBarry Smith                     PCShellSetApplyTranspose_Shell);CHKERRQ(ierr);
8364b9ad928SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetName_C","PCShellSetName_Shell",
8374b9ad928SBarry Smith                     PCShellSetName_Shell);CHKERRQ(ierr);
8384b9ad928SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellGetName_C","PCShellGetName_Shell",
8394b9ad928SBarry Smith                     PCShellGetName_Shell);CHKERRQ(ierr);
840be29d3c6SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetApplyRichardson_C","PCShellSetApplyRichardson_Shell",
8414b9ad928SBarry Smith                     PCShellSetApplyRichardson_Shell);CHKERRQ(ierr);
8424b9ad928SBarry Smith   PetscFunctionReturn(0);
8434b9ad928SBarry Smith }
8444b9ad928SBarry Smith EXTERN_C_END
8454b9ad928SBarry Smith 
8464b9ad928SBarry Smith 
8474b9ad928SBarry Smith 
8484b9ad928SBarry Smith 
8494b9ad928SBarry Smith 
8504b9ad928SBarry Smith 
851