xref: /petsc/src/ksp/pc/impls/shell/shellpc.c (revision f259bd47db2537c0c1948ca59840a8a8f5c67e64)
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*/
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 */
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__
26be29d3c6SBarry Smith #define __FUNCT__ "PCShellGetContext"
27be29d3c6SBarry Smith /*@
28be29d3c6SBarry Smith     PCShellGetContext - Returns the user-provided context associated with a shell PC
29be29d3c6SBarry Smith 
30be29d3c6SBarry Smith     Not Collective
31be29d3c6SBarry Smith 
32be29d3c6SBarry Smith     Input Parameter:
33be29d3c6SBarry Smith .   pc - should have been created with PCCreateShell()
34be29d3c6SBarry Smith 
35be29d3c6SBarry Smith     Output Parameter:
36be29d3c6SBarry Smith .   ctx - the user provided context
37be29d3c6SBarry Smith 
38be29d3c6SBarry Smith     Level: advanced
39be29d3c6SBarry Smith 
40be29d3c6SBarry Smith     Notes:
41be29d3c6SBarry Smith     This routine is intended for use within various shell routines
42be29d3c6SBarry Smith 
43be29d3c6SBarry Smith .keywords: PC, shell, get, context
44be29d3c6SBarry Smith 
45be29d3c6SBarry Smith .seealso: PCCreateShell(), PCShellSetContext()
46be29d3c6SBarry Smith @*/
47be29d3c6SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellGetContext(PC pc,void **ctx)
48be29d3c6SBarry Smith {
49be29d3c6SBarry Smith   PetscErrorCode ierr;
50be29d3c6SBarry Smith   PetscTruth     flg;
51be29d3c6SBarry Smith 
52be29d3c6SBarry Smith   PetscFunctionBegin;
53be29d3c6SBarry Smith   PetscValidHeaderSpecific(pc,PC_COOKIE,1);
54be29d3c6SBarry Smith   PetscValidPointer(ctx,2);
55be29d3c6SBarry Smith   ierr = PetscTypeCompare((PetscObject)pc,PCSHELL,&flg);CHKERRQ(ierr);
56be29d3c6SBarry Smith   if (!flg) *ctx = 0;
57be29d3c6SBarry Smith   else      *ctx = ((PC_Shell*)(pc->data))->ctx;
58be29d3c6SBarry Smith   PetscFunctionReturn(0);
59be29d3c6SBarry Smith }
60be29d3c6SBarry Smith 
61be29d3c6SBarry Smith #undef __FUNCT__
62be29d3c6SBarry Smith #define __FUNCT__ "PCShellSetContext"
63be29d3c6SBarry Smith /*@C
64be29d3c6SBarry Smith     PCShellSetContext - sets the context for a shell PC
65be29d3c6SBarry Smith 
66be29d3c6SBarry Smith    Collective on PC
67be29d3c6SBarry Smith 
68be29d3c6SBarry Smith     Input Parameters:
69be29d3c6SBarry Smith +   pc - the shell PC
70be29d3c6SBarry Smith -   ctx - the context
71be29d3c6SBarry Smith 
72be29d3c6SBarry Smith    Level: advanced
73be29d3c6SBarry Smith 
74be29d3c6SBarry Smith    Fortran Notes: The context can only be an integer or a PetscObject
75be29d3c6SBarry Smith       unfortunately it cannot be a Fortran array or derived type.
76be29d3c6SBarry Smith 
77be29d3c6SBarry Smith .seealso: PCCreateShell(), PCShellGetContext()
78be29d3c6SBarry Smith @*/
79be29d3c6SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetContext(PC pc,void *ctx)
80be29d3c6SBarry Smith {
81be29d3c6SBarry Smith   PC_Shell      *shell = (PC_Shell*)pc->data;
82be29d3c6SBarry Smith   PetscErrorCode ierr;
83be29d3c6SBarry Smith   PetscTruth     flg;
84be29d3c6SBarry Smith 
85be29d3c6SBarry Smith   PetscFunctionBegin;
86be29d3c6SBarry Smith   PetscValidHeaderSpecific(pc,PC_COOKIE,1);
87be29d3c6SBarry Smith   ierr = PetscTypeCompare((PetscObject)pc,PCSHELL,&flg);CHKERRQ(ierr);
88be29d3c6SBarry Smith   if (flg) {
89be29d3c6SBarry Smith     shell->ctx = ctx;
90be29d3c6SBarry Smith   }
91be29d3c6SBarry Smith   PetscFunctionReturn(0);
92be29d3c6SBarry Smith }
93be29d3c6SBarry Smith 
94be29d3c6SBarry Smith #undef __FUNCT__
954b9ad928SBarry Smith #define __FUNCT__ "PCApply_SetUp"
966849ba73SBarry Smith static PetscErrorCode PCSetUp_Shell(PC pc)
974b9ad928SBarry Smith {
984b9ad928SBarry Smith   PC_Shell       *shell;
99dfbe8321SBarry Smith   PetscErrorCode ierr;
1004b9ad928SBarry Smith 
1014b9ad928SBarry Smith   PetscFunctionBegin;
1024b9ad928SBarry Smith   shell = (PC_Shell*)pc->data;
1034b9ad928SBarry Smith   if (shell->setup) {
104e9a2bbcdSBarry Smith     CHKMEMQ;
1054b9ad928SBarry Smith     ierr  = (*shell->setup)(shell->ctx);CHKERRQ(ierr);
106e9a2bbcdSBarry Smith     CHKMEMQ;
1074b9ad928SBarry Smith   }
1084b9ad928SBarry Smith   PetscFunctionReturn(0);
1094b9ad928SBarry Smith }
1104b9ad928SBarry Smith 
1114b9ad928SBarry Smith #undef __FUNCT__
1124b9ad928SBarry Smith #define __FUNCT__ "PCApply_Shell"
1136849ba73SBarry Smith static PetscErrorCode PCApply_Shell(PC pc,Vec x,Vec y)
1144b9ad928SBarry Smith {
1154b9ad928SBarry Smith   PC_Shell       *shell;
116dfbe8321SBarry Smith   PetscErrorCode ierr;
1174b9ad928SBarry Smith 
1184b9ad928SBarry Smith   PetscFunctionBegin;
1194b9ad928SBarry Smith   shell = (PC_Shell*)pc->data;
1201302d50aSBarry Smith   if (!shell->apply) SETERRQ(PETSC_ERR_USER,"No apply() routine provided to Shell PC");
121e9a2bbcdSBarry Smith   PetscStackPush("PCSHELL user function");
122e9a2bbcdSBarry Smith   CHKMEMQ;
1234b9ad928SBarry Smith   ierr  = (*shell->apply)(shell->ctx,x,y);CHKERRQ(ierr);
124e9a2bbcdSBarry Smith   CHKMEMQ;
125e9a2bbcdSBarry Smith   PetscStackPop;
1264b9ad928SBarry Smith   PetscFunctionReturn(0);
1274b9ad928SBarry Smith }
1284b9ad928SBarry Smith 
1294b9ad928SBarry Smith #undef __FUNCT__
1307cdd61b2SBarry Smith #define __FUNCT__ "PCPreSolve_Shell"
1317cdd61b2SBarry Smith static PetscErrorCode PCPreSolve_Shell(PC pc,KSP ksp,Vec b,Vec x)
1327cdd61b2SBarry Smith {
1337cdd61b2SBarry Smith   PC_Shell       *shell;
1347cdd61b2SBarry Smith   PetscErrorCode ierr;
1357cdd61b2SBarry Smith 
1367cdd61b2SBarry Smith   PetscFunctionBegin;
1377cdd61b2SBarry Smith   shell = (PC_Shell*)pc->data;
13891ad8336SSatish Balay   if (!shell->presolve) SETERRQ(PETSC_ERR_USER,"No presolve() routine provided to Shell PC");
1397cdd61b2SBarry Smith   ierr  = (*shell->presolve)(shell->ctx,ksp,b,x);CHKERRQ(ierr);
1407cdd61b2SBarry Smith   PetscFunctionReturn(0);
1417cdd61b2SBarry Smith }
1427cdd61b2SBarry Smith 
1437cdd61b2SBarry Smith #undef __FUNCT__
1447cdd61b2SBarry Smith #define __FUNCT__ "PCPostSolve_Shell"
1457cdd61b2SBarry Smith static PetscErrorCode PCPostSolve_Shell(PC pc,KSP ksp,Vec b,Vec x)
1467cdd61b2SBarry Smith {
1477cdd61b2SBarry Smith   PC_Shell       *shell;
1487cdd61b2SBarry Smith   PetscErrorCode ierr;
1497cdd61b2SBarry Smith 
1507cdd61b2SBarry Smith   PetscFunctionBegin;
1517cdd61b2SBarry Smith   shell = (PC_Shell*)pc->data;
15291ad8336SSatish Balay   if (!shell->postsolve) SETERRQ(PETSC_ERR_USER,"No postsolve() routine provided to Shell PC");
15391ad8336SSatish Balay   ierr  = (*shell->postsolve)(shell->ctx,ksp,b,x);CHKERRQ(ierr);
1547cdd61b2SBarry Smith   PetscFunctionReturn(0);
1557cdd61b2SBarry Smith }
1567cdd61b2SBarry Smith 
1577cdd61b2SBarry Smith #undef __FUNCT__
1584b9ad928SBarry Smith #define __FUNCT__ "PCApplyTranspose_Shell"
1596849ba73SBarry Smith static PetscErrorCode PCApplyTranspose_Shell(PC pc,Vec x,Vec y)
1604b9ad928SBarry Smith {
1614b9ad928SBarry Smith   PC_Shell       *shell;
162dfbe8321SBarry Smith   PetscErrorCode ierr;
1634b9ad928SBarry Smith 
1644b9ad928SBarry Smith   PetscFunctionBegin;
1654b9ad928SBarry Smith   shell = (PC_Shell*)pc->data;
1661302d50aSBarry Smith   if (!shell->applytranspose) SETERRQ(PETSC_ERR_USER,"No applytranspose() routine provided to Shell PC");
1674b9ad928SBarry Smith   ierr  = (*shell->applytranspose)(shell->ctx,x,y);CHKERRQ(ierr);
1684b9ad928SBarry Smith   PetscFunctionReturn(0);
1694b9ad928SBarry Smith }
1704b9ad928SBarry Smith 
1714b9ad928SBarry Smith #undef __FUNCT__
1724b9ad928SBarry Smith #define __FUNCT__ "PCApplyRichardson_Shell"
17313f74950SBarry Smith static PetscErrorCode PCApplyRichardson_Shell(PC pc,Vec x,Vec y,Vec w,PetscReal rtol,PetscReal abstol, PetscReal dtol,PetscInt it)
1744b9ad928SBarry Smith {
175dfbe8321SBarry Smith   PetscErrorCode ierr;
1764b9ad928SBarry Smith   PC_Shell       *shell;
1774b9ad928SBarry Smith 
1784b9ad928SBarry Smith   PetscFunctionBegin;
1794b9ad928SBarry Smith   shell = (PC_Shell*)pc->data;
180be29d3c6SBarry Smith   ierr  = (*shell->applyrich)(shell->ctx,x,y,w,rtol,abstol,dtol,it);CHKERRQ(ierr);
1814b9ad928SBarry Smith   PetscFunctionReturn(0);
1824b9ad928SBarry Smith }
1834b9ad928SBarry Smith 
1844b9ad928SBarry Smith #undef __FUNCT__
1854b9ad928SBarry Smith #define __FUNCT__ "PCDestroy_Shell"
1866849ba73SBarry Smith static PetscErrorCode PCDestroy_Shell(PC pc)
1874b9ad928SBarry Smith {
1884b9ad928SBarry Smith   PC_Shell       *shell = (PC_Shell*)pc->data;
189dfbe8321SBarry Smith   PetscErrorCode ierr;
1904b9ad928SBarry Smith 
1914b9ad928SBarry Smith   PetscFunctionBegin;
1924b9ad928SBarry Smith   if (shell->name) {ierr = PetscFree(shell->name);}
1934b9ad928SBarry Smith   ierr = PetscFree(shell);CHKERRQ(ierr);
1944b9ad928SBarry Smith   PetscFunctionReturn(0);
1954b9ad928SBarry Smith }
1964b9ad928SBarry Smith 
1974b9ad928SBarry Smith #undef __FUNCT__
1984b9ad928SBarry Smith #define __FUNCT__ "PCView_Shell"
1996849ba73SBarry Smith static PetscErrorCode PCView_Shell(PC pc,PetscViewer viewer)
2004b9ad928SBarry Smith {
2014b9ad928SBarry Smith   PC_Shell       *shell = (PC_Shell*)pc->data;
202dfbe8321SBarry Smith   PetscErrorCode ierr;
20332077d6dSBarry Smith   PetscTruth     iascii;
2044b9ad928SBarry Smith 
2054b9ad928SBarry Smith   PetscFunctionBegin;
20632077d6dSBarry Smith   ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_ASCII,&iascii);CHKERRQ(ierr);
20732077d6dSBarry Smith   if (iascii) {
2084b9ad928SBarry Smith     if (shell->name) {ierr = PetscViewerASCIIPrintf(viewer,"  Shell: %s\n",shell->name);CHKERRQ(ierr);}
2094b9ad928SBarry Smith     else             {ierr = PetscViewerASCIIPrintf(viewer,"  Shell: no name\n");CHKERRQ(ierr);}
2104b9ad928SBarry Smith   }
2114b9ad928SBarry Smith   if (shell->view) {
2124b9ad928SBarry Smith     ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
2134b9ad928SBarry Smith     ierr  = (*shell->view)(shell->ctx,viewer);CHKERRQ(ierr);
2144b9ad928SBarry Smith     ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
2154b9ad928SBarry Smith   }
2164b9ad928SBarry Smith   PetscFunctionReturn(0);
2174b9ad928SBarry Smith }
2184b9ad928SBarry Smith 
2194b9ad928SBarry Smith /* ------------------------------------------------------------------------------*/
2204b9ad928SBarry Smith EXTERN_C_BEGIN
2214b9ad928SBarry Smith #undef __FUNCT__
2224b9ad928SBarry Smith #define __FUNCT__ "PCShellSetSetUp_Shell"
223dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetSetUp_Shell(PC pc, PetscErrorCode (*setup)(void*))
2244b9ad928SBarry Smith {
2254b9ad928SBarry Smith   PC_Shell *shell;
2264b9ad928SBarry Smith 
2274b9ad928SBarry Smith   PetscFunctionBegin;
2284b9ad928SBarry Smith   shell        = (PC_Shell*)pc->data;
2294b9ad928SBarry Smith   shell->setup = setup;
2304b9ad928SBarry Smith   PetscFunctionReturn(0);
2314b9ad928SBarry Smith }
2324b9ad928SBarry Smith EXTERN_C_END
2334b9ad928SBarry Smith 
2344b9ad928SBarry Smith EXTERN_C_BEGIN
2354b9ad928SBarry Smith #undef __FUNCT__
2364b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApply_Shell"
237be29d3c6SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApply_Shell(PC pc,PetscErrorCode (*apply)(void*,Vec,Vec))
2384b9ad928SBarry Smith {
2394b9ad928SBarry Smith   PC_Shell *shell;
2404b9ad928SBarry Smith 
2414b9ad928SBarry Smith   PetscFunctionBegin;
2424b9ad928SBarry Smith   shell        = (PC_Shell*)pc->data;
2434b9ad928SBarry Smith   shell->apply = apply;
2444b9ad928SBarry Smith   PetscFunctionReturn(0);
2454b9ad928SBarry Smith }
2464b9ad928SBarry Smith EXTERN_C_END
2474b9ad928SBarry Smith 
2484b9ad928SBarry Smith EXTERN_C_BEGIN
2494b9ad928SBarry Smith #undef __FUNCT__
2507cdd61b2SBarry Smith #define __FUNCT__ "PCShellSetPreSolve_Shell"
251be29d3c6SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetPreSolve_Shell(PC pc,PetscErrorCode (*presolve)(void*,KSP,Vec,Vec))
2527cdd61b2SBarry Smith {
2537cdd61b2SBarry Smith   PC_Shell *shell;
2547cdd61b2SBarry Smith 
2557cdd61b2SBarry Smith   PetscFunctionBegin;
2567cdd61b2SBarry Smith   shell             = (PC_Shell*)pc->data;
2577cdd61b2SBarry Smith   shell->presolve   = presolve;
2589bbb2c88SBarry Smith   if (presolve) {
2599bbb2c88SBarry Smith     pc->ops->presolve = PCPreSolve_Shell;
2609bbb2c88SBarry Smith   } else {
2619bbb2c88SBarry Smith     pc->ops->presolve = 0;
2629bbb2c88SBarry Smith   }
2637cdd61b2SBarry Smith   PetscFunctionReturn(0);
2647cdd61b2SBarry Smith }
2657cdd61b2SBarry Smith EXTERN_C_END
2667cdd61b2SBarry Smith 
2677cdd61b2SBarry Smith EXTERN_C_BEGIN
2687cdd61b2SBarry Smith #undef __FUNCT__
2697cdd61b2SBarry Smith #define __FUNCT__ "PCShellSetPostSolve_Shell"
270be29d3c6SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetPostSolve_Shell(PC pc,PetscErrorCode (*postsolve)(void*,KSP,Vec,Vec))
2717cdd61b2SBarry Smith {
2727cdd61b2SBarry Smith   PC_Shell *shell;
2737cdd61b2SBarry Smith 
2747cdd61b2SBarry Smith   PetscFunctionBegin;
2757cdd61b2SBarry Smith   shell           = (PC_Shell*)pc->data;
2767cdd61b2SBarry Smith   shell->postsolve = postsolve;
2779bbb2c88SBarry Smith   if (postsolve) {
2789bbb2c88SBarry Smith     pc->ops->postsolve = PCPostSolve_Shell;
2799bbb2c88SBarry Smith   } else {
2809bbb2c88SBarry Smith     pc->ops->postsolve = 0;
2819bbb2c88SBarry Smith   }
2827cdd61b2SBarry Smith   PetscFunctionReturn(0);
2837cdd61b2SBarry Smith }
2847cdd61b2SBarry Smith EXTERN_C_END
2857cdd61b2SBarry Smith 
2867cdd61b2SBarry Smith EXTERN_C_BEGIN
2877cdd61b2SBarry Smith #undef __FUNCT__
2884b9ad928SBarry Smith #define __FUNCT__ "PCShellSetView_Shell"
289dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetView_Shell(PC pc,PetscErrorCode (*view)(void*,PetscViewer))
2904b9ad928SBarry Smith {
2914b9ad928SBarry Smith   PC_Shell *shell;
2924b9ad928SBarry Smith 
2934b9ad928SBarry Smith   PetscFunctionBegin;
2944b9ad928SBarry Smith   shell        = (PC_Shell*)pc->data;
2954b9ad928SBarry Smith   shell->view = view;
2964b9ad928SBarry Smith   PetscFunctionReturn(0);
2974b9ad928SBarry Smith }
2984b9ad928SBarry Smith EXTERN_C_END
2994b9ad928SBarry Smith 
3004b9ad928SBarry Smith EXTERN_C_BEGIN
3014b9ad928SBarry Smith #undef __FUNCT__
3024b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApplyTranspose_Shell"
303dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApplyTranspose_Shell(PC pc,PetscErrorCode (*applytranspose)(void*,Vec,Vec))
3044b9ad928SBarry Smith {
3054b9ad928SBarry Smith   PC_Shell *shell;
3064b9ad928SBarry Smith 
3074b9ad928SBarry Smith   PetscFunctionBegin;
3084b9ad928SBarry Smith   shell                 = (PC_Shell*)pc->data;
3094b9ad928SBarry Smith   shell->applytranspose = applytranspose;
3104b9ad928SBarry Smith   PetscFunctionReturn(0);
3114b9ad928SBarry Smith }
3124b9ad928SBarry Smith EXTERN_C_END
3134b9ad928SBarry Smith 
3144b9ad928SBarry Smith EXTERN_C_BEGIN
3154b9ad928SBarry Smith #undef __FUNCT__
3164b9ad928SBarry Smith #define __FUNCT__ "PCShellSetName_Shell"
317dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetName_Shell(PC pc,const char name[])
3184b9ad928SBarry Smith {
3194b9ad928SBarry Smith   PC_Shell       *shell;
320dfbe8321SBarry Smith   PetscErrorCode ierr;
3214b9ad928SBarry Smith 
3224b9ad928SBarry Smith   PetscFunctionBegin;
3234b9ad928SBarry Smith   shell = (PC_Shell*)pc->data;
324*f259bd47SBarry Smith   ierr = PetscStrfree(shell->name);CHKERRQ(ierr);
3254b9ad928SBarry Smith   ierr = PetscStrallocpy(name,&shell->name);CHKERRQ(ierr);
3264b9ad928SBarry Smith   PetscFunctionReturn(0);
3274b9ad928SBarry Smith }
3284b9ad928SBarry Smith EXTERN_C_END
3294b9ad928SBarry Smith 
3304b9ad928SBarry Smith EXTERN_C_BEGIN
3314b9ad928SBarry Smith #undef __FUNCT__
3324b9ad928SBarry Smith #define __FUNCT__ "PCShellGetName_Shell"
333dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellGetName_Shell(PC pc,char *name[])
3344b9ad928SBarry Smith {
3354b9ad928SBarry Smith   PC_Shell *shell;
3364b9ad928SBarry Smith 
3374b9ad928SBarry Smith   PetscFunctionBegin;
3384b9ad928SBarry Smith   shell  = (PC_Shell*)pc->data;
3394b9ad928SBarry Smith   *name  = shell->name;
3404b9ad928SBarry Smith   PetscFunctionReturn(0);
3414b9ad928SBarry Smith }
3424b9ad928SBarry Smith EXTERN_C_END
3434b9ad928SBarry Smith 
3444b9ad928SBarry Smith EXTERN_C_BEGIN
3454b9ad928SBarry Smith #undef __FUNCT__
3464b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApplyRichardson_Shell"
347be29d3c6SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApplyRichardson_Shell(PC pc,PetscErrorCode (*apply)(void*,Vec,Vec,Vec,PetscReal,PetscReal,PetscReal,PetscInt))
3484b9ad928SBarry Smith {
3494b9ad928SBarry Smith   PC_Shell *shell;
3504b9ad928SBarry Smith 
3514b9ad928SBarry Smith   PetscFunctionBegin;
3524b9ad928SBarry Smith   shell                     = (PC_Shell*)pc->data;
3534b9ad928SBarry Smith   pc->ops->applyrichardson  = PCApplyRichardson_Shell;
3544b9ad928SBarry Smith   shell->applyrich          = apply;
3554b9ad928SBarry Smith   PetscFunctionReturn(0);
3564b9ad928SBarry Smith }
3574b9ad928SBarry Smith EXTERN_C_END
3584b9ad928SBarry Smith 
3594b9ad928SBarry Smith /* -------------------------------------------------------------------------------*/
3604b9ad928SBarry Smith 
3614b9ad928SBarry Smith #undef __FUNCT__
3624b9ad928SBarry Smith #define __FUNCT__ "PCShellSetSetUp"
3634b9ad928SBarry Smith /*@C
3644b9ad928SBarry Smith    PCShellSetSetUp - Sets routine to use to "setup" the preconditioner whenever the
3654b9ad928SBarry Smith    matrix operator is changed.
3664b9ad928SBarry Smith 
3674b9ad928SBarry Smith    Collective on PC
3684b9ad928SBarry Smith 
3694b9ad928SBarry Smith    Input Parameters:
3704b9ad928SBarry Smith +  pc - the preconditioner context
3714b9ad928SBarry Smith .  setup - the application-provided setup routine
3724b9ad928SBarry Smith 
3734b9ad928SBarry Smith    Calling sequence of setup:
3744b9ad928SBarry Smith .vb
37513f74950SBarry Smith    PetscErrorCode setup (void *ptr)
3764b9ad928SBarry Smith .ve
3774b9ad928SBarry Smith 
3784b9ad928SBarry Smith .  ptr - the application context
3794b9ad928SBarry Smith 
3804b9ad928SBarry Smith    Level: developer
3814b9ad928SBarry Smith 
3824b9ad928SBarry Smith .keywords: PC, shell, set, setup, user-provided
3834b9ad928SBarry Smith 
384be29d3c6SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetApply(), PCShellSetContext()
3854b9ad928SBarry Smith @*/
386dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetSetUp(PC pc,PetscErrorCode (*setup)(void*))
3874b9ad928SBarry Smith {
3886849ba73SBarry Smith   PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*));
3894b9ad928SBarry Smith 
3904b9ad928SBarry Smith   PetscFunctionBegin;
3914482741eSBarry Smith   PetscValidHeaderSpecific(pc,PC_COOKIE,1);
3924b9ad928SBarry Smith   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetSetUp_C",(void (**)(void))&f);CHKERRQ(ierr);
3934b9ad928SBarry Smith   if (f) {
3944b9ad928SBarry Smith     ierr = (*f)(pc,setup);CHKERRQ(ierr);
3954b9ad928SBarry Smith   }
3964b9ad928SBarry Smith   PetscFunctionReturn(0);
3974b9ad928SBarry Smith }
3984b9ad928SBarry Smith 
3994b9ad928SBarry Smith 
4004b9ad928SBarry Smith #undef __FUNCT__
4014b9ad928SBarry Smith #define __FUNCT__ "PCShellSetView"
4024b9ad928SBarry Smith /*@C
4034b9ad928SBarry Smith    PCShellSetView - Sets routine to use as viewer of shell preconditioner
4044b9ad928SBarry Smith 
4054b9ad928SBarry Smith    Collective on PC
4064b9ad928SBarry Smith 
4074b9ad928SBarry Smith    Input Parameters:
4084b9ad928SBarry Smith +  pc - the preconditioner context
4094b9ad928SBarry Smith -  view - the application-provided view routine
4104b9ad928SBarry Smith 
4114b9ad928SBarry Smith    Calling sequence of apply:
4124b9ad928SBarry Smith .vb
41313f74950SBarry Smith    PetscErrorCode view(void *ptr,PetscViewer v)
4144b9ad928SBarry Smith .ve
4154b9ad928SBarry Smith 
4164b9ad928SBarry Smith +  ptr - the application context
4174b9ad928SBarry Smith -  v   - viewer
4184b9ad928SBarry Smith 
4194b9ad928SBarry Smith    Level: developer
4204b9ad928SBarry Smith 
4214b9ad928SBarry Smith .keywords: PC, shell, set, apply, user-provided
4224b9ad928SBarry Smith 
4234b9ad928SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose()
4244b9ad928SBarry Smith @*/
425dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetView(PC pc,PetscErrorCode (*view)(void*,PetscViewer))
4264b9ad928SBarry Smith {
4276849ba73SBarry Smith   PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*,PetscViewer));
4284b9ad928SBarry Smith 
4294b9ad928SBarry Smith   PetscFunctionBegin;
4304482741eSBarry Smith   PetscValidHeaderSpecific(pc,PC_COOKIE,1);
4314b9ad928SBarry Smith   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetView_C",(void (**)(void))&f);CHKERRQ(ierr);
4324b9ad928SBarry Smith   if (f) {
4334b9ad928SBarry Smith     ierr = (*f)(pc,view);CHKERRQ(ierr);
4344b9ad928SBarry Smith   }
4354b9ad928SBarry Smith   PetscFunctionReturn(0);
4364b9ad928SBarry Smith }
4374b9ad928SBarry Smith 
4384b9ad928SBarry Smith #undef __FUNCT__
4394b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApply"
4404b9ad928SBarry Smith /*@C
4414b9ad928SBarry Smith    PCShellSetApply - Sets routine to use as preconditioner.
4424b9ad928SBarry Smith 
4434b9ad928SBarry Smith    Collective on PC
4444b9ad928SBarry Smith 
4454b9ad928SBarry Smith    Input Parameters:
4464b9ad928SBarry Smith +  pc - the preconditioner context
447be29d3c6SBarry Smith -  apply - the application-provided preconditioning routine
4484b9ad928SBarry Smith 
4494b9ad928SBarry Smith    Calling sequence of apply:
4504b9ad928SBarry Smith .vb
45113f74950SBarry Smith    PetscErrorCode apply (void *ptr,Vec xin,Vec xout)
4524b9ad928SBarry Smith .ve
4534b9ad928SBarry Smith 
4544b9ad928SBarry Smith +  ptr - the application context
4554b9ad928SBarry Smith .  xin - input vector
4564b9ad928SBarry Smith -  xout - output vector
4574b9ad928SBarry Smith 
4584b9ad928SBarry Smith    Level: developer
4594b9ad928SBarry Smith 
4604b9ad928SBarry Smith .keywords: PC, shell, set, apply, user-provided
4614b9ad928SBarry Smith 
462be29d3c6SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose(), PCShellSetContext()
4634b9ad928SBarry Smith @*/
464be29d3c6SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApply(PC pc,PetscErrorCode (*apply)(void*,Vec,Vec))
4654b9ad928SBarry Smith {
466be29d3c6SBarry Smith   PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*,Vec,Vec));
4674b9ad928SBarry Smith 
4684b9ad928SBarry Smith   PetscFunctionBegin;
4694482741eSBarry Smith   PetscValidHeaderSpecific(pc,PC_COOKIE,1);
4704b9ad928SBarry Smith   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetApply_C",(void (**)(void))&f);CHKERRQ(ierr);
4714b9ad928SBarry Smith   if (f) {
472be29d3c6SBarry Smith     ierr = (*f)(pc,apply);CHKERRQ(ierr);
4734b9ad928SBarry Smith   }
4744b9ad928SBarry Smith   PetscFunctionReturn(0);
4754b9ad928SBarry Smith }
4764b9ad928SBarry Smith 
4774b9ad928SBarry Smith #undef __FUNCT__
4784b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApplyTranspose"
4794b9ad928SBarry Smith /*@C
4804b9ad928SBarry Smith    PCShellSetApplyTranspose - Sets routine to use as preconditioner transpose.
4814b9ad928SBarry Smith 
4824b9ad928SBarry Smith    Collective on PC
4834b9ad928SBarry Smith 
4844b9ad928SBarry Smith    Input Parameters:
4854b9ad928SBarry Smith +  pc - the preconditioner context
4864b9ad928SBarry Smith -  apply - the application-provided preconditioning transpose routine
4874b9ad928SBarry Smith 
4884b9ad928SBarry Smith    Calling sequence of apply:
4894b9ad928SBarry Smith .vb
49013f74950SBarry Smith    PetscErrorCode applytranspose (void *ptr,Vec xin,Vec xout)
4914b9ad928SBarry Smith .ve
4924b9ad928SBarry Smith 
4934b9ad928SBarry Smith +  ptr - the application context
4944b9ad928SBarry Smith .  xin - input vector
4954b9ad928SBarry Smith -  xout - output vector
4964b9ad928SBarry Smith 
4974b9ad928SBarry Smith    Level: developer
4984b9ad928SBarry Smith 
4994b9ad928SBarry Smith    Notes:
5004b9ad928SBarry Smith    Uses the same context variable as PCShellSetApply().
5014b9ad928SBarry Smith 
5024b9ad928SBarry Smith .keywords: PC, shell, set, apply, user-provided
5034b9ad928SBarry Smith 
504be29d3c6SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApply(), PCSetContext()
5054b9ad928SBarry Smith @*/
506dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApplyTranspose(PC pc,PetscErrorCode (*applytranspose)(void*,Vec,Vec))
5074b9ad928SBarry Smith {
5086849ba73SBarry Smith   PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*,Vec,Vec));
5094b9ad928SBarry Smith 
5104b9ad928SBarry Smith   PetscFunctionBegin;
5114482741eSBarry Smith   PetscValidHeaderSpecific(pc,PC_COOKIE,1);
5124b9ad928SBarry Smith   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetApplyTranspose_C",(void (**)(void))&f);CHKERRQ(ierr);
5134b9ad928SBarry Smith   if (f) {
5144b9ad928SBarry Smith     ierr = (*f)(pc,applytranspose);CHKERRQ(ierr);
5154b9ad928SBarry Smith   }
5164b9ad928SBarry Smith   PetscFunctionReturn(0);
5174b9ad928SBarry Smith }
5184b9ad928SBarry Smith 
5194b9ad928SBarry Smith #undef __FUNCT__
5207cdd61b2SBarry Smith #define __FUNCT__ "PCShellSetPreSolve"
5217cdd61b2SBarry Smith /*@C
5227cdd61b2SBarry Smith    PCShellSetPreSolve - Sets routine to apply to the operators/vectors before a KSPSolve() is
5237cdd61b2SBarry Smith       applied. This usually does something like scale the linear system in some application
5247cdd61b2SBarry Smith       specific way.
5257cdd61b2SBarry Smith 
5267cdd61b2SBarry Smith    Collective on PC
5277cdd61b2SBarry Smith 
5287cdd61b2SBarry Smith    Input Parameters:
5297cdd61b2SBarry Smith +  pc - the preconditioner context
5307cdd61b2SBarry Smith -  presolve - the application-provided presolve routine
5317cdd61b2SBarry Smith 
5327cdd61b2SBarry Smith    Calling sequence of presolve:
5337cdd61b2SBarry Smith .vb
5347cdd61b2SBarry Smith    PetscErrorCode presolve (void *ptr,KSP ksp,Vec b,Vec x)
5357cdd61b2SBarry Smith .ve
5367cdd61b2SBarry Smith 
5377cdd61b2SBarry Smith +  ptr - the application context
5387cdd61b2SBarry Smith .  xin - input vector
5397cdd61b2SBarry Smith -  xout - output vector
5407cdd61b2SBarry Smith 
5417cdd61b2SBarry Smith    Level: developer
5427cdd61b2SBarry Smith 
5437cdd61b2SBarry Smith .keywords: PC, shell, set, apply, user-provided
5447cdd61b2SBarry Smith 
545be29d3c6SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose(), PCShellSetPostSolve(), PCShellSetContext()
5467cdd61b2SBarry Smith @*/
5477cdd61b2SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetPreSolve(PC pc,PetscErrorCode (*presolve)(void*,KSP,Vec,Vec))
5487cdd61b2SBarry Smith {
5497cdd61b2SBarry Smith   PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*,KSP,Vec,Vec));
5507cdd61b2SBarry Smith 
5517cdd61b2SBarry Smith   PetscFunctionBegin;
5527cdd61b2SBarry Smith   PetscValidHeaderSpecific(pc,PC_COOKIE,1);
5537cdd61b2SBarry Smith   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetPreSolve_C",(void (**)(void))&f);CHKERRQ(ierr);
5547cdd61b2SBarry Smith   if (f) {
5557cdd61b2SBarry Smith     ierr = (*f)(pc,presolve);CHKERRQ(ierr);
5567cdd61b2SBarry Smith   }
5577cdd61b2SBarry Smith   PetscFunctionReturn(0);
5587cdd61b2SBarry Smith }
5597cdd61b2SBarry Smith 
5607cdd61b2SBarry Smith #undef __FUNCT__
5617cdd61b2SBarry Smith #define __FUNCT__ "PCShellSetPostSolve"
5627cdd61b2SBarry Smith /*@C
5637cdd61b2SBarry Smith    PCShellSetPostSolve - Sets routine to apply to the operators/vectors before a KSPSolve() is
5647cdd61b2SBarry Smith       applied. This usually does something like scale the linear system in some application
5657cdd61b2SBarry Smith       specific way.
5667cdd61b2SBarry Smith 
5677cdd61b2SBarry Smith    Collective on PC
5687cdd61b2SBarry Smith 
5697cdd61b2SBarry Smith    Input Parameters:
5707cdd61b2SBarry Smith +  pc - the preconditioner context
5717cdd61b2SBarry Smith -  postsolve - the application-provided presolve routine
5727cdd61b2SBarry Smith 
5737cdd61b2SBarry Smith    Calling sequence of postsolve:
5747cdd61b2SBarry Smith .vb
5757cdd61b2SBarry Smith    PetscErrorCode postsolve(void *ptr,KSP ksp,Vec b,Vec x)
5767cdd61b2SBarry Smith .ve
5777cdd61b2SBarry Smith 
5787cdd61b2SBarry Smith +  ptr - the application context
5797cdd61b2SBarry Smith .  xin - input vector
5807cdd61b2SBarry Smith -  xout - output vector
5817cdd61b2SBarry Smith 
5827cdd61b2SBarry Smith    Level: developer
5837cdd61b2SBarry Smith 
5847cdd61b2SBarry Smith .keywords: PC, shell, set, apply, user-provided
5857cdd61b2SBarry Smith 
586be29d3c6SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose(), PCShellSetPreSolve(), PCShellSetContext()
5877cdd61b2SBarry Smith @*/
5887cdd61b2SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetPostSolve(PC pc,PetscErrorCode (*postsolve)(void*,KSP,Vec,Vec))
5897cdd61b2SBarry Smith {
5907cdd61b2SBarry Smith   PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*,KSP,Vec,Vec));
5917cdd61b2SBarry Smith 
5927cdd61b2SBarry Smith   PetscFunctionBegin;
5937cdd61b2SBarry Smith   PetscValidHeaderSpecific(pc,PC_COOKIE,1);
5947cdd61b2SBarry Smith   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetPostSolve_C",(void (**)(void))&f);CHKERRQ(ierr);
5957cdd61b2SBarry Smith   if (f) {
5967cdd61b2SBarry Smith     ierr = (*f)(pc,postsolve);CHKERRQ(ierr);
5977cdd61b2SBarry Smith   }
5987cdd61b2SBarry Smith   PetscFunctionReturn(0);
5997cdd61b2SBarry Smith }
6007cdd61b2SBarry Smith 
6017cdd61b2SBarry Smith #undef __FUNCT__
6024b9ad928SBarry Smith #define __FUNCT__ "PCShellSetName"
6034b9ad928SBarry Smith /*@C
6044b9ad928SBarry Smith    PCShellSetName - Sets an optional name to associate with a shell
6054b9ad928SBarry Smith    preconditioner.
6064b9ad928SBarry Smith 
6074b9ad928SBarry Smith    Not Collective
6084b9ad928SBarry Smith 
6094b9ad928SBarry Smith    Input Parameters:
6104b9ad928SBarry Smith +  pc - the preconditioner context
6114b9ad928SBarry Smith -  name - character string describing shell preconditioner
6124b9ad928SBarry Smith 
6134b9ad928SBarry Smith    Level: developer
6144b9ad928SBarry Smith 
6154b9ad928SBarry Smith .keywords: PC, shell, set, name, user-provided
6164b9ad928SBarry Smith 
6174b9ad928SBarry Smith .seealso: PCShellGetName()
6184b9ad928SBarry Smith @*/
619dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetName(PC pc,const char name[])
6204b9ad928SBarry Smith {
621dfbe8321SBarry Smith   PetscErrorCode ierr,(*f)(PC,const char []);
6224b9ad928SBarry Smith 
6234b9ad928SBarry Smith   PetscFunctionBegin;
6244482741eSBarry Smith   PetscValidHeaderSpecific(pc,PC_COOKIE,1);
6254b9ad928SBarry Smith   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetName_C",(void (**)(void))&f);CHKERRQ(ierr);
6264b9ad928SBarry Smith   if (f) {
6274b9ad928SBarry Smith     ierr = (*f)(pc,name);CHKERRQ(ierr);
6284b9ad928SBarry Smith   }
6294b9ad928SBarry Smith   PetscFunctionReturn(0);
6304b9ad928SBarry Smith }
6314b9ad928SBarry Smith 
6324b9ad928SBarry Smith #undef __FUNCT__
6334b9ad928SBarry Smith #define __FUNCT__ "PCShellGetName"
6344b9ad928SBarry Smith /*@C
6354b9ad928SBarry Smith    PCShellGetName - Gets an optional name that the user has set for a shell
6364b9ad928SBarry Smith    preconditioner.
6374b9ad928SBarry Smith 
6384b9ad928SBarry Smith    Not Collective
6394b9ad928SBarry Smith 
6404b9ad928SBarry Smith    Input Parameter:
6414b9ad928SBarry Smith .  pc - the preconditioner context
6424b9ad928SBarry Smith 
6434b9ad928SBarry Smith    Output Parameter:
6444b9ad928SBarry Smith .  name - character string describing shell preconditioner (you should not free this)
6454b9ad928SBarry Smith 
6464b9ad928SBarry Smith    Level: developer
6474b9ad928SBarry Smith 
6484b9ad928SBarry Smith .keywords: PC, shell, get, name, user-provided
6494b9ad928SBarry Smith 
6504b9ad928SBarry Smith .seealso: PCShellSetName()
6514b9ad928SBarry Smith @*/
652dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellGetName(PC pc,char *name[])
6534b9ad928SBarry Smith {
654dfbe8321SBarry Smith   PetscErrorCode ierr,(*f)(PC,char *[]);
6554b9ad928SBarry Smith 
6564b9ad928SBarry Smith   PetscFunctionBegin;
6574482741eSBarry Smith   PetscValidHeaderSpecific(pc,PC_COOKIE,1);
6584482741eSBarry Smith   PetscValidPointer(name,2);
6594b9ad928SBarry Smith   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellGetName_C",(void (**)(void))&f);CHKERRQ(ierr);
6604b9ad928SBarry Smith   if (f) {
6614b9ad928SBarry Smith     ierr = (*f)(pc,name);CHKERRQ(ierr);
6624b9ad928SBarry Smith   } else {
6631302d50aSBarry Smith     SETERRQ(PETSC_ERR_ARG_WRONG,"Not shell preconditioner, cannot get name");
6644b9ad928SBarry Smith   }
6654b9ad928SBarry Smith   PetscFunctionReturn(0);
6664b9ad928SBarry Smith }
6674b9ad928SBarry Smith 
6684b9ad928SBarry Smith #undef __FUNCT__
6694b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApplyRichardson"
6704b9ad928SBarry Smith /*@C
6714b9ad928SBarry Smith    PCShellSetApplyRichardson - Sets routine to use as preconditioner
6724b9ad928SBarry Smith    in Richardson iteration.
6734b9ad928SBarry Smith 
6744b9ad928SBarry Smith    Collective on PC
6754b9ad928SBarry Smith 
6764b9ad928SBarry Smith    Input Parameters:
6774b9ad928SBarry Smith +  pc - the preconditioner context
678be29d3c6SBarry Smith -  apply - the application-provided preconditioning routine
6794b9ad928SBarry Smith 
6804b9ad928SBarry Smith    Calling sequence of apply:
6814b9ad928SBarry Smith .vb
68213f74950SBarry Smith    PetscErrorCode apply (void *ptr,Vec b,Vec x,Vec r,PetscReal rtol,PetscReal abstol,PetscReal dtol,PetscInt maxits)
6834b9ad928SBarry Smith .ve
6844b9ad928SBarry Smith 
6854b9ad928SBarry Smith +  ptr - the application context
6864b9ad928SBarry Smith .  b - right-hand-side
6874b9ad928SBarry Smith .  x - current iterate
6884b9ad928SBarry Smith .  r - work space
6894b9ad928SBarry Smith .  rtol - relative tolerance of residual norm to stop at
69070441072SBarry Smith .  abstol - absolute tolerance of residual norm to stop at
6914b9ad928SBarry Smith .  dtol - if residual norm increases by this factor than return
6924b9ad928SBarry Smith -  maxits - number of iterations to run
6934b9ad928SBarry Smith 
6944b9ad928SBarry Smith    Level: developer
6954b9ad928SBarry Smith 
6964b9ad928SBarry Smith .keywords: PC, shell, set, apply, Richardson, user-provided
6974b9ad928SBarry Smith 
698be29d3c6SBarry Smith .seealso: PCShellSetApply(), PCShellSetContext()
6994b9ad928SBarry Smith @*/
700be29d3c6SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApplyRichardson(PC pc,PetscErrorCode (*apply)(void*,Vec,Vec,Vec,PetscReal,PetscReal,PetscReal,PetscInt))
7014b9ad928SBarry Smith {
702be29d3c6SBarry Smith   PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*,Vec,Vec,Vec,PetscReal,PetscReal,PetscReal,PetscInt));
7034b9ad928SBarry Smith 
7044b9ad928SBarry Smith   PetscFunctionBegin;
7054482741eSBarry Smith   PetscValidHeaderSpecific(pc,PC_COOKIE,1);
7064b9ad928SBarry Smith   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetApplyRichardson_C",(void (**)(void))&f);CHKERRQ(ierr);
7074b9ad928SBarry Smith   if (f) {
708be29d3c6SBarry Smith     ierr = (*f)(pc,apply);CHKERRQ(ierr);
7094b9ad928SBarry Smith   }
7104b9ad928SBarry Smith   PetscFunctionReturn(0);
7114b9ad928SBarry Smith }
7124b9ad928SBarry Smith 
7134b9ad928SBarry Smith /*MC
7144b9ad928SBarry Smith    PCSHELL - Creates a new preconditioner class for use with your
7154b9ad928SBarry Smith               own private data storage format.
7164b9ad928SBarry Smith 
7174b9ad928SBarry Smith    Level: advanced
7184b9ad928SBarry Smith 
7194b9ad928SBarry Smith    Concepts: providing your own preconditioner
7204b9ad928SBarry Smith 
7214b9ad928SBarry Smith   Usage:
7226849ba73SBarry Smith $             PetscErrorCode (*mult)(void*,Vec,Vec);
7236849ba73SBarry Smith $             PetscErrorCode (*setup)(void*);
7244b9ad928SBarry Smith $             PCCreate(comm,&pc);
7254b9ad928SBarry Smith $             PCSetType(pc,PCSHELL);
726be29d3c6SBarry Smith $             PCShellSetApply(pc,mult);
727be29d3c6SBarry Smith $             PCShellSetContext(pc,ctx)
7284b9ad928SBarry Smith $             PCShellSetSetUp(pc,setup);       (optional)
7294b9ad928SBarry Smith 
7304b9ad928SBarry Smith .seealso:  PCCreate(), PCSetType(), PCType (for list of available types), PC,
731fd2d0fe1Svictor            MATSHELL, PCShellSetSetUp(), PCShellSetApply(), PCShellSetView(),
732fd2d0fe1Svictor            PCShellSetApplyTranspose(), PCShellSetName(), PCShellSetApplyRichardson(),
733be29d3c6SBarry Smith            PCShellGetName(), PCShellSetContext(), PCShellGetContext()
7344b9ad928SBarry Smith M*/
7354b9ad928SBarry Smith 
7364b9ad928SBarry Smith EXTERN_C_BEGIN
7374b9ad928SBarry Smith #undef __FUNCT__
7384b9ad928SBarry Smith #define __FUNCT__ "PCCreate_Shell"
739dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCCreate_Shell(PC pc)
7404b9ad928SBarry Smith {
741dfbe8321SBarry Smith   PetscErrorCode ierr;
7424b9ad928SBarry Smith   PC_Shell       *shell;
7434b9ad928SBarry Smith 
7444b9ad928SBarry Smith   PetscFunctionBegin;
7454b9ad928SBarry Smith   pc->ops->destroy    = PCDestroy_Shell;
7464b9ad928SBarry Smith   ierr                = PetscNew(PC_Shell,&shell);CHKERRQ(ierr);
74752e6d16bSBarry Smith   ierr = PetscLogObjectMemory(pc,sizeof(PC_Shell));CHKERRQ(ierr);
7484b9ad928SBarry Smith   pc->data         = (void*)shell;
7494b9ad928SBarry Smith   pc->name         = 0;
7504b9ad928SBarry Smith 
7514b9ad928SBarry Smith   pc->ops->apply           = PCApply_Shell;
7524b9ad928SBarry Smith   pc->ops->view            = PCView_Shell;
7534b9ad928SBarry Smith   pc->ops->applytranspose  = PCApplyTranspose_Shell;
7544b9ad928SBarry Smith   pc->ops->applyrichardson = 0;
7554b9ad928SBarry Smith   pc->ops->setup           = PCSetUp_Shell;
7569bbb2c88SBarry Smith   pc->ops->presolve        = 0;
7579bbb2c88SBarry Smith   pc->ops->postsolve       = 0;
7584b9ad928SBarry Smith   pc->ops->view            = PCView_Shell;
7594b9ad928SBarry Smith 
7604b9ad928SBarry Smith   shell->apply          = 0;
7614b9ad928SBarry Smith   shell->applytranspose = 0;
7624b9ad928SBarry Smith   shell->name           = 0;
7634b9ad928SBarry Smith   shell->applyrich      = 0;
7647cdd61b2SBarry Smith   shell->presolve       = 0;
7657cdd61b2SBarry Smith   shell->postsolve      = 0;
7664b9ad928SBarry Smith   shell->ctx            = 0;
7674b9ad928SBarry Smith   shell->setup          = 0;
7684b9ad928SBarry Smith   shell->view           = 0;
7694b9ad928SBarry Smith 
7704b9ad928SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetSetUp_C","PCShellSetSetUp_Shell",
7714b9ad928SBarry Smith                     PCShellSetSetUp_Shell);CHKERRQ(ierr);
7724b9ad928SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetApply_C","PCShellSetApply_Shell",
7734b9ad928SBarry Smith                     PCShellSetApply_Shell);CHKERRQ(ierr);
7747cdd61b2SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetPreSolve_C","PCShellSetPreSolve_Shell",
7757cdd61b2SBarry Smith                     PCShellSetPreSolve_Shell);CHKERRQ(ierr);
7767cdd61b2SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetPostSolve_C","PCShellSetPostSolve_Shell",
7777cdd61b2SBarry Smith                     PCShellSetPostSolve_Shell);CHKERRQ(ierr);
7784b9ad928SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetView_C","PCShellSetView_Shell",
7794b9ad928SBarry Smith                     PCShellSetView_Shell);CHKERRQ(ierr);
780be29d3c6SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetApplyTranspose_C","PCShellSetApplyTranspose_Shell",
7814b9ad928SBarry Smith                     PCShellSetApplyTranspose_Shell);CHKERRQ(ierr);
7824b9ad928SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetName_C","PCShellSetName_Shell",
7834b9ad928SBarry Smith                     PCShellSetName_Shell);CHKERRQ(ierr);
7844b9ad928SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellGetName_C","PCShellGetName_Shell",
7854b9ad928SBarry Smith                     PCShellGetName_Shell);CHKERRQ(ierr);
786be29d3c6SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetApplyRichardson_C","PCShellSetApplyRichardson_Shell",
7874b9ad928SBarry Smith                     PCShellSetApplyRichardson_Shell);CHKERRQ(ierr);
7884b9ad928SBarry Smith   PetscFunctionReturn(0);
7894b9ad928SBarry Smith }
7904b9ad928SBarry Smith EXTERN_C_END
7914b9ad928SBarry Smith 
7924b9ad928SBarry Smith 
7934b9ad928SBarry Smith 
7944b9ad928SBarry Smith 
7954b9ad928SBarry Smith 
7964b9ad928SBarry Smith 
797