xref: /petsc/src/ksp/pc/impls/shell/shellpc.c (revision 05b42c5fbeb981b578319140e7e668b42ba3bbd1)
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 
86356e834SBarry Smith #include "private/pcimpl.h"        /*I "petscpc.h" I*/
91d8d5f9aSSatish Balay #include "private/vecimpl.h"
104b9ad928SBarry Smith 
11ac226902SBarry Smith EXTERN_C_BEGIN
124b9ad928SBarry Smith typedef struct {
13be29d3c6SBarry Smith   void           *ctx;                     /* user provided contexts for preconditioner */
1418be62a5SSatish 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__
9618be62a5SSatish 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) {
105e9a2bbcdSBarry Smith     CHKMEMQ;
1064b9ad928SBarry Smith     ierr  = (*shell->setup)(shell->ctx);CHKERRQ(ierr);
107e9a2bbcdSBarry Smith     CHKMEMQ;
1084b9ad928SBarry Smith   }
1094b9ad928SBarry Smith   PetscFunctionReturn(0);
1104b9ad928SBarry Smith }
1114b9ad928SBarry Smith 
1124b9ad928SBarry Smith #undef __FUNCT__
1134b9ad928SBarry Smith #define __FUNCT__ "PCApply_Shell"
1146849ba73SBarry Smith static PetscErrorCode PCApply_Shell(PC pc,Vec x,Vec y)
1154b9ad928SBarry Smith {
1164b9ad928SBarry Smith   PC_Shell       *shell;
117dfbe8321SBarry Smith   PetscErrorCode ierr;
1184b9ad928SBarry Smith 
1194b9ad928SBarry Smith   PetscFunctionBegin;
1204b9ad928SBarry Smith   shell = (PC_Shell*)pc->data;
1211302d50aSBarry Smith   if (!shell->apply) SETERRQ(PETSC_ERR_USER,"No apply() routine provided to Shell PC");
122e9a2bbcdSBarry Smith   PetscStackPush("PCSHELL user function");
123e9a2bbcdSBarry Smith   CHKMEMQ;
1244b9ad928SBarry Smith   ierr  = (*shell->apply)(shell->ctx,x,y);CHKERRQ(ierr);
125e9a2bbcdSBarry Smith   CHKMEMQ;
126e9a2bbcdSBarry Smith   PetscStackPop;
1274b9ad928SBarry Smith   PetscFunctionReturn(0);
1284b9ad928SBarry Smith }
1294b9ad928SBarry Smith 
1304b9ad928SBarry Smith #undef __FUNCT__
1317cdd61b2SBarry Smith #define __FUNCT__ "PCPreSolve_Shell"
1327cdd61b2SBarry Smith static PetscErrorCode PCPreSolve_Shell(PC pc,KSP ksp,Vec b,Vec x)
1337cdd61b2SBarry Smith {
1347cdd61b2SBarry Smith   PC_Shell       *shell;
1357cdd61b2SBarry Smith   PetscErrorCode ierr;
1367cdd61b2SBarry Smith 
1377cdd61b2SBarry Smith   PetscFunctionBegin;
1387cdd61b2SBarry Smith   shell = (PC_Shell*)pc->data;
13991ad8336SSatish Balay   if (!shell->presolve) SETERRQ(PETSC_ERR_USER,"No presolve() routine provided to Shell PC");
1407cdd61b2SBarry Smith   ierr  = (*shell->presolve)(shell->ctx,ksp,b,x);CHKERRQ(ierr);
1417cdd61b2SBarry Smith   PetscFunctionReturn(0);
1427cdd61b2SBarry Smith }
1437cdd61b2SBarry Smith 
1447cdd61b2SBarry Smith #undef __FUNCT__
1457cdd61b2SBarry Smith #define __FUNCT__ "PCPostSolve_Shell"
1467cdd61b2SBarry Smith static PetscErrorCode PCPostSolve_Shell(PC pc,KSP ksp,Vec b,Vec x)
1477cdd61b2SBarry Smith {
1487cdd61b2SBarry Smith   PC_Shell       *shell;
1497cdd61b2SBarry Smith   PetscErrorCode ierr;
1507cdd61b2SBarry Smith 
1517cdd61b2SBarry Smith   PetscFunctionBegin;
1527cdd61b2SBarry Smith   shell = (PC_Shell*)pc->data;
15391ad8336SSatish Balay   if (!shell->postsolve) SETERRQ(PETSC_ERR_USER,"No postsolve() routine provided to Shell PC");
15491ad8336SSatish Balay   ierr  = (*shell->postsolve)(shell->ctx,ksp,b,x);CHKERRQ(ierr);
1557cdd61b2SBarry Smith   PetscFunctionReturn(0);
1567cdd61b2SBarry Smith }
1577cdd61b2SBarry Smith 
1587cdd61b2SBarry Smith #undef __FUNCT__
1594b9ad928SBarry Smith #define __FUNCT__ "PCApplyTranspose_Shell"
1606849ba73SBarry Smith static PetscErrorCode PCApplyTranspose_Shell(PC pc,Vec x,Vec y)
1614b9ad928SBarry Smith {
1624b9ad928SBarry Smith   PC_Shell       *shell;
163dfbe8321SBarry Smith   PetscErrorCode ierr;
1644b9ad928SBarry Smith 
1654b9ad928SBarry Smith   PetscFunctionBegin;
1664b9ad928SBarry Smith   shell = (PC_Shell*)pc->data;
1671302d50aSBarry Smith   if (!shell->applytranspose) SETERRQ(PETSC_ERR_USER,"No applytranspose() routine provided to Shell PC");
1684b9ad928SBarry Smith   ierr  = (*shell->applytranspose)(shell->ctx,x,y);CHKERRQ(ierr);
1694b9ad928SBarry Smith   PetscFunctionReturn(0);
1704b9ad928SBarry Smith }
1714b9ad928SBarry Smith 
1724b9ad928SBarry Smith #undef __FUNCT__
1734b9ad928SBarry Smith #define __FUNCT__ "PCApplyRichardson_Shell"
17413f74950SBarry Smith static PetscErrorCode PCApplyRichardson_Shell(PC pc,Vec x,Vec y,Vec w,PetscReal rtol,PetscReal abstol, PetscReal dtol,PetscInt it)
1754b9ad928SBarry Smith {
176dfbe8321SBarry Smith   PetscErrorCode ierr;
1774b9ad928SBarry Smith   PC_Shell       *shell;
1784b9ad928SBarry Smith 
1794b9ad928SBarry Smith   PetscFunctionBegin;
1804b9ad928SBarry Smith   shell = (PC_Shell*)pc->data;
181be29d3c6SBarry Smith   ierr  = (*shell->applyrich)(shell->ctx,x,y,w,rtol,abstol,dtol,it);CHKERRQ(ierr);
1824b9ad928SBarry Smith   PetscFunctionReturn(0);
1834b9ad928SBarry Smith }
1844b9ad928SBarry Smith 
1854b9ad928SBarry Smith #undef __FUNCT__
1864b9ad928SBarry Smith #define __FUNCT__ "PCDestroy_Shell"
1876849ba73SBarry Smith static PetscErrorCode PCDestroy_Shell(PC pc)
1884b9ad928SBarry Smith {
1894b9ad928SBarry Smith   PC_Shell       *shell = (PC_Shell*)pc->data;
190dfbe8321SBarry Smith   PetscErrorCode ierr;
1914b9ad928SBarry Smith 
1924b9ad928SBarry Smith   PetscFunctionBegin;
193*05b42c5fSBarry Smith   ierr = PetscStrfree(shell->name);CHKERRQ(ierr);
19418be62a5SSatish Balay   if (shell->destroy) {
19518be62a5SSatish Balay     ierr  = (*shell->destroy)(shell->ctx);CHKERRQ(ierr);
19618be62a5SSatish Balay   }
1974b9ad928SBarry Smith   ierr = PetscFree(shell);CHKERRQ(ierr);
1984b9ad928SBarry Smith   PetscFunctionReturn(0);
1994b9ad928SBarry Smith }
2004b9ad928SBarry Smith 
2014b9ad928SBarry Smith #undef __FUNCT__
2024b9ad928SBarry Smith #define __FUNCT__ "PCView_Shell"
2036849ba73SBarry Smith static PetscErrorCode PCView_Shell(PC pc,PetscViewer viewer)
2044b9ad928SBarry Smith {
2054b9ad928SBarry Smith   PC_Shell       *shell = (PC_Shell*)pc->data;
206dfbe8321SBarry Smith   PetscErrorCode ierr;
20732077d6dSBarry Smith   PetscTruth     iascii;
2084b9ad928SBarry Smith 
2094b9ad928SBarry Smith   PetscFunctionBegin;
21032077d6dSBarry Smith   ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_ASCII,&iascii);CHKERRQ(ierr);
21132077d6dSBarry Smith   if (iascii) {
2124b9ad928SBarry Smith     if (shell->name) {ierr = PetscViewerASCIIPrintf(viewer,"  Shell: %s\n",shell->name);CHKERRQ(ierr);}
2134b9ad928SBarry Smith     else             {ierr = PetscViewerASCIIPrintf(viewer,"  Shell: no name\n");CHKERRQ(ierr);}
2144b9ad928SBarry Smith   }
2154b9ad928SBarry Smith   if (shell->view) {
2164b9ad928SBarry Smith     ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
2174b9ad928SBarry Smith     ierr  = (*shell->view)(shell->ctx,viewer);CHKERRQ(ierr);
2184b9ad928SBarry Smith     ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
2194b9ad928SBarry Smith   }
2204b9ad928SBarry Smith   PetscFunctionReturn(0);
2214b9ad928SBarry Smith }
2224b9ad928SBarry Smith 
2234b9ad928SBarry Smith /* ------------------------------------------------------------------------------*/
2244b9ad928SBarry Smith EXTERN_C_BEGIN
2254b9ad928SBarry Smith #undef __FUNCT__
22618be62a5SSatish Balay #define __FUNCT__ "PCShellSetDestroy_Shell"
22718be62a5SSatish Balay PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetDestroy_Shell(PC pc, PetscErrorCode (*destroy)(void*))
22818be62a5SSatish Balay {
22918be62a5SSatish Balay   PC_Shell *shell;
23018be62a5SSatish Balay 
23118be62a5SSatish Balay   PetscFunctionBegin;
23218be62a5SSatish Balay   shell          = (PC_Shell*)pc->data;
23318be62a5SSatish Balay   shell->destroy = destroy;
23418be62a5SSatish Balay   PetscFunctionReturn(0);
23518be62a5SSatish Balay }
23618be62a5SSatish Balay EXTERN_C_END
23718be62a5SSatish Balay 
23818be62a5SSatish Balay EXTERN_C_BEGIN
23918be62a5SSatish Balay #undef __FUNCT__
2404b9ad928SBarry Smith #define __FUNCT__ "PCShellSetSetUp_Shell"
241dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetSetUp_Shell(PC pc, PetscErrorCode (*setup)(void*))
2424b9ad928SBarry Smith {
2434b9ad928SBarry Smith   PC_Shell *shell;
2444b9ad928SBarry Smith 
2454b9ad928SBarry Smith   PetscFunctionBegin;
2464b9ad928SBarry Smith   shell        = (PC_Shell*)pc->data;
2474b9ad928SBarry Smith   shell->setup = setup;
2484b9ad928SBarry Smith   PetscFunctionReturn(0);
2494b9ad928SBarry Smith }
2504b9ad928SBarry Smith EXTERN_C_END
2514b9ad928SBarry Smith 
2524b9ad928SBarry Smith EXTERN_C_BEGIN
2534b9ad928SBarry Smith #undef __FUNCT__
2544b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApply_Shell"
255be29d3c6SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApply_Shell(PC pc,PetscErrorCode (*apply)(void*,Vec,Vec))
2564b9ad928SBarry Smith {
2574b9ad928SBarry Smith   PC_Shell *shell;
2584b9ad928SBarry Smith 
2594b9ad928SBarry Smith   PetscFunctionBegin;
2604b9ad928SBarry Smith   shell        = (PC_Shell*)pc->data;
2614b9ad928SBarry Smith   shell->apply = apply;
2624b9ad928SBarry Smith   PetscFunctionReturn(0);
2634b9ad928SBarry Smith }
2644b9ad928SBarry Smith EXTERN_C_END
2654b9ad928SBarry Smith 
2664b9ad928SBarry Smith EXTERN_C_BEGIN
2674b9ad928SBarry Smith #undef __FUNCT__
2687cdd61b2SBarry Smith #define __FUNCT__ "PCShellSetPreSolve_Shell"
269be29d3c6SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetPreSolve_Shell(PC pc,PetscErrorCode (*presolve)(void*,KSP,Vec,Vec))
2707cdd61b2SBarry Smith {
2717cdd61b2SBarry Smith   PC_Shell *shell;
2727cdd61b2SBarry Smith 
2737cdd61b2SBarry Smith   PetscFunctionBegin;
2747cdd61b2SBarry Smith   shell             = (PC_Shell*)pc->data;
2757cdd61b2SBarry Smith   shell->presolve   = presolve;
2769bbb2c88SBarry Smith   if (presolve) {
2779bbb2c88SBarry Smith     pc->ops->presolve = PCPreSolve_Shell;
2789bbb2c88SBarry Smith   } else {
2799bbb2c88SBarry Smith     pc->ops->presolve = 0;
2809bbb2c88SBarry Smith   }
2817cdd61b2SBarry Smith   PetscFunctionReturn(0);
2827cdd61b2SBarry Smith }
2837cdd61b2SBarry Smith EXTERN_C_END
2847cdd61b2SBarry Smith 
2857cdd61b2SBarry Smith EXTERN_C_BEGIN
2867cdd61b2SBarry Smith #undef __FUNCT__
2877cdd61b2SBarry Smith #define __FUNCT__ "PCShellSetPostSolve_Shell"
288be29d3c6SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetPostSolve_Shell(PC pc,PetscErrorCode (*postsolve)(void*,KSP,Vec,Vec))
2897cdd61b2SBarry Smith {
2907cdd61b2SBarry Smith   PC_Shell *shell;
2917cdd61b2SBarry Smith 
2927cdd61b2SBarry Smith   PetscFunctionBegin;
2937cdd61b2SBarry Smith   shell           = (PC_Shell*)pc->data;
2947cdd61b2SBarry Smith   shell->postsolve = postsolve;
2959bbb2c88SBarry Smith   if (postsolve) {
2969bbb2c88SBarry Smith     pc->ops->postsolve = PCPostSolve_Shell;
2979bbb2c88SBarry Smith   } else {
2989bbb2c88SBarry Smith     pc->ops->postsolve = 0;
2999bbb2c88SBarry Smith   }
3007cdd61b2SBarry Smith   PetscFunctionReturn(0);
3017cdd61b2SBarry Smith }
3027cdd61b2SBarry Smith EXTERN_C_END
3037cdd61b2SBarry Smith 
3047cdd61b2SBarry Smith EXTERN_C_BEGIN
3057cdd61b2SBarry Smith #undef __FUNCT__
3064b9ad928SBarry Smith #define __FUNCT__ "PCShellSetView_Shell"
307dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetView_Shell(PC pc,PetscErrorCode (*view)(void*,PetscViewer))
3084b9ad928SBarry Smith {
3094b9ad928SBarry Smith   PC_Shell *shell;
3104b9ad928SBarry Smith 
3114b9ad928SBarry Smith   PetscFunctionBegin;
3124b9ad928SBarry Smith   shell        = (PC_Shell*)pc->data;
3134b9ad928SBarry Smith   shell->view = view;
3144b9ad928SBarry Smith   PetscFunctionReturn(0);
3154b9ad928SBarry Smith }
3164b9ad928SBarry Smith EXTERN_C_END
3174b9ad928SBarry Smith 
3184b9ad928SBarry Smith EXTERN_C_BEGIN
3194b9ad928SBarry Smith #undef __FUNCT__
3204b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApplyTranspose_Shell"
321dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApplyTranspose_Shell(PC pc,PetscErrorCode (*applytranspose)(void*,Vec,Vec))
3224b9ad928SBarry Smith {
3234b9ad928SBarry Smith   PC_Shell *shell;
3244b9ad928SBarry Smith 
3254b9ad928SBarry Smith   PetscFunctionBegin;
3264b9ad928SBarry Smith   shell                 = (PC_Shell*)pc->data;
3274b9ad928SBarry Smith   shell->applytranspose = applytranspose;
3284b9ad928SBarry Smith   PetscFunctionReturn(0);
3294b9ad928SBarry Smith }
3304b9ad928SBarry Smith EXTERN_C_END
3314b9ad928SBarry Smith 
3324b9ad928SBarry Smith EXTERN_C_BEGIN
3334b9ad928SBarry Smith #undef __FUNCT__
3344b9ad928SBarry Smith #define __FUNCT__ "PCShellSetName_Shell"
335dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetName_Shell(PC pc,const char name[])
3364b9ad928SBarry Smith {
3374b9ad928SBarry Smith   PC_Shell       *shell;
338dfbe8321SBarry Smith   PetscErrorCode ierr;
3394b9ad928SBarry Smith 
3404b9ad928SBarry Smith   PetscFunctionBegin;
3414b9ad928SBarry Smith   shell = (PC_Shell*)pc->data;
342f259bd47SBarry Smith   ierr = PetscStrfree(shell->name);CHKERRQ(ierr);
3434b9ad928SBarry Smith   ierr = PetscStrallocpy(name,&shell->name);CHKERRQ(ierr);
3444b9ad928SBarry Smith   PetscFunctionReturn(0);
3454b9ad928SBarry Smith }
3464b9ad928SBarry Smith EXTERN_C_END
3474b9ad928SBarry Smith 
3484b9ad928SBarry Smith EXTERN_C_BEGIN
3494b9ad928SBarry Smith #undef __FUNCT__
3504b9ad928SBarry Smith #define __FUNCT__ "PCShellGetName_Shell"
351dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellGetName_Shell(PC pc,char *name[])
3524b9ad928SBarry Smith {
3534b9ad928SBarry Smith   PC_Shell *shell;
3544b9ad928SBarry Smith 
3554b9ad928SBarry Smith   PetscFunctionBegin;
3564b9ad928SBarry Smith   shell  = (PC_Shell*)pc->data;
3574b9ad928SBarry Smith   *name  = shell->name;
3584b9ad928SBarry Smith   PetscFunctionReturn(0);
3594b9ad928SBarry Smith }
3604b9ad928SBarry Smith EXTERN_C_END
3614b9ad928SBarry Smith 
3624b9ad928SBarry Smith EXTERN_C_BEGIN
3634b9ad928SBarry Smith #undef __FUNCT__
3644b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApplyRichardson_Shell"
365be29d3c6SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApplyRichardson_Shell(PC pc,PetscErrorCode (*apply)(void*,Vec,Vec,Vec,PetscReal,PetscReal,PetscReal,PetscInt))
3664b9ad928SBarry Smith {
3674b9ad928SBarry Smith   PC_Shell *shell;
3684b9ad928SBarry Smith 
3694b9ad928SBarry Smith   PetscFunctionBegin;
3704b9ad928SBarry Smith   shell                     = (PC_Shell*)pc->data;
3714b9ad928SBarry Smith   pc->ops->applyrichardson  = PCApplyRichardson_Shell;
3724b9ad928SBarry Smith   shell->applyrich          = apply;
3734b9ad928SBarry Smith   PetscFunctionReturn(0);
3744b9ad928SBarry Smith }
3754b9ad928SBarry Smith EXTERN_C_END
3764b9ad928SBarry Smith 
3774b9ad928SBarry Smith /* -------------------------------------------------------------------------------*/
3784b9ad928SBarry Smith 
3794b9ad928SBarry Smith #undef __FUNCT__
38018be62a5SSatish Balay #define __FUNCT__ "PCShellSetDestroy"
38118be62a5SSatish Balay /*@C
38218be62a5SSatish Balay    PCShellSetDestroy - Sets routine to use to destroy the user-provided
38318be62a5SSatish Balay    application context.
38418be62a5SSatish Balay 
38518be62a5SSatish Balay    Collective on PC
38618be62a5SSatish Balay 
38718be62a5SSatish Balay    Input Parameters:
38818be62a5SSatish Balay +  pc - the preconditioner context
38918be62a5SSatish Balay .  destroy - the application-provided destroy routine
39018be62a5SSatish Balay 
39118be62a5SSatish Balay    Calling sequence of destroy:
39218be62a5SSatish Balay .vb
39318be62a5SSatish Balay    PetscErrorCode destroy (void *ptr)
39418be62a5SSatish Balay .ve
39518be62a5SSatish Balay 
39618be62a5SSatish Balay .  ptr - the application context
39718be62a5SSatish Balay 
39818be62a5SSatish Balay    Level: developer
39918be62a5SSatish Balay 
40018be62a5SSatish Balay .keywords: PC, shell, set, destroy, user-provided
40118be62a5SSatish Balay 
40218be62a5SSatish Balay .seealso: PCShellSetApply(), PCShellSetContext()
40318be62a5SSatish Balay @*/
40418be62a5SSatish Balay PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetDestroy(PC pc,PetscErrorCode (*destroy)(void*))
40518be62a5SSatish Balay {
40618be62a5SSatish Balay   PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*));
40718be62a5SSatish Balay 
40818be62a5SSatish Balay   PetscFunctionBegin;
40918be62a5SSatish Balay   PetscValidHeaderSpecific(pc,PC_COOKIE,1);
41018be62a5SSatish Balay   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetDestroy_C",(void (**)(void))&f);CHKERRQ(ierr);
41118be62a5SSatish Balay   if (f) {
41218be62a5SSatish Balay     ierr = (*f)(pc,destroy);CHKERRQ(ierr);
41318be62a5SSatish Balay   }
41418be62a5SSatish Balay   PetscFunctionReturn(0);
41518be62a5SSatish Balay }
41618be62a5SSatish Balay 
41718be62a5SSatish Balay 
41818be62a5SSatish Balay #undef __FUNCT__
4194b9ad928SBarry Smith #define __FUNCT__ "PCShellSetSetUp"
4204b9ad928SBarry Smith /*@C
4214b9ad928SBarry Smith    PCShellSetSetUp - Sets routine to use to "setup" the preconditioner whenever the
4224b9ad928SBarry Smith    matrix operator is changed.
4234b9ad928SBarry Smith 
4244b9ad928SBarry Smith    Collective on PC
4254b9ad928SBarry Smith 
4264b9ad928SBarry Smith    Input Parameters:
4274b9ad928SBarry Smith +  pc - the preconditioner context
4284b9ad928SBarry Smith .  setup - the application-provided setup routine
4294b9ad928SBarry Smith 
4304b9ad928SBarry Smith    Calling sequence of setup:
4314b9ad928SBarry Smith .vb
43213f74950SBarry Smith    PetscErrorCode setup (void *ptr)
4334b9ad928SBarry Smith .ve
4344b9ad928SBarry Smith 
4354b9ad928SBarry Smith .  ptr - the application context
4364b9ad928SBarry Smith 
4374b9ad928SBarry Smith    Level: developer
4384b9ad928SBarry Smith 
4394b9ad928SBarry Smith .keywords: PC, shell, set, setup, user-provided
4404b9ad928SBarry Smith 
441be29d3c6SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetApply(), PCShellSetContext()
4424b9ad928SBarry Smith @*/
443dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetSetUp(PC pc,PetscErrorCode (*setup)(void*))
4444b9ad928SBarry Smith {
4456849ba73SBarry Smith   PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*));
4464b9ad928SBarry Smith 
4474b9ad928SBarry Smith   PetscFunctionBegin;
4484482741eSBarry Smith   PetscValidHeaderSpecific(pc,PC_COOKIE,1);
4494b9ad928SBarry Smith   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetSetUp_C",(void (**)(void))&f);CHKERRQ(ierr);
4504b9ad928SBarry Smith   if (f) {
4514b9ad928SBarry Smith     ierr = (*f)(pc,setup);CHKERRQ(ierr);
4524b9ad928SBarry Smith   }
4534b9ad928SBarry Smith   PetscFunctionReturn(0);
4544b9ad928SBarry Smith }
4554b9ad928SBarry Smith 
4564b9ad928SBarry Smith 
4574b9ad928SBarry Smith #undef __FUNCT__
4584b9ad928SBarry Smith #define __FUNCT__ "PCShellSetView"
4594b9ad928SBarry Smith /*@C
4604b9ad928SBarry Smith    PCShellSetView - Sets routine to use as viewer of shell preconditioner
4614b9ad928SBarry Smith 
4624b9ad928SBarry Smith    Collective on PC
4634b9ad928SBarry Smith 
4644b9ad928SBarry Smith    Input Parameters:
4654b9ad928SBarry Smith +  pc - the preconditioner context
4664b9ad928SBarry Smith -  view - the application-provided view routine
4674b9ad928SBarry Smith 
4684b9ad928SBarry Smith    Calling sequence of apply:
4694b9ad928SBarry Smith .vb
47013f74950SBarry Smith    PetscErrorCode view(void *ptr,PetscViewer v)
4714b9ad928SBarry Smith .ve
4724b9ad928SBarry Smith 
4734b9ad928SBarry Smith +  ptr - the application context
4744b9ad928SBarry Smith -  v   - viewer
4754b9ad928SBarry Smith 
4764b9ad928SBarry Smith    Level: developer
4774b9ad928SBarry Smith 
4784b9ad928SBarry Smith .keywords: PC, shell, set, apply, user-provided
4794b9ad928SBarry Smith 
4804b9ad928SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose()
4814b9ad928SBarry Smith @*/
482dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetView(PC pc,PetscErrorCode (*view)(void*,PetscViewer))
4834b9ad928SBarry Smith {
4846849ba73SBarry Smith   PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*,PetscViewer));
4854b9ad928SBarry Smith 
4864b9ad928SBarry Smith   PetscFunctionBegin;
4874482741eSBarry Smith   PetscValidHeaderSpecific(pc,PC_COOKIE,1);
4884b9ad928SBarry Smith   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetView_C",(void (**)(void))&f);CHKERRQ(ierr);
4894b9ad928SBarry Smith   if (f) {
4904b9ad928SBarry Smith     ierr = (*f)(pc,view);CHKERRQ(ierr);
4914b9ad928SBarry Smith   }
4924b9ad928SBarry Smith   PetscFunctionReturn(0);
4934b9ad928SBarry Smith }
4944b9ad928SBarry Smith 
4954b9ad928SBarry Smith #undef __FUNCT__
4964b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApply"
4974b9ad928SBarry Smith /*@C
4984b9ad928SBarry Smith    PCShellSetApply - Sets routine to use as preconditioner.
4994b9ad928SBarry Smith 
5004b9ad928SBarry Smith    Collective on PC
5014b9ad928SBarry Smith 
5024b9ad928SBarry Smith    Input Parameters:
5034b9ad928SBarry Smith +  pc - the preconditioner context
504be29d3c6SBarry Smith -  apply - the application-provided preconditioning routine
5054b9ad928SBarry Smith 
5064b9ad928SBarry Smith    Calling sequence of apply:
5074b9ad928SBarry Smith .vb
50813f74950SBarry Smith    PetscErrorCode apply (void *ptr,Vec xin,Vec xout)
5094b9ad928SBarry Smith .ve
5104b9ad928SBarry Smith 
5114b9ad928SBarry Smith +  ptr - the application context
5124b9ad928SBarry Smith .  xin - input vector
5134b9ad928SBarry Smith -  xout - output vector
5144b9ad928SBarry Smith 
5154b9ad928SBarry Smith    Level: developer
5164b9ad928SBarry Smith 
5174b9ad928SBarry Smith .keywords: PC, shell, set, apply, user-provided
5184b9ad928SBarry Smith 
519be29d3c6SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose(), PCShellSetContext()
5204b9ad928SBarry Smith @*/
521be29d3c6SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApply(PC pc,PetscErrorCode (*apply)(void*,Vec,Vec))
5224b9ad928SBarry Smith {
523be29d3c6SBarry Smith   PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*,Vec,Vec));
5244b9ad928SBarry Smith 
5254b9ad928SBarry Smith   PetscFunctionBegin;
5264482741eSBarry Smith   PetscValidHeaderSpecific(pc,PC_COOKIE,1);
5274b9ad928SBarry Smith   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetApply_C",(void (**)(void))&f);CHKERRQ(ierr);
5284b9ad928SBarry Smith   if (f) {
529be29d3c6SBarry Smith     ierr = (*f)(pc,apply);CHKERRQ(ierr);
5304b9ad928SBarry Smith   }
5314b9ad928SBarry Smith   PetscFunctionReturn(0);
5324b9ad928SBarry Smith }
5334b9ad928SBarry Smith 
5344b9ad928SBarry Smith #undef __FUNCT__
5354b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApplyTranspose"
5364b9ad928SBarry Smith /*@C
5374b9ad928SBarry Smith    PCShellSetApplyTranspose - Sets routine to use as preconditioner transpose.
5384b9ad928SBarry Smith 
5394b9ad928SBarry Smith    Collective on PC
5404b9ad928SBarry Smith 
5414b9ad928SBarry Smith    Input Parameters:
5424b9ad928SBarry Smith +  pc - the preconditioner context
5434b9ad928SBarry Smith -  apply - the application-provided preconditioning transpose routine
5444b9ad928SBarry Smith 
5454b9ad928SBarry Smith    Calling sequence of apply:
5464b9ad928SBarry Smith .vb
54713f74950SBarry Smith    PetscErrorCode applytranspose (void *ptr,Vec xin,Vec xout)
5484b9ad928SBarry Smith .ve
5494b9ad928SBarry Smith 
5504b9ad928SBarry Smith +  ptr - the application context
5514b9ad928SBarry Smith .  xin - input vector
5524b9ad928SBarry Smith -  xout - output vector
5534b9ad928SBarry Smith 
5544b9ad928SBarry Smith    Level: developer
5554b9ad928SBarry Smith 
5564b9ad928SBarry Smith    Notes:
5574b9ad928SBarry Smith    Uses the same context variable as PCShellSetApply().
5584b9ad928SBarry Smith 
5594b9ad928SBarry Smith .keywords: PC, shell, set, apply, user-provided
5604b9ad928SBarry Smith 
561be29d3c6SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApply(), PCSetContext()
5624b9ad928SBarry Smith @*/
563dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApplyTranspose(PC pc,PetscErrorCode (*applytranspose)(void*,Vec,Vec))
5644b9ad928SBarry Smith {
5656849ba73SBarry Smith   PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*,Vec,Vec));
5664b9ad928SBarry Smith 
5674b9ad928SBarry Smith   PetscFunctionBegin;
5684482741eSBarry Smith   PetscValidHeaderSpecific(pc,PC_COOKIE,1);
5694b9ad928SBarry Smith   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetApplyTranspose_C",(void (**)(void))&f);CHKERRQ(ierr);
5704b9ad928SBarry Smith   if (f) {
5714b9ad928SBarry Smith     ierr = (*f)(pc,applytranspose);CHKERRQ(ierr);
5724b9ad928SBarry Smith   }
5734b9ad928SBarry Smith   PetscFunctionReturn(0);
5744b9ad928SBarry Smith }
5754b9ad928SBarry Smith 
5764b9ad928SBarry Smith #undef __FUNCT__
5777cdd61b2SBarry Smith #define __FUNCT__ "PCShellSetPreSolve"
5787cdd61b2SBarry Smith /*@C
5797cdd61b2SBarry Smith    PCShellSetPreSolve - Sets routine to apply to the operators/vectors before a KSPSolve() is
5807cdd61b2SBarry Smith       applied. This usually does something like scale the linear system in some application
5817cdd61b2SBarry Smith       specific way.
5827cdd61b2SBarry Smith 
5837cdd61b2SBarry Smith    Collective on PC
5847cdd61b2SBarry Smith 
5857cdd61b2SBarry Smith    Input Parameters:
5867cdd61b2SBarry Smith +  pc - the preconditioner context
5877cdd61b2SBarry Smith -  presolve - the application-provided presolve routine
5887cdd61b2SBarry Smith 
5897cdd61b2SBarry Smith    Calling sequence of presolve:
5907cdd61b2SBarry Smith .vb
5917cdd61b2SBarry Smith    PetscErrorCode presolve (void *ptr,KSP ksp,Vec b,Vec x)
5927cdd61b2SBarry Smith .ve
5937cdd61b2SBarry Smith 
5947cdd61b2SBarry Smith +  ptr - the application context
5957cdd61b2SBarry Smith .  xin - input vector
5967cdd61b2SBarry Smith -  xout - output vector
5977cdd61b2SBarry Smith 
5987cdd61b2SBarry Smith    Level: developer
5997cdd61b2SBarry Smith 
6007cdd61b2SBarry Smith .keywords: PC, shell, set, apply, user-provided
6017cdd61b2SBarry Smith 
602be29d3c6SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose(), PCShellSetPostSolve(), PCShellSetContext()
6037cdd61b2SBarry Smith @*/
6047cdd61b2SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetPreSolve(PC pc,PetscErrorCode (*presolve)(void*,KSP,Vec,Vec))
6057cdd61b2SBarry Smith {
6067cdd61b2SBarry Smith   PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*,KSP,Vec,Vec));
6077cdd61b2SBarry Smith 
6087cdd61b2SBarry Smith   PetscFunctionBegin;
6097cdd61b2SBarry Smith   PetscValidHeaderSpecific(pc,PC_COOKIE,1);
6107cdd61b2SBarry Smith   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetPreSolve_C",(void (**)(void))&f);CHKERRQ(ierr);
6117cdd61b2SBarry Smith   if (f) {
6127cdd61b2SBarry Smith     ierr = (*f)(pc,presolve);CHKERRQ(ierr);
6137cdd61b2SBarry Smith   }
6147cdd61b2SBarry Smith   PetscFunctionReturn(0);
6157cdd61b2SBarry Smith }
6167cdd61b2SBarry Smith 
6177cdd61b2SBarry Smith #undef __FUNCT__
6187cdd61b2SBarry Smith #define __FUNCT__ "PCShellSetPostSolve"
6197cdd61b2SBarry Smith /*@C
6207cdd61b2SBarry Smith    PCShellSetPostSolve - Sets routine to apply to the operators/vectors before a KSPSolve() is
6217cdd61b2SBarry Smith       applied. This usually does something like scale the linear system in some application
6227cdd61b2SBarry Smith       specific way.
6237cdd61b2SBarry Smith 
6247cdd61b2SBarry Smith    Collective on PC
6257cdd61b2SBarry Smith 
6267cdd61b2SBarry Smith    Input Parameters:
6277cdd61b2SBarry Smith +  pc - the preconditioner context
6287cdd61b2SBarry Smith -  postsolve - the application-provided presolve routine
6297cdd61b2SBarry Smith 
6307cdd61b2SBarry Smith    Calling sequence of postsolve:
6317cdd61b2SBarry Smith .vb
6327cdd61b2SBarry Smith    PetscErrorCode postsolve(void *ptr,KSP ksp,Vec b,Vec x)
6337cdd61b2SBarry Smith .ve
6347cdd61b2SBarry Smith 
6357cdd61b2SBarry Smith +  ptr - the application context
6367cdd61b2SBarry Smith .  xin - input vector
6377cdd61b2SBarry Smith -  xout - output vector
6387cdd61b2SBarry Smith 
6397cdd61b2SBarry Smith    Level: developer
6407cdd61b2SBarry Smith 
6417cdd61b2SBarry Smith .keywords: PC, shell, set, apply, user-provided
6427cdd61b2SBarry Smith 
643be29d3c6SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose(), PCShellSetPreSolve(), PCShellSetContext()
6447cdd61b2SBarry Smith @*/
6457cdd61b2SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetPostSolve(PC pc,PetscErrorCode (*postsolve)(void*,KSP,Vec,Vec))
6467cdd61b2SBarry Smith {
6477cdd61b2SBarry Smith   PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*,KSP,Vec,Vec));
6487cdd61b2SBarry Smith 
6497cdd61b2SBarry Smith   PetscFunctionBegin;
6507cdd61b2SBarry Smith   PetscValidHeaderSpecific(pc,PC_COOKIE,1);
6517cdd61b2SBarry Smith   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetPostSolve_C",(void (**)(void))&f);CHKERRQ(ierr);
6527cdd61b2SBarry Smith   if (f) {
6537cdd61b2SBarry Smith     ierr = (*f)(pc,postsolve);CHKERRQ(ierr);
6547cdd61b2SBarry Smith   }
6557cdd61b2SBarry Smith   PetscFunctionReturn(0);
6567cdd61b2SBarry Smith }
6577cdd61b2SBarry Smith 
6587cdd61b2SBarry Smith #undef __FUNCT__
6594b9ad928SBarry Smith #define __FUNCT__ "PCShellSetName"
6604b9ad928SBarry Smith /*@C
6614b9ad928SBarry Smith    PCShellSetName - Sets an optional name to associate with a shell
6624b9ad928SBarry Smith    preconditioner.
6634b9ad928SBarry Smith 
6644b9ad928SBarry Smith    Not Collective
6654b9ad928SBarry Smith 
6664b9ad928SBarry Smith    Input Parameters:
6674b9ad928SBarry Smith +  pc - the preconditioner context
6684b9ad928SBarry Smith -  name - character string describing shell preconditioner
6694b9ad928SBarry Smith 
6704b9ad928SBarry Smith    Level: developer
6714b9ad928SBarry Smith 
6724b9ad928SBarry Smith .keywords: PC, shell, set, name, user-provided
6734b9ad928SBarry Smith 
6744b9ad928SBarry Smith .seealso: PCShellGetName()
6754b9ad928SBarry Smith @*/
676dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetName(PC pc,const char name[])
6774b9ad928SBarry Smith {
678dfbe8321SBarry Smith   PetscErrorCode ierr,(*f)(PC,const char []);
6794b9ad928SBarry Smith 
6804b9ad928SBarry Smith   PetscFunctionBegin;
6814482741eSBarry Smith   PetscValidHeaderSpecific(pc,PC_COOKIE,1);
6824b9ad928SBarry Smith   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetName_C",(void (**)(void))&f);CHKERRQ(ierr);
6834b9ad928SBarry Smith   if (f) {
6844b9ad928SBarry Smith     ierr = (*f)(pc,name);CHKERRQ(ierr);
6854b9ad928SBarry Smith   }
6864b9ad928SBarry Smith   PetscFunctionReturn(0);
6874b9ad928SBarry Smith }
6884b9ad928SBarry Smith 
6894b9ad928SBarry Smith #undef __FUNCT__
6904b9ad928SBarry Smith #define __FUNCT__ "PCShellGetName"
6914b9ad928SBarry Smith /*@C
6924b9ad928SBarry Smith    PCShellGetName - Gets an optional name that the user has set for a shell
6934b9ad928SBarry Smith    preconditioner.
6944b9ad928SBarry Smith 
6954b9ad928SBarry Smith    Not Collective
6964b9ad928SBarry Smith 
6974b9ad928SBarry Smith    Input Parameter:
6984b9ad928SBarry Smith .  pc - the preconditioner context
6994b9ad928SBarry Smith 
7004b9ad928SBarry Smith    Output Parameter:
7014b9ad928SBarry Smith .  name - character string describing shell preconditioner (you should not free this)
7024b9ad928SBarry Smith 
7034b9ad928SBarry Smith    Level: developer
7044b9ad928SBarry Smith 
7054b9ad928SBarry Smith .keywords: PC, shell, get, name, user-provided
7064b9ad928SBarry Smith 
7074b9ad928SBarry Smith .seealso: PCShellSetName()
7084b9ad928SBarry Smith @*/
709dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellGetName(PC pc,char *name[])
7104b9ad928SBarry Smith {
711dfbe8321SBarry Smith   PetscErrorCode ierr,(*f)(PC,char *[]);
7124b9ad928SBarry Smith 
7134b9ad928SBarry Smith   PetscFunctionBegin;
7144482741eSBarry Smith   PetscValidHeaderSpecific(pc,PC_COOKIE,1);
7154482741eSBarry Smith   PetscValidPointer(name,2);
7164b9ad928SBarry Smith   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellGetName_C",(void (**)(void))&f);CHKERRQ(ierr);
7174b9ad928SBarry Smith   if (f) {
7184b9ad928SBarry Smith     ierr = (*f)(pc,name);CHKERRQ(ierr);
7194b9ad928SBarry Smith   } else {
7201302d50aSBarry Smith     SETERRQ(PETSC_ERR_ARG_WRONG,"Not shell preconditioner, cannot get name");
7214b9ad928SBarry Smith   }
7224b9ad928SBarry Smith   PetscFunctionReturn(0);
7234b9ad928SBarry Smith }
7244b9ad928SBarry Smith 
7254b9ad928SBarry Smith #undef __FUNCT__
7264b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApplyRichardson"
7274b9ad928SBarry Smith /*@C
7284b9ad928SBarry Smith    PCShellSetApplyRichardson - Sets routine to use as preconditioner
7294b9ad928SBarry Smith    in Richardson iteration.
7304b9ad928SBarry Smith 
7314b9ad928SBarry Smith    Collective on PC
7324b9ad928SBarry Smith 
7334b9ad928SBarry Smith    Input Parameters:
7344b9ad928SBarry Smith +  pc - the preconditioner context
735be29d3c6SBarry Smith -  apply - the application-provided preconditioning routine
7364b9ad928SBarry Smith 
7374b9ad928SBarry Smith    Calling sequence of apply:
7384b9ad928SBarry Smith .vb
73913f74950SBarry Smith    PetscErrorCode apply (void *ptr,Vec b,Vec x,Vec r,PetscReal rtol,PetscReal abstol,PetscReal dtol,PetscInt maxits)
7404b9ad928SBarry Smith .ve
7414b9ad928SBarry Smith 
7424b9ad928SBarry Smith +  ptr - the application context
7434b9ad928SBarry Smith .  b - right-hand-side
7444b9ad928SBarry Smith .  x - current iterate
7454b9ad928SBarry Smith .  r - work space
7464b9ad928SBarry Smith .  rtol - relative tolerance of residual norm to stop at
74770441072SBarry Smith .  abstol - absolute tolerance of residual norm to stop at
7484b9ad928SBarry Smith .  dtol - if residual norm increases by this factor than return
7494b9ad928SBarry Smith -  maxits - number of iterations to run
7504b9ad928SBarry Smith 
7514b9ad928SBarry Smith    Level: developer
7524b9ad928SBarry Smith 
7534b9ad928SBarry Smith .keywords: PC, shell, set, apply, Richardson, user-provided
7544b9ad928SBarry Smith 
755be29d3c6SBarry Smith .seealso: PCShellSetApply(), PCShellSetContext()
7564b9ad928SBarry Smith @*/
757be29d3c6SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApplyRichardson(PC pc,PetscErrorCode (*apply)(void*,Vec,Vec,Vec,PetscReal,PetscReal,PetscReal,PetscInt))
7584b9ad928SBarry Smith {
759be29d3c6SBarry Smith   PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*,Vec,Vec,Vec,PetscReal,PetscReal,PetscReal,PetscInt));
7604b9ad928SBarry Smith 
7614b9ad928SBarry Smith   PetscFunctionBegin;
7624482741eSBarry Smith   PetscValidHeaderSpecific(pc,PC_COOKIE,1);
7634b9ad928SBarry Smith   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetApplyRichardson_C",(void (**)(void))&f);CHKERRQ(ierr);
7644b9ad928SBarry Smith   if (f) {
765be29d3c6SBarry Smith     ierr = (*f)(pc,apply);CHKERRQ(ierr);
7664b9ad928SBarry Smith   }
7674b9ad928SBarry Smith   PetscFunctionReturn(0);
7684b9ad928SBarry Smith }
7694b9ad928SBarry Smith 
7704b9ad928SBarry Smith /*MC
7714b9ad928SBarry Smith    PCSHELL - Creates a new preconditioner class for use with your
7724b9ad928SBarry Smith               own private data storage format.
7734b9ad928SBarry Smith 
7744b9ad928SBarry Smith    Level: advanced
7754b9ad928SBarry Smith 
7764b9ad928SBarry Smith    Concepts: providing your own preconditioner
7774b9ad928SBarry Smith 
7784b9ad928SBarry Smith   Usage:
7796849ba73SBarry Smith $             PetscErrorCode (*mult)(void*,Vec,Vec);
7806849ba73SBarry Smith $             PetscErrorCode (*setup)(void*);
7814b9ad928SBarry Smith $             PCCreate(comm,&pc);
7824b9ad928SBarry Smith $             PCSetType(pc,PCSHELL);
783be29d3c6SBarry Smith $             PCShellSetApply(pc,mult);
784be29d3c6SBarry Smith $             PCShellSetContext(pc,ctx)
7854b9ad928SBarry Smith $             PCShellSetSetUp(pc,setup);       (optional)
7864b9ad928SBarry Smith 
7874b9ad928SBarry Smith .seealso:  PCCreate(), PCSetType(), PCType (for list of available types), PC,
788fd2d0fe1Svictor            MATSHELL, PCShellSetSetUp(), PCShellSetApply(), PCShellSetView(),
789fd2d0fe1Svictor            PCShellSetApplyTranspose(), PCShellSetName(), PCShellSetApplyRichardson(),
790be29d3c6SBarry Smith            PCShellGetName(), PCShellSetContext(), PCShellGetContext()
7914b9ad928SBarry Smith M*/
7924b9ad928SBarry Smith 
7934b9ad928SBarry Smith EXTERN_C_BEGIN
7944b9ad928SBarry Smith #undef __FUNCT__
7954b9ad928SBarry Smith #define __FUNCT__ "PCCreate_Shell"
796dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCCreate_Shell(PC pc)
7974b9ad928SBarry Smith {
798dfbe8321SBarry Smith   PetscErrorCode ierr;
7994b9ad928SBarry Smith   PC_Shell       *shell;
8004b9ad928SBarry Smith 
8014b9ad928SBarry Smith   PetscFunctionBegin;
8024b9ad928SBarry Smith   pc->ops->destroy    = PCDestroy_Shell;
8034b9ad928SBarry Smith   ierr                = PetscNew(PC_Shell,&shell);CHKERRQ(ierr);
80452e6d16bSBarry Smith   ierr = PetscLogObjectMemory(pc,sizeof(PC_Shell));CHKERRQ(ierr);
8054b9ad928SBarry Smith   pc->data         = (void*)shell;
8064b9ad928SBarry Smith   pc->name         = 0;
8074b9ad928SBarry Smith 
8084b9ad928SBarry Smith   pc->ops->apply           = PCApply_Shell;
8094b9ad928SBarry Smith   pc->ops->view            = PCView_Shell;
8104b9ad928SBarry Smith   pc->ops->applytranspose  = PCApplyTranspose_Shell;
8114b9ad928SBarry Smith   pc->ops->applyrichardson = 0;
8124b9ad928SBarry Smith   pc->ops->setup           = PCSetUp_Shell;
8139bbb2c88SBarry Smith   pc->ops->presolve        = 0;
8149bbb2c88SBarry Smith   pc->ops->postsolve       = 0;
8154b9ad928SBarry Smith   pc->ops->view            = PCView_Shell;
8164b9ad928SBarry Smith 
8174b9ad928SBarry Smith   shell->apply          = 0;
8184b9ad928SBarry Smith   shell->applytranspose = 0;
8194b9ad928SBarry Smith   shell->name           = 0;
8204b9ad928SBarry Smith   shell->applyrich      = 0;
8217cdd61b2SBarry Smith   shell->presolve       = 0;
8227cdd61b2SBarry Smith   shell->postsolve      = 0;
8234b9ad928SBarry Smith   shell->ctx            = 0;
8244b9ad928SBarry Smith   shell->setup          = 0;
8254b9ad928SBarry Smith   shell->view           = 0;
82618be62a5SSatish Balay   shell->destroy        = 0;
8274b9ad928SBarry Smith 
82818be62a5SSatish Balay   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetDestroy_C","PCShellSetDestroy_Shell",
82918be62a5SSatish Balay                     PCShellSetDestroy_Shell);CHKERRQ(ierr);
8304b9ad928SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetSetUp_C","PCShellSetSetUp_Shell",
8314b9ad928SBarry Smith                     PCShellSetSetUp_Shell);CHKERRQ(ierr);
8324b9ad928SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetApply_C","PCShellSetApply_Shell",
8334b9ad928SBarry Smith                     PCShellSetApply_Shell);CHKERRQ(ierr);
8347cdd61b2SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetPreSolve_C","PCShellSetPreSolve_Shell",
8357cdd61b2SBarry Smith                     PCShellSetPreSolve_Shell);CHKERRQ(ierr);
8367cdd61b2SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetPostSolve_C","PCShellSetPostSolve_Shell",
8377cdd61b2SBarry Smith                     PCShellSetPostSolve_Shell);CHKERRQ(ierr);
8384b9ad928SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetView_C","PCShellSetView_Shell",
8394b9ad928SBarry Smith                     PCShellSetView_Shell);CHKERRQ(ierr);
840be29d3c6SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetApplyTranspose_C","PCShellSetApplyTranspose_Shell",
8414b9ad928SBarry Smith                     PCShellSetApplyTranspose_Shell);CHKERRQ(ierr);
8424b9ad928SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetName_C","PCShellSetName_Shell",
8434b9ad928SBarry Smith                     PCShellSetName_Shell);CHKERRQ(ierr);
8444b9ad928SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellGetName_C","PCShellGetName_Shell",
8454b9ad928SBarry Smith                     PCShellGetName_Shell);CHKERRQ(ierr);
846be29d3c6SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetApplyRichardson_C","PCShellSetApplyRichardson_Shell",
8474b9ad928SBarry Smith                     PCShellSetApplyRichardson_Shell);CHKERRQ(ierr);
8484b9ad928SBarry Smith   PetscFunctionReturn(0);
8494b9ad928SBarry Smith }
8504b9ad928SBarry Smith EXTERN_C_END
8514b9ad928SBarry Smith 
8524b9ad928SBarry Smith 
8534b9ad928SBarry Smith 
8544b9ad928SBarry Smith 
8554b9ad928SBarry Smith 
8564b9ad928SBarry Smith 
857