xref: /petsc/src/ksp/pc/impls/shell/shellpc.c (revision c6db04a5321582041def2b1e244c75985478b3ef)
14d0a8057SBarry Smith 
24b9ad928SBarry Smith /*
34b9ad928SBarry Smith    This provides a simple shell for Fortran (and C programmers) to
44b9ad928SBarry Smith   create their own preconditioner without writing much interface code.
54b9ad928SBarry Smith */
64b9ad928SBarry Smith 
7*c6db04a5SJed Brown #include <private/pcimpl.h>        /*I "petscpc.h" I*/
8*c6db04a5SJed Brown #include <private/vecimpl.h>
94b9ad928SBarry Smith 
10ac226902SBarry Smith EXTERN_C_BEGIN
114b9ad928SBarry Smith typedef struct {
12be29d3c6SBarry Smith   void           *ctx;                     /* user provided contexts for preconditioner */
136891c3e4SJed Brown   PetscErrorCode (*destroy)(PC);
146891c3e4SJed Brown   PetscErrorCode (*setup)(PC);
156891c3e4SJed Brown   PetscErrorCode (*apply)(PC,Vec,Vec);
166891c3e4SJed Brown   PetscErrorCode (*applyBA)(PC,PCSide,Vec,Vec,Vec);
176891c3e4SJed Brown   PetscErrorCode (*presolve)(PC,KSP,Vec,Vec);
186891c3e4SJed Brown   PetscErrorCode (*postsolve)(PC,KSP,Vec,Vec);
196891c3e4SJed Brown   PetscErrorCode (*view)(PC,PetscViewer);
206891c3e4SJed Brown   PetscErrorCode (*applytranspose)(PC,Vec,Vec);
21ace3abfcSBarry Smith   PetscErrorCode (*applyrich)(PC,Vec,Vec,Vec,PetscReal,PetscReal,PetscReal,PetscInt,PetscBool ,PetscInt*,PCRichardsonConvergedReason*);
224b9ad928SBarry Smith   char           *name;
234b9ad928SBarry Smith } PC_Shell;
24ac226902SBarry Smith EXTERN_C_END
254b9ad928SBarry Smith 
264b9ad928SBarry Smith #undef __FUNCT__
27be29d3c6SBarry Smith #define __FUNCT__ "PCShellGetContext"
28b29801fcSSatish Balay /*@C
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 @*/
487087cfbeSBarry Smith PetscErrorCode  PCShellGetContext(PC pc,void **ctx)
49be29d3c6SBarry Smith {
50be29d3c6SBarry Smith   PetscErrorCode ierr;
51ace3abfcSBarry Smith   PetscBool      flg;
52be29d3c6SBarry Smith 
53be29d3c6SBarry Smith   PetscFunctionBegin;
540700a824SBarry Smith   PetscValidHeaderSpecific(pc,PC_CLASSID,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"
649dd1005fSJed Brown /*@
65be29d3c6SBarry Smith     PCShellSetContext - sets the context for a shell PC
66be29d3c6SBarry Smith 
673f9fe445SBarry Smith    Logically 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 
786895c445SBarry Smith 
79be29d3c6SBarry Smith .seealso: PCCreateShell(), PCShellGetContext()
80be29d3c6SBarry Smith @*/
817087cfbeSBarry Smith PetscErrorCode  PCShellSetContext(PC pc,void *ctx)
82be29d3c6SBarry Smith {
83d01c8aa3SLisandro Dalcin   PC_Shell      *shell;
84be29d3c6SBarry Smith   PetscErrorCode ierr;
85ace3abfcSBarry Smith   PetscBool      flg;
86be29d3c6SBarry Smith 
87be29d3c6SBarry Smith   PetscFunctionBegin;
880700a824SBarry Smith   PetscValidHeaderSpecific(pc,PC_CLASSID,1);
89d01c8aa3SLisandro Dalcin   shell = (PC_Shell*)pc->data;
90be29d3c6SBarry Smith   ierr = PetscTypeCompare((PetscObject)pc,PCSHELL,&flg);CHKERRQ(ierr);
91be29d3c6SBarry Smith   if (flg) {
92be29d3c6SBarry Smith     shell->ctx = ctx;
93be29d3c6SBarry Smith   }
94be29d3c6SBarry Smith   PetscFunctionReturn(0);
95be29d3c6SBarry Smith }
96be29d3c6SBarry Smith 
97be29d3c6SBarry Smith #undef __FUNCT__
9818be62a5SSatish Balay #define __FUNCT__ "PCSetUp_Shell"
996849ba73SBarry Smith static PetscErrorCode PCSetUp_Shell(PC pc)
1004b9ad928SBarry Smith {
1014b9ad928SBarry Smith   PC_Shell       *shell;
102dfbe8321SBarry Smith   PetscErrorCode ierr;
1034b9ad928SBarry Smith 
1044b9ad928SBarry Smith   PetscFunctionBegin;
1054b9ad928SBarry Smith   shell = (PC_Shell*)pc->data;
106e7e72b3dSBarry Smith   if (!shell->setup) SETERRQ(((PetscObject)pc)->comm,PETSC_ERR_USER,"No setup() routine provided to Shell PC");
107eb6b5d47SBarry Smith   PetscStackCall("PCSHELL user function setup()",ierr  = (*shell->setup)(pc);CHKERRQ(ierr));
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;
120e7e72b3dSBarry Smith   if (!shell->apply) SETERRQ(((PetscObject)pc)->comm,PETSC_ERR_USER,"No apply() routine provided to Shell PC");
121eb6b5d47SBarry Smith   PetscStackCall("PCSHELL user function apply()",ierr = (*shell->apply)(pc,x,y);CHKERRQ(ierr));
1224b9ad928SBarry Smith   PetscFunctionReturn(0);
1234b9ad928SBarry Smith }
1244b9ad928SBarry Smith 
1254b9ad928SBarry Smith #undef __FUNCT__
1262bb17772SBarry Smith #define __FUNCT__ "PCApplyBA_Shell"
1272bb17772SBarry Smith static PetscErrorCode PCApplyBA_Shell(PC pc,PCSide side,Vec x,Vec y,Vec w)
1282bb17772SBarry Smith {
1292bb17772SBarry Smith   PC_Shell       *shell;
1302bb17772SBarry Smith   PetscErrorCode ierr;
1312bb17772SBarry Smith 
1322bb17772SBarry Smith   PetscFunctionBegin;
1332bb17772SBarry Smith   shell = (PC_Shell*)pc->data;
134e7e72b3dSBarry Smith   if (!shell->applyBA) SETERRQ(((PetscObject)pc)->comm,PETSC_ERR_USER,"No applyBA() routine provided to Shell PC");
135eb6b5d47SBarry Smith   PetscStackCall("PCSHELL user function applyBA()",ierr  = (*shell->applyBA)(pc,side,x,y,w);CHKERRQ(ierr));
1362bb17772SBarry Smith   PetscFunctionReturn(0);
1372bb17772SBarry Smith }
1382bb17772SBarry Smith 
1392bb17772SBarry Smith #undef __FUNCT__
1407cdd61b2SBarry Smith #define __FUNCT__ "PCPreSolve_Shell"
1417cdd61b2SBarry Smith static PetscErrorCode PCPreSolve_Shell(PC pc,KSP ksp,Vec b,Vec x)
1427cdd61b2SBarry Smith {
1437cdd61b2SBarry Smith   PC_Shell       *shell;
1447cdd61b2SBarry Smith   PetscErrorCode ierr;
1457cdd61b2SBarry Smith 
1467cdd61b2SBarry Smith   PetscFunctionBegin;
1477cdd61b2SBarry Smith   shell = (PC_Shell*)pc->data;
148e7e72b3dSBarry Smith   if (!shell->presolve) SETERRQ(((PetscObject)pc)->comm,PETSC_ERR_USER,"No presolve() routine provided to Shell PC");
149eb6b5d47SBarry Smith   PetscStackCall("PCSHELL user function presolve()",ierr  = (*shell->presolve)(pc,ksp,b,x);CHKERRQ(ierr));
1507cdd61b2SBarry Smith   PetscFunctionReturn(0);
1517cdd61b2SBarry Smith }
1527cdd61b2SBarry Smith 
1537cdd61b2SBarry Smith #undef __FUNCT__
1547cdd61b2SBarry Smith #define __FUNCT__ "PCPostSolve_Shell"
1557cdd61b2SBarry Smith static PetscErrorCode PCPostSolve_Shell(PC pc,KSP ksp,Vec b,Vec x)
1567cdd61b2SBarry Smith {
1577cdd61b2SBarry Smith   PC_Shell       *shell;
1587cdd61b2SBarry Smith   PetscErrorCode ierr;
1597cdd61b2SBarry Smith 
1607cdd61b2SBarry Smith   PetscFunctionBegin;
1617cdd61b2SBarry Smith   shell = (PC_Shell*)pc->data;
162e7e72b3dSBarry Smith   if (!shell->postsolve) SETERRQ(((PetscObject)pc)->comm,PETSC_ERR_USER,"No postsolve() routine provided to Shell PC");
163eb6b5d47SBarry Smith   PetscStackCall("PCSHELL user function postsolve()",ierr  = (*shell->postsolve)(pc,ksp,b,x);CHKERRQ(ierr));
1647cdd61b2SBarry Smith   PetscFunctionReturn(0);
1657cdd61b2SBarry Smith }
1667cdd61b2SBarry Smith 
1677cdd61b2SBarry Smith #undef __FUNCT__
1684b9ad928SBarry Smith #define __FUNCT__ "PCApplyTranspose_Shell"
1696849ba73SBarry Smith static PetscErrorCode PCApplyTranspose_Shell(PC pc,Vec x,Vec y)
1704b9ad928SBarry Smith {
1714b9ad928SBarry Smith   PC_Shell       *shell;
172dfbe8321SBarry Smith   PetscErrorCode ierr;
1734b9ad928SBarry Smith 
1744b9ad928SBarry Smith   PetscFunctionBegin;
1754b9ad928SBarry Smith   shell = (PC_Shell*)pc->data;
176e7e72b3dSBarry Smith   if (!shell->applytranspose) SETERRQ(((PetscObject)pc)->comm,PETSC_ERR_USER,"No applytranspose() routine provided to Shell PC");
177eb6b5d47SBarry Smith   PetscStackCall("PCSHELL user function applytranspose()",ierr  = (*shell->applytranspose)(pc,x,y);CHKERRQ(ierr));
1784b9ad928SBarry Smith   PetscFunctionReturn(0);
1794b9ad928SBarry Smith }
1804b9ad928SBarry Smith 
1814b9ad928SBarry Smith #undef __FUNCT__
1824b9ad928SBarry Smith #define __FUNCT__ "PCApplyRichardson_Shell"
183ace3abfcSBarry Smith static PetscErrorCode PCApplyRichardson_Shell(PC pc,Vec x,Vec y,Vec w,PetscReal rtol,PetscReal abstol, PetscReal dtol,PetscInt it,PetscBool  guesszero,PetscInt *outits,PCRichardsonConvergedReason *reason)
1844b9ad928SBarry Smith {
185dfbe8321SBarry Smith   PetscErrorCode ierr;
1864b9ad928SBarry Smith   PC_Shell       *shell;
1874b9ad928SBarry Smith 
1884b9ad928SBarry Smith   PetscFunctionBegin;
1894b9ad928SBarry Smith   shell = (PC_Shell*)pc->data;
190e7e72b3dSBarry Smith   if (!shell->applyrich) SETERRQ(((PetscObject)pc)->comm,PETSC_ERR_USER,"No applyrichardson() routine provided to Shell PC");
191eb6b5d47SBarry Smith   PetscStackCall("PCSHELL user function applyrichardson()",ierr  = (*shell->applyrich)(pc,x,y,w,rtol,abstol,dtol,it,guesszero,outits,reason);CHKERRQ(ierr));
1924b9ad928SBarry Smith   PetscFunctionReturn(0);
1934b9ad928SBarry Smith }
1944b9ad928SBarry Smith 
1954b9ad928SBarry Smith #undef __FUNCT__
1964b9ad928SBarry Smith #define __FUNCT__ "PCDestroy_Shell"
1976849ba73SBarry Smith static PetscErrorCode PCDestroy_Shell(PC pc)
1984b9ad928SBarry Smith {
1994b9ad928SBarry Smith   PC_Shell       *shell = (PC_Shell*)pc->data;
200dfbe8321SBarry Smith   PetscErrorCode ierr;
2014b9ad928SBarry Smith 
2024b9ad928SBarry Smith   PetscFunctionBegin;
203503cfb0cSBarry Smith   ierr = PetscFree(shell->name);CHKERRQ(ierr);
20418be62a5SSatish Balay   if (shell->destroy) {
205eb6b5d47SBarry Smith     PetscStackCall("PCSHELL user function destroy()",ierr  = (*shell->destroy)(pc);CHKERRQ(ierr));
20618be62a5SSatish Balay   }
207c31cb41cSBarry Smith   ierr = PetscFree(pc->data);CHKERRQ(ierr);
2084b9ad928SBarry Smith   PetscFunctionReturn(0);
2094b9ad928SBarry Smith }
2104b9ad928SBarry Smith 
2114b9ad928SBarry Smith #undef __FUNCT__
2124b9ad928SBarry Smith #define __FUNCT__ "PCView_Shell"
2136849ba73SBarry Smith static PetscErrorCode PCView_Shell(PC pc,PetscViewer viewer)
2144b9ad928SBarry Smith {
2154b9ad928SBarry Smith   PC_Shell       *shell = (PC_Shell*)pc->data;
216dfbe8321SBarry Smith   PetscErrorCode ierr;
217ace3abfcSBarry Smith   PetscBool      iascii;
2184b9ad928SBarry Smith 
2194b9ad928SBarry Smith   PetscFunctionBegin;
2202692d6eeSBarry Smith   ierr = PetscTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
22132077d6dSBarry Smith   if (iascii) {
2224b9ad928SBarry Smith     if (shell->name) {ierr = PetscViewerASCIIPrintf(viewer,"  Shell: %s\n",shell->name);CHKERRQ(ierr);}
2234b9ad928SBarry Smith     else             {ierr = PetscViewerASCIIPrintf(viewer,"  Shell: no name\n");CHKERRQ(ierr);}
2244b9ad928SBarry Smith   }
2254b9ad928SBarry Smith   if (shell->view) {
2264b9ad928SBarry Smith     ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
2276891c3e4SJed Brown     ierr  = (*shell->view)(pc,viewer);CHKERRQ(ierr);
2284b9ad928SBarry Smith     ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
2294b9ad928SBarry Smith   }
2304b9ad928SBarry Smith   PetscFunctionReturn(0);
2314b9ad928SBarry Smith }
2324b9ad928SBarry Smith 
2334b9ad928SBarry Smith /* ------------------------------------------------------------------------------*/
2344b9ad928SBarry Smith EXTERN_C_BEGIN
2354b9ad928SBarry Smith #undef __FUNCT__
23618be62a5SSatish Balay #define __FUNCT__ "PCShellSetDestroy_Shell"
2377087cfbeSBarry Smith PetscErrorCode  PCShellSetDestroy_Shell(PC pc, PetscErrorCode (*destroy)(PC))
23818be62a5SSatish Balay {
23918be62a5SSatish Balay   PC_Shell *shell;
24018be62a5SSatish Balay 
24118be62a5SSatish Balay   PetscFunctionBegin;
24218be62a5SSatish Balay   shell          = (PC_Shell*)pc->data;
24318be62a5SSatish Balay   shell->destroy = destroy;
24418be62a5SSatish Balay   PetscFunctionReturn(0);
24518be62a5SSatish Balay }
24618be62a5SSatish Balay EXTERN_C_END
24718be62a5SSatish Balay 
24818be62a5SSatish Balay EXTERN_C_BEGIN
24918be62a5SSatish Balay #undef __FUNCT__
2504b9ad928SBarry Smith #define __FUNCT__ "PCShellSetSetUp_Shell"
2517087cfbeSBarry Smith PetscErrorCode  PCShellSetSetUp_Shell(PC pc, PetscErrorCode (*setup)(PC))
2524b9ad928SBarry Smith {
2534b9ad928SBarry Smith   PC_Shell *shell;
2544b9ad928SBarry Smith 
2554b9ad928SBarry Smith   PetscFunctionBegin;
2564b9ad928SBarry Smith   shell        = (PC_Shell*)pc->data;
2574b9ad928SBarry Smith   shell->setup = setup;
258d01c8aa3SLisandro Dalcin   if (setup) pc->ops->setup = PCSetUp_Shell;
259d01c8aa3SLisandro Dalcin   else       pc->ops->setup = 0;
2604b9ad928SBarry Smith   PetscFunctionReturn(0);
2614b9ad928SBarry Smith }
2624b9ad928SBarry Smith EXTERN_C_END
2634b9ad928SBarry Smith 
2644b9ad928SBarry Smith EXTERN_C_BEGIN
2654b9ad928SBarry Smith #undef __FUNCT__
2664b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApply_Shell"
2677087cfbeSBarry Smith PetscErrorCode  PCShellSetApply_Shell(PC pc,PetscErrorCode (*apply)(PC,Vec,Vec))
2684b9ad928SBarry Smith {
2694b9ad928SBarry Smith   PC_Shell *shell;
2704b9ad928SBarry Smith 
2714b9ad928SBarry Smith   PetscFunctionBegin;
2724b9ad928SBarry Smith   shell        = (PC_Shell*)pc->data;
2734b9ad928SBarry Smith   shell->apply = apply;
2744b9ad928SBarry Smith   PetscFunctionReturn(0);
2754b9ad928SBarry Smith }
2764b9ad928SBarry Smith EXTERN_C_END
2774b9ad928SBarry Smith 
2784b9ad928SBarry Smith EXTERN_C_BEGIN
2794b9ad928SBarry Smith #undef __FUNCT__
2802bb17772SBarry Smith #define __FUNCT__ "PCShellSetApplyBA_Shell"
2817087cfbeSBarry Smith PetscErrorCode  PCShellSetApplyBA_Shell(PC pc,PetscErrorCode (*applyBA)(PC,PCSide,Vec,Vec,Vec))
2822bb17772SBarry Smith {
2832bb17772SBarry Smith   PC_Shell *shell;
2842bb17772SBarry Smith 
2852bb17772SBarry Smith   PetscFunctionBegin;
2862bb17772SBarry Smith   shell          = (PC_Shell*)pc->data;
287d01c8aa3SLisandro Dalcin   shell->applyBA = applyBA;
288d01c8aa3SLisandro Dalcin   if (applyBA) pc->ops->applyBA  = PCApplyBA_Shell;
289aef0136fSBarry Smith   else         pc->ops->applyBA  = 0;
2902bb17772SBarry Smith   PetscFunctionReturn(0);
2912bb17772SBarry Smith }
2922bb17772SBarry Smith EXTERN_C_END
2932bb17772SBarry Smith 
2942bb17772SBarry Smith EXTERN_C_BEGIN
2952bb17772SBarry Smith #undef __FUNCT__
2967cdd61b2SBarry Smith #define __FUNCT__ "PCShellSetPreSolve_Shell"
2977087cfbeSBarry Smith PetscErrorCode  PCShellSetPreSolve_Shell(PC pc,PetscErrorCode (*presolve)(PC,KSP,Vec,Vec))
2987cdd61b2SBarry Smith {
2997cdd61b2SBarry Smith   PC_Shell *shell;
3007cdd61b2SBarry Smith 
3017cdd61b2SBarry Smith   PetscFunctionBegin;
3027cdd61b2SBarry Smith   shell           = (PC_Shell*)pc->data;
3037cdd61b2SBarry Smith   shell->presolve = presolve;
304d01c8aa3SLisandro Dalcin   if (presolve) pc->ops->presolve = PCPreSolve_Shell;
305d01c8aa3SLisandro Dalcin   else          pc->ops->presolve = 0;
3067cdd61b2SBarry Smith   PetscFunctionReturn(0);
3077cdd61b2SBarry Smith }
3087cdd61b2SBarry Smith EXTERN_C_END
3097cdd61b2SBarry Smith 
3107cdd61b2SBarry Smith EXTERN_C_BEGIN
3117cdd61b2SBarry Smith #undef __FUNCT__
3127cdd61b2SBarry Smith #define __FUNCT__ "PCShellSetPostSolve_Shell"
3137087cfbeSBarry Smith PetscErrorCode  PCShellSetPostSolve_Shell(PC pc,PetscErrorCode (*postsolve)(PC,KSP,Vec,Vec))
3147cdd61b2SBarry Smith {
3157cdd61b2SBarry Smith   PC_Shell *shell;
3167cdd61b2SBarry Smith 
3177cdd61b2SBarry Smith   PetscFunctionBegin;
3187cdd61b2SBarry Smith   shell            = (PC_Shell*)pc->data;
3197cdd61b2SBarry Smith   shell->postsolve = postsolve;
320d01c8aa3SLisandro Dalcin   if (postsolve) pc->ops->postsolve = PCPostSolve_Shell;
321d01c8aa3SLisandro Dalcin   else           pc->ops->postsolve = 0;
3227cdd61b2SBarry Smith   PetscFunctionReturn(0);
3237cdd61b2SBarry Smith }
3247cdd61b2SBarry Smith EXTERN_C_END
3257cdd61b2SBarry Smith 
3267cdd61b2SBarry Smith EXTERN_C_BEGIN
3277cdd61b2SBarry Smith #undef __FUNCT__
3284b9ad928SBarry Smith #define __FUNCT__ "PCShellSetView_Shell"
3297087cfbeSBarry Smith PetscErrorCode  PCShellSetView_Shell(PC pc,PetscErrorCode (*view)(PC,PetscViewer))
3304b9ad928SBarry Smith {
3314b9ad928SBarry Smith   PC_Shell *shell;
3324b9ad928SBarry Smith 
3334b9ad928SBarry Smith   PetscFunctionBegin;
3344b9ad928SBarry Smith   shell        = (PC_Shell*)pc->data;
3354b9ad928SBarry Smith   shell->view = view;
3364b9ad928SBarry Smith   PetscFunctionReturn(0);
3374b9ad928SBarry Smith }
3384b9ad928SBarry Smith EXTERN_C_END
3394b9ad928SBarry Smith 
3404b9ad928SBarry Smith EXTERN_C_BEGIN
3414b9ad928SBarry Smith #undef __FUNCT__
3424b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApplyTranspose_Shell"
3437087cfbeSBarry Smith PetscErrorCode  PCShellSetApplyTranspose_Shell(PC pc,PetscErrorCode (*applytranspose)(PC,Vec,Vec))
3444b9ad928SBarry Smith {
3454b9ad928SBarry Smith   PC_Shell *shell;
3464b9ad928SBarry Smith 
3474b9ad928SBarry Smith   PetscFunctionBegin;
3484b9ad928SBarry Smith   shell                 = (PC_Shell*)pc->data;
3494b9ad928SBarry Smith   shell->applytranspose = applytranspose;
350d01c8aa3SLisandro Dalcin   if (applytranspose) pc->ops->applytranspose = PCApplyTranspose_Shell;
351d01c8aa3SLisandro Dalcin   else                pc->ops->applytranspose = 0;
352d01c8aa3SLisandro Dalcin   PetscFunctionReturn(0);
353d01c8aa3SLisandro Dalcin }
354d01c8aa3SLisandro Dalcin EXTERN_C_END
355d01c8aa3SLisandro Dalcin 
356d01c8aa3SLisandro Dalcin EXTERN_C_BEGIN
357d01c8aa3SLisandro Dalcin #undef __FUNCT__
358d01c8aa3SLisandro Dalcin #define __FUNCT__ "PCShellSetApplyRichardson_Shell"
3597087cfbeSBarry Smith PetscErrorCode  PCShellSetApplyRichardson_Shell(PC pc,PetscErrorCode (*applyrich)(PC,Vec,Vec,Vec,PetscReal,PetscReal,PetscReal,PetscInt,PetscBool ,PetscInt*,PCRichardsonConvergedReason*))
360d01c8aa3SLisandro Dalcin {
361d01c8aa3SLisandro Dalcin   PC_Shell *shell;
362d01c8aa3SLisandro Dalcin 
363d01c8aa3SLisandro Dalcin   PetscFunctionBegin;
364d01c8aa3SLisandro Dalcin   shell            = (PC_Shell*)pc->data;
365d01c8aa3SLisandro Dalcin   shell->applyrich = applyrich;
366d01c8aa3SLisandro Dalcin   if (applyrich) pc->ops->applyrichardson  = PCApplyRichardson_Shell;
367d01c8aa3SLisandro Dalcin   else           pc->ops->applyrichardson  = 0;
3684b9ad928SBarry Smith   PetscFunctionReturn(0);
3694b9ad928SBarry Smith }
3704b9ad928SBarry Smith EXTERN_C_END
3714b9ad928SBarry Smith 
3724b9ad928SBarry Smith EXTERN_C_BEGIN
3734b9ad928SBarry Smith #undef __FUNCT__
3744b9ad928SBarry Smith #define __FUNCT__ "PCShellSetName_Shell"
3757087cfbeSBarry Smith PetscErrorCode  PCShellSetName_Shell(PC pc,const char name[])
3764b9ad928SBarry Smith {
3774b9ad928SBarry Smith   PC_Shell       *shell;
378dfbe8321SBarry Smith   PetscErrorCode ierr;
3794b9ad928SBarry Smith 
3804b9ad928SBarry Smith   PetscFunctionBegin;
3814b9ad928SBarry Smith   shell = (PC_Shell*)pc->data;
382503cfb0cSBarry Smith   ierr = PetscFree(shell->name);CHKERRQ(ierr);
3834b9ad928SBarry Smith   ierr = PetscStrallocpy(name,&shell->name);CHKERRQ(ierr);
3844b9ad928SBarry Smith   PetscFunctionReturn(0);
3854b9ad928SBarry Smith }
3864b9ad928SBarry Smith EXTERN_C_END
3874b9ad928SBarry Smith 
3884b9ad928SBarry Smith EXTERN_C_BEGIN
3894b9ad928SBarry Smith #undef __FUNCT__
3904b9ad928SBarry Smith #define __FUNCT__ "PCShellGetName_Shell"
3917087cfbeSBarry Smith PetscErrorCode  PCShellGetName_Shell(PC pc,char *name[])
3924b9ad928SBarry Smith {
3934b9ad928SBarry Smith   PC_Shell *shell;
3944b9ad928SBarry Smith 
3954b9ad928SBarry Smith   PetscFunctionBegin;
3964b9ad928SBarry Smith   shell  = (PC_Shell*)pc->data;
3974b9ad928SBarry Smith   *name  = shell->name;
3984b9ad928SBarry Smith   PetscFunctionReturn(0);
3994b9ad928SBarry Smith }
4004b9ad928SBarry Smith EXTERN_C_END
4014b9ad928SBarry Smith 
4024b9ad928SBarry Smith /* -------------------------------------------------------------------------------*/
4034b9ad928SBarry Smith 
4044b9ad928SBarry Smith #undef __FUNCT__
40518be62a5SSatish Balay #define __FUNCT__ "PCShellSetDestroy"
40618be62a5SSatish Balay /*@C
40718be62a5SSatish Balay    PCShellSetDestroy - Sets routine to use to destroy the user-provided
40818be62a5SSatish Balay    application context.
40918be62a5SSatish Balay 
4103f9fe445SBarry Smith    Logically Collective on PC
41118be62a5SSatish Balay 
41218be62a5SSatish Balay    Input Parameters:
41318be62a5SSatish Balay +  pc - the preconditioner context
41418be62a5SSatish Balay .  destroy - the application-provided destroy routine
41518be62a5SSatish Balay 
41618be62a5SSatish Balay    Calling sequence of destroy:
41718be62a5SSatish Balay .vb
4186891c3e4SJed Brown    PetscErrorCode destroy (PC)
41918be62a5SSatish Balay .ve
42018be62a5SSatish Balay 
42118be62a5SSatish Balay .  ptr - the application context
42218be62a5SSatish Balay 
4234aa34b0aSBarry Smith    Notes: the function MUST return an error code of 0 on success and nonzero on failure.
4244aa34b0aSBarry Smith 
42518be62a5SSatish Balay    Level: developer
42618be62a5SSatish Balay 
42718be62a5SSatish Balay .keywords: PC, shell, set, destroy, user-provided
42818be62a5SSatish Balay 
42918be62a5SSatish Balay .seealso: PCShellSetApply(), PCShellSetContext()
43018be62a5SSatish Balay @*/
4317087cfbeSBarry Smith PetscErrorCode  PCShellSetDestroy(PC pc,PetscErrorCode (*destroy)(PC))
43218be62a5SSatish Balay {
4334ac538c5SBarry Smith   PetscErrorCode ierr;
43418be62a5SSatish Balay 
43518be62a5SSatish Balay   PetscFunctionBegin;
4360700a824SBarry Smith   PetscValidHeaderSpecific(pc,PC_CLASSID,1);
4374ac538c5SBarry Smith   ierr = PetscTryMethod(pc,"PCShellSetDestroy_C",(PC,PetscErrorCode (*)(PC)),(pc,destroy));CHKERRQ(ierr);
43818be62a5SSatish Balay   PetscFunctionReturn(0);
43918be62a5SSatish Balay }
44018be62a5SSatish Balay 
44118be62a5SSatish Balay 
44218be62a5SSatish Balay #undef __FUNCT__
4434b9ad928SBarry Smith #define __FUNCT__ "PCShellSetSetUp"
4444b9ad928SBarry Smith /*@C
4454b9ad928SBarry Smith    PCShellSetSetUp - Sets routine to use to "setup" the preconditioner whenever the
4464b9ad928SBarry Smith    matrix operator is changed.
4474b9ad928SBarry Smith 
4483f9fe445SBarry Smith    Logically Collective on PC
4494b9ad928SBarry Smith 
4504b9ad928SBarry Smith    Input Parameters:
4514b9ad928SBarry Smith +  pc - the preconditioner context
4524b9ad928SBarry Smith .  setup - the application-provided setup routine
4534b9ad928SBarry Smith 
4544b9ad928SBarry Smith    Calling sequence of setup:
4554b9ad928SBarry Smith .vb
4566891c3e4SJed Brown    PetscErrorCode setup (PC pc)
4574b9ad928SBarry Smith .ve
4584b9ad928SBarry Smith 
4596891c3e4SJed Brown .  pc - the preconditioner, get the application context with PCShellGetContext()
4604b9ad928SBarry Smith 
4614aa34b0aSBarry Smith    Notes: the function MUST return an error code of 0 on success and nonzero on failure.
4624aa34b0aSBarry Smith 
4634b9ad928SBarry Smith    Level: developer
4644b9ad928SBarry Smith 
4654b9ad928SBarry Smith .keywords: PC, shell, set, setup, user-provided
4664b9ad928SBarry Smith 
467be29d3c6SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetApply(), PCShellSetContext()
4684b9ad928SBarry Smith @*/
4697087cfbeSBarry Smith PetscErrorCode  PCShellSetSetUp(PC pc,PetscErrorCode (*setup)(PC))
4704b9ad928SBarry Smith {
4714ac538c5SBarry Smith   PetscErrorCode ierr;
4724b9ad928SBarry Smith 
4734b9ad928SBarry Smith   PetscFunctionBegin;
4740700a824SBarry Smith   PetscValidHeaderSpecific(pc,PC_CLASSID,1);
4754ac538c5SBarry Smith   ierr = PetscTryMethod(pc,"PCShellSetSetUp_C",(PC,PetscErrorCode (*)(PC)),(pc,setup));CHKERRQ(ierr);
4764b9ad928SBarry Smith   PetscFunctionReturn(0);
4774b9ad928SBarry Smith }
4784b9ad928SBarry Smith 
4794b9ad928SBarry Smith 
4804b9ad928SBarry Smith #undef __FUNCT__
4814b9ad928SBarry Smith #define __FUNCT__ "PCShellSetView"
4824b9ad928SBarry Smith /*@C
4834b9ad928SBarry Smith    PCShellSetView - Sets routine to use as viewer of shell preconditioner
4844b9ad928SBarry Smith 
4853f9fe445SBarry Smith    Logically Collective on PC
4864b9ad928SBarry Smith 
4874b9ad928SBarry Smith    Input Parameters:
4884b9ad928SBarry Smith +  pc - the preconditioner context
4894b9ad928SBarry Smith -  view - the application-provided view routine
4904b9ad928SBarry Smith 
4914b9ad928SBarry Smith    Calling sequence of apply:
4924b9ad928SBarry Smith .vb
4936891c3e4SJed Brown    PetscErrorCode view(PC pc,PetscViewer v)
4944b9ad928SBarry Smith .ve
4954b9ad928SBarry Smith 
4966891c3e4SJed Brown +  pc - the preconditioner, get the application context with PCShellGetContext()
4974b9ad928SBarry Smith -  v   - viewer
4984b9ad928SBarry Smith 
4994aa34b0aSBarry Smith    Notes: the function MUST return an error code of 0 on success and nonzero on failure.
5004aa34b0aSBarry Smith 
5014b9ad928SBarry Smith    Level: developer
5024b9ad928SBarry Smith 
5034b9ad928SBarry Smith .keywords: PC, shell, set, apply, user-provided
5044b9ad928SBarry Smith 
5054b9ad928SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose()
5064b9ad928SBarry Smith @*/
5077087cfbeSBarry Smith PetscErrorCode  PCShellSetView(PC pc,PetscErrorCode (*view)(PC,PetscViewer))
5084b9ad928SBarry Smith {
5094ac538c5SBarry Smith   PetscErrorCode ierr;
5104b9ad928SBarry Smith 
5114b9ad928SBarry Smith   PetscFunctionBegin;
5120700a824SBarry Smith   PetscValidHeaderSpecific(pc,PC_CLASSID,1);
5134ac538c5SBarry Smith   ierr = PetscTryMethod(pc,"PCShellSetView_C",(PC,PetscErrorCode (*)(PC,PetscViewer)),(pc,view));CHKERRQ(ierr);
5144b9ad928SBarry Smith   PetscFunctionReturn(0);
5154b9ad928SBarry Smith }
5164b9ad928SBarry Smith 
5174b9ad928SBarry Smith #undef __FUNCT__
5184b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApply"
5194b9ad928SBarry Smith /*@C
5204b9ad928SBarry Smith    PCShellSetApply - Sets routine to use as preconditioner.
5214b9ad928SBarry Smith 
5223f9fe445SBarry Smith    Logically Collective on PC
5234b9ad928SBarry Smith 
5244b9ad928SBarry Smith    Input Parameters:
5254b9ad928SBarry Smith +  pc - the preconditioner context
526be29d3c6SBarry Smith -  apply - the application-provided preconditioning routine
5274b9ad928SBarry Smith 
5284b9ad928SBarry Smith    Calling sequence of apply:
5294b9ad928SBarry Smith .vb
5306891c3e4SJed Brown    PetscErrorCode apply (PC pc,Vec xin,Vec xout)
5314b9ad928SBarry Smith .ve
5324b9ad928SBarry Smith 
5336891c3e4SJed Brown +  pc - the preconditioner, get the application context with PCShellGetContext()
5344b9ad928SBarry Smith .  xin - input vector
5354b9ad928SBarry Smith -  xout - output vector
5364b9ad928SBarry Smith 
5374aa34b0aSBarry Smith    Notes: the function MUST return an error code of 0 on success and nonzero on failure.
5384aa34b0aSBarry Smith 
539292fb18eSBarry Smith    Developer Notes: There should also be a PCShellSetApplySymmetricRight() and PCShellSetApplySymmetricLeft().
540292fb18eSBarry Smith 
5414b9ad928SBarry Smith    Level: developer
5424b9ad928SBarry Smith 
5434b9ad928SBarry Smith .keywords: PC, shell, set, apply, user-provided
5444b9ad928SBarry Smith 
5452bb17772SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose(), PCShellSetContext(), PCShellSetApplyBA()
5464b9ad928SBarry Smith @*/
5477087cfbeSBarry Smith PetscErrorCode  PCShellSetApply(PC pc,PetscErrorCode (*apply)(PC,Vec,Vec))
5484b9ad928SBarry Smith {
5494ac538c5SBarry Smith   PetscErrorCode ierr;
5504b9ad928SBarry Smith 
5514b9ad928SBarry Smith   PetscFunctionBegin;
5520700a824SBarry Smith   PetscValidHeaderSpecific(pc,PC_CLASSID,1);
5534ac538c5SBarry Smith   ierr = PetscTryMethod(pc,"PCShellSetApply_C",(PC,PetscErrorCode (*)(PC,Vec,Vec)),(pc,apply));CHKERRQ(ierr);
5544b9ad928SBarry Smith   PetscFunctionReturn(0);
5554b9ad928SBarry Smith }
5564b9ad928SBarry Smith 
5574b9ad928SBarry Smith #undef __FUNCT__
5582bb17772SBarry Smith #define __FUNCT__ "PCShellSetApplyBA"
5592bb17772SBarry Smith /*@C
5602bb17772SBarry Smith    PCShellSetApplyBA - Sets routine to use as preconditioner times operator.
5612bb17772SBarry Smith 
5623f9fe445SBarry Smith    Logically Collective on PC
5632bb17772SBarry Smith 
5642bb17772SBarry Smith    Input Parameters:
5652bb17772SBarry Smith +  pc - the preconditioner context
5662bb17772SBarry Smith -  applyBA - the application-provided BA routine
5672bb17772SBarry Smith 
5682bb17772SBarry Smith    Calling sequence of apply:
5692bb17772SBarry Smith .vb
5706891c3e4SJed Brown    PetscErrorCode applyBA (PC pc,Vec xin,Vec xout)
5712bb17772SBarry Smith .ve
5722bb17772SBarry Smith 
5736891c3e4SJed Brown +  pc - the preconditioner, get the application context with PCShellGetContext()
5742bb17772SBarry Smith .  xin - input vector
5752bb17772SBarry Smith -  xout - output vector
5762bb17772SBarry Smith 
5774aa34b0aSBarry Smith    Notes: the function MUST return an error code of 0 on success and nonzero on failure.
5784aa34b0aSBarry Smith 
5792bb17772SBarry Smith    Level: developer
5802bb17772SBarry Smith 
5812bb17772SBarry Smith .keywords: PC, shell, set, apply, user-provided
5822bb17772SBarry Smith 
5832bb17772SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose(), PCShellSetContext(), PCShellSetApply()
5842bb17772SBarry Smith @*/
5857087cfbeSBarry Smith PetscErrorCode  PCShellSetApplyBA(PC pc,PetscErrorCode (*applyBA)(PC,PCSide,Vec,Vec,Vec))
5862bb17772SBarry Smith {
5874ac538c5SBarry Smith   PetscErrorCode ierr;
5882bb17772SBarry Smith 
5892bb17772SBarry Smith   PetscFunctionBegin;
5900700a824SBarry Smith   PetscValidHeaderSpecific(pc,PC_CLASSID,1);
5914ac538c5SBarry Smith   ierr = PetscTryMethod(pc,"PCShellSetApplyBA_C",(PC,PetscErrorCode (*)(PC,PCSide,Vec,Vec,Vec)),(pc,applyBA));CHKERRQ(ierr);
5922bb17772SBarry Smith   PetscFunctionReturn(0);
5932bb17772SBarry Smith }
5942bb17772SBarry Smith 
5952bb17772SBarry Smith #undef __FUNCT__
5964b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApplyTranspose"
5974b9ad928SBarry Smith /*@C
5984b9ad928SBarry Smith    PCShellSetApplyTranspose - Sets routine to use as preconditioner transpose.
5994b9ad928SBarry Smith 
6003f9fe445SBarry Smith    Logically Collective on PC
6014b9ad928SBarry Smith 
6024b9ad928SBarry Smith    Input Parameters:
6034b9ad928SBarry Smith +  pc - the preconditioner context
6044b9ad928SBarry Smith -  apply - the application-provided preconditioning transpose routine
6054b9ad928SBarry Smith 
6064b9ad928SBarry Smith    Calling sequence of apply:
6074b9ad928SBarry Smith .vb
6086891c3e4SJed Brown    PetscErrorCode applytranspose (PC pc,Vec xin,Vec xout)
6094b9ad928SBarry Smith .ve
6104b9ad928SBarry Smith 
6116891c3e4SJed Brown +  pc - the preconditioner, get the application context with PCShellGetContext()
6124b9ad928SBarry Smith .  xin - input vector
6134b9ad928SBarry Smith -  xout - output vector
6144b9ad928SBarry Smith 
6154aa34b0aSBarry Smith    Notes: the function MUST return an error code of 0 on success and nonzero on failure.
6164aa34b0aSBarry Smith 
6174b9ad928SBarry Smith    Level: developer
6184b9ad928SBarry Smith 
6194b9ad928SBarry Smith    Notes:
6204b9ad928SBarry Smith    Uses the same context variable as PCShellSetApply().
6214b9ad928SBarry Smith 
6224b9ad928SBarry Smith .keywords: PC, shell, set, apply, user-provided
6234b9ad928SBarry Smith 
6242bb17772SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApply(), PCSetContext(), PCShellSetApplyBA()
6254b9ad928SBarry Smith @*/
6267087cfbeSBarry Smith PetscErrorCode  PCShellSetApplyTranspose(PC pc,PetscErrorCode (*applytranspose)(PC,Vec,Vec))
6274b9ad928SBarry Smith {
6284ac538c5SBarry Smith   PetscErrorCode ierr;
6294b9ad928SBarry Smith 
6304b9ad928SBarry Smith   PetscFunctionBegin;
6310700a824SBarry Smith   PetscValidHeaderSpecific(pc,PC_CLASSID,1);
6324ac538c5SBarry Smith   ierr = PetscTryMethod(pc,"PCShellSetApplyTranspose_C",(PC,PetscErrorCode (*)(PC,Vec,Vec)),(pc,applytranspose));CHKERRQ(ierr);
6334b9ad928SBarry Smith   PetscFunctionReturn(0);
6344b9ad928SBarry Smith }
6354b9ad928SBarry Smith 
6364b9ad928SBarry Smith #undef __FUNCT__
6377cdd61b2SBarry Smith #define __FUNCT__ "PCShellSetPreSolve"
6387cdd61b2SBarry Smith /*@C
6397cdd61b2SBarry Smith    PCShellSetPreSolve - Sets routine to apply to the operators/vectors before a KSPSolve() is
6407cdd61b2SBarry Smith       applied. This usually does something like scale the linear system in some application
6417cdd61b2SBarry Smith       specific way.
6427cdd61b2SBarry Smith 
6433f9fe445SBarry Smith    Logically Collective on PC
6447cdd61b2SBarry Smith 
6457cdd61b2SBarry Smith    Input Parameters:
6467cdd61b2SBarry Smith +  pc - the preconditioner context
6477cdd61b2SBarry Smith -  presolve - the application-provided presolve routine
6487cdd61b2SBarry Smith 
6497cdd61b2SBarry Smith    Calling sequence of presolve:
6507cdd61b2SBarry Smith .vb
6516891c3e4SJed Brown    PetscErrorCode presolve (PC,KSP ksp,Vec b,Vec x)
6527cdd61b2SBarry Smith .ve
6537cdd61b2SBarry Smith 
6546891c3e4SJed Brown +  pc - the preconditioner, get the application context with PCShellGetContext()
6557cdd61b2SBarry Smith .  xin - input vector
6567cdd61b2SBarry Smith -  xout - output vector
6577cdd61b2SBarry Smith 
6584aa34b0aSBarry Smith    Notes: the function MUST return an error code of 0 on success and nonzero on failure.
6594aa34b0aSBarry Smith 
6607cdd61b2SBarry Smith    Level: developer
6617cdd61b2SBarry Smith 
6627cdd61b2SBarry Smith .keywords: PC, shell, set, apply, user-provided
6637cdd61b2SBarry Smith 
664be29d3c6SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose(), PCShellSetPostSolve(), PCShellSetContext()
6657cdd61b2SBarry Smith @*/
6667087cfbeSBarry Smith PetscErrorCode  PCShellSetPreSolve(PC pc,PetscErrorCode (*presolve)(PC,KSP,Vec,Vec))
6677cdd61b2SBarry Smith {
6684ac538c5SBarry Smith   PetscErrorCode ierr;
6697cdd61b2SBarry Smith 
6707cdd61b2SBarry Smith   PetscFunctionBegin;
6710700a824SBarry Smith   PetscValidHeaderSpecific(pc,PC_CLASSID,1);
6724ac538c5SBarry Smith   ierr = PetscTryMethod(pc,"PCShellSetPreSolve_C",(PC,PetscErrorCode (*)(PC,KSP,Vec,Vec)),(pc,presolve));CHKERRQ(ierr);
6737cdd61b2SBarry Smith   PetscFunctionReturn(0);
6747cdd61b2SBarry Smith }
6757cdd61b2SBarry Smith 
6767cdd61b2SBarry Smith #undef __FUNCT__
6777cdd61b2SBarry Smith #define __FUNCT__ "PCShellSetPostSolve"
6787cdd61b2SBarry Smith /*@C
6797cdd61b2SBarry Smith    PCShellSetPostSolve - Sets routine to apply to the operators/vectors before a KSPSolve() is
6807cdd61b2SBarry Smith       applied. This usually does something like scale the linear system in some application
6817cdd61b2SBarry Smith       specific way.
6827cdd61b2SBarry Smith 
6833f9fe445SBarry Smith    Logically Collective on PC
6847cdd61b2SBarry Smith 
6857cdd61b2SBarry Smith    Input Parameters:
6867cdd61b2SBarry Smith +  pc - the preconditioner context
6877cdd61b2SBarry Smith -  postsolve - the application-provided presolve routine
6887cdd61b2SBarry Smith 
6897cdd61b2SBarry Smith    Calling sequence of postsolve:
6907cdd61b2SBarry Smith .vb
6916891c3e4SJed Brown    PetscErrorCode postsolve(PC,KSP ksp,Vec b,Vec x)
6927cdd61b2SBarry Smith .ve
6937cdd61b2SBarry Smith 
6946891c3e4SJed Brown +  pc - the preconditioner, get the application context with PCShellGetContext()
6957cdd61b2SBarry Smith .  xin - input vector
6967cdd61b2SBarry Smith -  xout - output vector
6977cdd61b2SBarry Smith 
6984aa34b0aSBarry Smith    Notes: the function MUST return an error code of 0 on success and nonzero on failure.
6994aa34b0aSBarry Smith 
7007cdd61b2SBarry Smith    Level: developer
7017cdd61b2SBarry Smith 
7027cdd61b2SBarry Smith .keywords: PC, shell, set, apply, user-provided
7037cdd61b2SBarry Smith 
704be29d3c6SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose(), PCShellSetPreSolve(), PCShellSetContext()
7057cdd61b2SBarry Smith @*/
7067087cfbeSBarry Smith PetscErrorCode  PCShellSetPostSolve(PC pc,PetscErrorCode (*postsolve)(PC,KSP,Vec,Vec))
7077cdd61b2SBarry Smith {
7084ac538c5SBarry Smith   PetscErrorCode ierr;
7097cdd61b2SBarry Smith 
7107cdd61b2SBarry Smith   PetscFunctionBegin;
7110700a824SBarry Smith   PetscValidHeaderSpecific(pc,PC_CLASSID,1);
7124ac538c5SBarry Smith   ierr = PetscTryMethod(pc,"PCShellSetPostSolve_C",(PC,PetscErrorCode (*)(PC,KSP,Vec,Vec)),(pc,postsolve));CHKERRQ(ierr);
7137cdd61b2SBarry Smith   PetscFunctionReturn(0);
7147cdd61b2SBarry Smith }
7157cdd61b2SBarry Smith 
7167cdd61b2SBarry Smith #undef __FUNCT__
7174b9ad928SBarry Smith #define __FUNCT__ "PCShellSetName"
7184b9ad928SBarry Smith /*@C
7194b9ad928SBarry Smith    PCShellSetName - Sets an optional name to associate with a shell
7204b9ad928SBarry Smith    preconditioner.
7214b9ad928SBarry Smith 
7224b9ad928SBarry Smith    Not Collective
7234b9ad928SBarry Smith 
7244b9ad928SBarry Smith    Input Parameters:
7254b9ad928SBarry Smith +  pc - the preconditioner context
7264b9ad928SBarry Smith -  name - character string describing shell preconditioner
7274b9ad928SBarry Smith 
7284b9ad928SBarry Smith    Level: developer
7294b9ad928SBarry Smith 
7304b9ad928SBarry Smith .keywords: PC, shell, set, name, user-provided
7314b9ad928SBarry Smith 
7324b9ad928SBarry Smith .seealso: PCShellGetName()
7334b9ad928SBarry Smith @*/
7347087cfbeSBarry Smith PetscErrorCode  PCShellSetName(PC pc,const char name[])
7354b9ad928SBarry Smith {
7364ac538c5SBarry Smith   PetscErrorCode ierr;
7374b9ad928SBarry Smith 
7384b9ad928SBarry Smith   PetscFunctionBegin;
7390700a824SBarry Smith   PetscValidHeaderSpecific(pc,PC_CLASSID,1);
7404ac538c5SBarry Smith   ierr = PetscTryMethod(pc,"PCShellSetName_C",(PC,const char []),(pc,name));CHKERRQ(ierr);
7414b9ad928SBarry Smith   PetscFunctionReturn(0);
7424b9ad928SBarry Smith }
7434b9ad928SBarry Smith 
7444b9ad928SBarry Smith #undef __FUNCT__
7454b9ad928SBarry Smith #define __FUNCT__ "PCShellGetName"
7464b9ad928SBarry Smith /*@C
7474b9ad928SBarry Smith    PCShellGetName - Gets an optional name that the user has set for a shell
7484b9ad928SBarry Smith    preconditioner.
7494b9ad928SBarry Smith 
7504b9ad928SBarry Smith    Not Collective
7514b9ad928SBarry Smith 
7524b9ad928SBarry Smith    Input Parameter:
7534b9ad928SBarry Smith .  pc - the preconditioner context
7544b9ad928SBarry Smith 
7554b9ad928SBarry Smith    Output Parameter:
7564b9ad928SBarry Smith .  name - character string describing shell preconditioner (you should not free this)
7574b9ad928SBarry Smith 
7584b9ad928SBarry Smith    Level: developer
7594b9ad928SBarry Smith 
7604b9ad928SBarry Smith .keywords: PC, shell, get, name, user-provided
7614b9ad928SBarry Smith 
7624b9ad928SBarry Smith .seealso: PCShellSetName()
7634b9ad928SBarry Smith @*/
7647087cfbeSBarry Smith PetscErrorCode  PCShellGetName(PC pc,char *name[])
7654b9ad928SBarry Smith {
7664ac538c5SBarry Smith   PetscErrorCode ierr;
7674b9ad928SBarry Smith 
7684b9ad928SBarry Smith   PetscFunctionBegin;
7690700a824SBarry Smith   PetscValidHeaderSpecific(pc,PC_CLASSID,1);
7704482741eSBarry Smith   PetscValidPointer(name,2);
7714ac538c5SBarry Smith   ierr = PetscUseMethod(pc,"PCShellGetName_C",(PC,char *[]),(pc,name));CHKERRQ(ierr);
7724b9ad928SBarry Smith   PetscFunctionReturn(0);
7734b9ad928SBarry Smith }
7744b9ad928SBarry Smith 
7754b9ad928SBarry Smith #undef __FUNCT__
7764b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApplyRichardson"
7774b9ad928SBarry Smith /*@C
7784b9ad928SBarry Smith    PCShellSetApplyRichardson - Sets routine to use as preconditioner
7794b9ad928SBarry Smith    in Richardson iteration.
7804b9ad928SBarry Smith 
7813f9fe445SBarry Smith    Logically Collective on PC
7824b9ad928SBarry Smith 
7834b9ad928SBarry Smith    Input Parameters:
7844b9ad928SBarry Smith +  pc - the preconditioner context
785be29d3c6SBarry Smith -  apply - the application-provided preconditioning routine
7864b9ad928SBarry Smith 
7874b9ad928SBarry Smith    Calling sequence of apply:
7884b9ad928SBarry Smith .vb
7896891c3e4SJed Brown    PetscErrorCode apply (PC pc,Vec b,Vec x,Vec r,PetscReal rtol,PetscReal abstol,PetscReal dtol,PetscInt maxits)
7904b9ad928SBarry Smith .ve
7914b9ad928SBarry Smith 
7926891c3e4SJed Brown +  pc - the preconditioner, get the application context with PCShellGetContext()
7934b9ad928SBarry Smith .  b - right-hand-side
7944b9ad928SBarry Smith .  x - current iterate
7954b9ad928SBarry Smith .  r - work space
7964b9ad928SBarry Smith .  rtol - relative tolerance of residual norm to stop at
79770441072SBarry Smith .  abstol - absolute tolerance of residual norm to stop at
7984b9ad928SBarry Smith .  dtol - if residual norm increases by this factor than return
7994b9ad928SBarry Smith -  maxits - number of iterations to run
8004b9ad928SBarry Smith 
8014aa34b0aSBarry Smith    Notes: the function MUST return an error code of 0 on success and nonzero on failure.
8024aa34b0aSBarry Smith 
8034b9ad928SBarry Smith    Level: developer
8044b9ad928SBarry Smith 
8054b9ad928SBarry Smith .keywords: PC, shell, set, apply, Richardson, user-provided
8064b9ad928SBarry Smith 
807be29d3c6SBarry Smith .seealso: PCShellSetApply(), PCShellSetContext()
8084b9ad928SBarry Smith @*/
8097087cfbeSBarry Smith PetscErrorCode  PCShellSetApplyRichardson(PC pc,PetscErrorCode (*apply)(PC,Vec,Vec,Vec,PetscReal,PetscReal,PetscReal,PetscInt,PetscBool ,PetscInt*,PCRichardsonConvergedReason*))
8104b9ad928SBarry Smith {
8114ac538c5SBarry Smith   PetscErrorCode ierr;
8124b9ad928SBarry Smith 
8134b9ad928SBarry Smith   PetscFunctionBegin;
8140700a824SBarry Smith   PetscValidHeaderSpecific(pc,PC_CLASSID,1);
8154ac538c5SBarry Smith   ierr = PetscTryMethod(pc,"PCShellSetApplyRichardson_C",(PC,PetscErrorCode (*)(PC,Vec,Vec,Vec,PetscReal,PetscReal,PetscReal,PetscInt,PetscBool ,PetscInt*,PCRichardsonConvergedReason*)),(pc,apply));CHKERRQ(ierr);
8164b9ad928SBarry Smith   PetscFunctionReturn(0);
8174b9ad928SBarry Smith }
8184b9ad928SBarry Smith 
8194b9ad928SBarry Smith /*MC
8204b9ad928SBarry Smith    PCSHELL - Creates a new preconditioner class for use with your
8214b9ad928SBarry Smith               own private data storage format.
8224b9ad928SBarry Smith 
8234b9ad928SBarry Smith    Level: advanced
82490198e61SBarry Smith >
8254b9ad928SBarry Smith    Concepts: providing your own preconditioner
8264b9ad928SBarry Smith 
8274b9ad928SBarry Smith   Usage:
8286891c3e4SJed Brown $             extern PetscErrorCode apply(PC,Vec,Vec);
8296891c3e4SJed Brown $             extern PetscErrorCode applyba(PC,PCSide,Vec,Vec,Vec);
8306891c3e4SJed Brown $             extern PetscErrorCode applytranspose(PC,Vec,Vec);
8316891c3e4SJed Brown $             extern PetscErrorCode setup(PC);
8326891c3e4SJed Brown $             extern PetscErrorCode destroy(PC);
8336891c3e4SJed Brown $
8344b9ad928SBarry Smith $             PCCreate(comm,&pc);
8354b9ad928SBarry Smith $             PCSetType(pc,PCSHELL);
836be29d3c6SBarry Smith $             PCShellSetContext(pc,ctx)
8376891c3e4SJed Brown $             PCShellSetApply(pc,apply);
8386891c3e4SJed Brown $             PCShellSetApplyBA(pc,applyba);               (optional)
8396891c3e4SJed Brown $             PCShellSetApplyTranspose(pc,applytranspose); (optional)
8404b9ad928SBarry Smith $             PCShellSetSetUp(pc,setup);                   (optional)
841d01c8aa3SLisandro Dalcin $             PCShellSetDestroy(pc,destroy);               (optional)
8424b9ad928SBarry Smith 
8434b9ad928SBarry Smith .seealso:  PCCreate(), PCSetType(), PCType (for list of available types), PC,
844fd2d0fe1Svictor            MATSHELL, PCShellSetSetUp(), PCShellSetApply(), PCShellSetView(),
845fd2d0fe1Svictor            PCShellSetApplyTranspose(), PCShellSetName(), PCShellSetApplyRichardson(),
8462bb17772SBarry Smith            PCShellGetName(), PCShellSetContext(), PCShellGetContext(), PCShellSetApplyBA()
8474b9ad928SBarry Smith M*/
8484b9ad928SBarry Smith 
8494b9ad928SBarry Smith EXTERN_C_BEGIN
8504b9ad928SBarry Smith #undef __FUNCT__
8514b9ad928SBarry Smith #define __FUNCT__ "PCCreate_Shell"
8527087cfbeSBarry Smith PetscErrorCode  PCCreate_Shell(PC pc)
8534b9ad928SBarry Smith {
854dfbe8321SBarry Smith   PetscErrorCode ierr;
8554b9ad928SBarry Smith   PC_Shell       *shell;
8564b9ad928SBarry Smith 
8574b9ad928SBarry Smith   PetscFunctionBegin;
85838f2d2fdSLisandro Dalcin   ierr = PetscNewLog(pc,PC_Shell,&shell);CHKERRQ(ierr);
8594b9ad928SBarry Smith   pc->data  = (void*)shell;
8604b9ad928SBarry Smith 
861d01c8aa3SLisandro Dalcin   pc->ops->destroy         = PCDestroy_Shell;
8624b9ad928SBarry Smith   pc->ops->view            = PCView_Shell;
863d01c8aa3SLisandro Dalcin   pc->ops->apply           = PCApply_Shell;
864d01c8aa3SLisandro Dalcin   pc->ops->applytranspose  = 0;
8654b9ad928SBarry Smith   pc->ops->applyrichardson = 0;
866d01c8aa3SLisandro Dalcin   pc->ops->setup           = 0;
8679bbb2c88SBarry Smith   pc->ops->presolve        = 0;
8689bbb2c88SBarry Smith   pc->ops->postsolve       = 0;
8694b9ad928SBarry Smith 
8704b9ad928SBarry Smith   shell->apply          = 0;
8714b9ad928SBarry Smith   shell->applytranspose = 0;
8724b9ad928SBarry Smith   shell->name           = 0;
8734b9ad928SBarry Smith   shell->applyrich      = 0;
8747cdd61b2SBarry Smith   shell->presolve       = 0;
8757cdd61b2SBarry Smith   shell->postsolve      = 0;
8764b9ad928SBarry Smith   shell->ctx            = 0;
8774b9ad928SBarry Smith   shell->setup          = 0;
8784b9ad928SBarry Smith   shell->view           = 0;
87918be62a5SSatish Balay   shell->destroy        = 0;
8804b9ad928SBarry Smith 
88118be62a5SSatish Balay   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetDestroy_C","PCShellSetDestroy_Shell",
88218be62a5SSatish Balay                     PCShellSetDestroy_Shell);CHKERRQ(ierr);
8834b9ad928SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetSetUp_C","PCShellSetSetUp_Shell",
8844b9ad928SBarry Smith                     PCShellSetSetUp_Shell);CHKERRQ(ierr);
8854b9ad928SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetApply_C","PCShellSetApply_Shell",
8864b9ad928SBarry Smith                     PCShellSetApply_Shell);CHKERRQ(ierr);
8872bb17772SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetApplyBA_C","PCShellSetApplyBA_Shell",
8882bb17772SBarry Smith                     PCShellSetApplyBA_Shell);CHKERRQ(ierr);
8897cdd61b2SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetPreSolve_C","PCShellSetPreSolve_Shell",
8907cdd61b2SBarry Smith                     PCShellSetPreSolve_Shell);CHKERRQ(ierr);
8917cdd61b2SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetPostSolve_C","PCShellSetPostSolve_Shell",
8927cdd61b2SBarry Smith                     PCShellSetPostSolve_Shell);CHKERRQ(ierr);
8934b9ad928SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetView_C","PCShellSetView_Shell",
8944b9ad928SBarry Smith                     PCShellSetView_Shell);CHKERRQ(ierr);
895be29d3c6SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetApplyTranspose_C","PCShellSetApplyTranspose_Shell",
8964b9ad928SBarry Smith                     PCShellSetApplyTranspose_Shell);CHKERRQ(ierr);
8974b9ad928SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetName_C","PCShellSetName_Shell",
8984b9ad928SBarry Smith                     PCShellSetName_Shell);CHKERRQ(ierr);
8994b9ad928SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellGetName_C","PCShellGetName_Shell",
9004b9ad928SBarry Smith                     PCShellGetName_Shell);CHKERRQ(ierr);
901be29d3c6SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetApplyRichardson_C","PCShellSetApplyRichardson_Shell",
9024b9ad928SBarry Smith                     PCShellSetApplyRichardson_Shell);CHKERRQ(ierr);
9034b9ad928SBarry Smith   PetscFunctionReturn(0);
9044b9ad928SBarry Smith }
9054b9ad928SBarry Smith EXTERN_C_END
9064b9ad928SBarry Smith 
9074b9ad928SBarry Smith 
9084b9ad928SBarry Smith 
9094b9ad928SBarry Smith 
9104b9ad928SBarry Smith 
9114b9ad928SBarry Smith 
912