xref: /petsc/src/ksp/pc/impls/shell/shellpc.c (revision 2fa5cd679192b9b390e47ae2d0650965e6b1d9fa)
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 
7b45d2f2cSJed Brown #include <petsc-private/pcimpl.h>        /*I "petscpc.h" I*/
8b45d2f2cSJed Brown #include <petsc-private/vecimpl.h>
94b9ad928SBarry Smith 
10ac226902SBarry Smith EXTERN_C_BEGIN
114b9ad928SBarry Smith typedef struct {
12be29d3c6SBarry Smith   void *ctx;                     /* user provided contexts for preconditioner */
13*2fa5cd67SKarl Rupp 
146891c3e4SJed Brown   PetscErrorCode (*destroy)(PC);
156891c3e4SJed Brown   PetscErrorCode (*setup)(PC);
166891c3e4SJed Brown   PetscErrorCode (*apply)(PC,Vec,Vec);
176891c3e4SJed Brown   PetscErrorCode (*applyBA)(PC,PCSide,Vec,Vec,Vec);
186891c3e4SJed Brown   PetscErrorCode (*presolve)(PC,KSP,Vec,Vec);
196891c3e4SJed Brown   PetscErrorCode (*postsolve)(PC,KSP,Vec,Vec);
206891c3e4SJed Brown   PetscErrorCode (*view)(PC,PetscViewer);
216891c3e4SJed Brown   PetscErrorCode (*applytranspose)(PC,Vec,Vec);
22ace3abfcSBarry Smith   PetscErrorCode (*applyrich)(PC,Vec,Vec,Vec,PetscReal,PetscReal,PetscReal,PetscInt,PetscBool,PetscInt*,PCRichardsonConvergedReason*);
23*2fa5cd67SKarl Rupp 
244b9ad928SBarry Smith   char *name;
254b9ad928SBarry Smith } PC_Shell;
26ac226902SBarry Smith EXTERN_C_END
274b9ad928SBarry Smith 
284b9ad928SBarry Smith #undef __FUNCT__
29be29d3c6SBarry Smith #define __FUNCT__ "PCShellGetContext"
30b29801fcSSatish Balay /*@C
31be29d3c6SBarry Smith     PCShellGetContext - Returns the user-provided context associated with a shell PC
32be29d3c6SBarry Smith 
33be29d3c6SBarry Smith     Not Collective
34be29d3c6SBarry Smith 
35be29d3c6SBarry Smith     Input Parameter:
36c5ae4b9aSBarry Smith .   pc - should have been created with PCSetType(pc,shell)
37be29d3c6SBarry Smith 
38be29d3c6SBarry Smith     Output Parameter:
39be29d3c6SBarry Smith .   ctx - the user provided context
40be29d3c6SBarry Smith 
41be29d3c6SBarry Smith     Level: advanced
42be29d3c6SBarry Smith 
43be29d3c6SBarry Smith     Notes:
44be29d3c6SBarry Smith     This routine is intended for use within various shell routines
45be29d3c6SBarry Smith 
46be29d3c6SBarry Smith .keywords: PC, shell, get, context
47be29d3c6SBarry Smith 
48c5ae4b9aSBarry Smith .seealso: PCShellSetContext()
49be29d3c6SBarry Smith @*/
507087cfbeSBarry Smith PetscErrorCode  PCShellGetContext(PC pc,void **ctx)
51be29d3c6SBarry Smith {
52be29d3c6SBarry Smith   PetscErrorCode ierr;
53ace3abfcSBarry Smith   PetscBool      flg;
54be29d3c6SBarry Smith 
55be29d3c6SBarry Smith   PetscFunctionBegin;
560700a824SBarry Smith   PetscValidHeaderSpecific(pc,PC_CLASSID,1);
57be29d3c6SBarry Smith   PetscValidPointer(ctx,2);
58251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompare((PetscObject)pc,PCSHELL,&flg);CHKERRQ(ierr);
59be29d3c6SBarry Smith   if (!flg) *ctx = 0;
60be29d3c6SBarry Smith   else      *ctx = ((PC_Shell*)(pc->data))->ctx;
61be29d3c6SBarry Smith   PetscFunctionReturn(0);
62be29d3c6SBarry Smith }
63be29d3c6SBarry Smith 
64be29d3c6SBarry Smith #undef __FUNCT__
65be29d3c6SBarry Smith #define __FUNCT__ "PCShellSetContext"
669dd1005fSJed Brown /*@
67be29d3c6SBarry Smith     PCShellSetContext - sets the context for a shell PC
68be29d3c6SBarry Smith 
693f9fe445SBarry Smith    Logically Collective on PC
70be29d3c6SBarry Smith 
71be29d3c6SBarry Smith     Input Parameters:
72be29d3c6SBarry Smith +   pc - the shell PC
73be29d3c6SBarry Smith -   ctx - the context
74be29d3c6SBarry Smith 
75be29d3c6SBarry Smith    Level: advanced
76be29d3c6SBarry Smith 
77be29d3c6SBarry Smith    Fortran Notes: The context can only be an integer or a PetscObject
78be29d3c6SBarry Smith       unfortunately it cannot be a Fortran array or derived type.
79be29d3c6SBarry Smith 
806895c445SBarry Smith 
81c5ae4b9aSBarry Smith .seealso: PCShellGetContext(), PCSHELL
82be29d3c6SBarry Smith @*/
837087cfbeSBarry Smith PetscErrorCode  PCShellSetContext(PC pc,void *ctx)
84be29d3c6SBarry Smith {
85c5ae4b9aSBarry Smith   PC_Shell       *shell = (PC_Shell*)pc->data;
86be29d3c6SBarry Smith   PetscErrorCode ierr;
87ace3abfcSBarry Smith   PetscBool      flg;
88be29d3c6SBarry Smith 
89be29d3c6SBarry Smith   PetscFunctionBegin;
900700a824SBarry Smith   PetscValidHeaderSpecific(pc,PC_CLASSID,1);
91251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompare((PetscObject)pc,PCSHELL,&flg);CHKERRQ(ierr);
92*2fa5cd67SKarl Rupp   if (flg) shell->ctx = ctx;
93be29d3c6SBarry Smith   PetscFunctionReturn(0);
94be29d3c6SBarry Smith }
95be29d3c6SBarry Smith 
96be29d3c6SBarry Smith #undef __FUNCT__
9718be62a5SSatish Balay #define __FUNCT__ "PCSetUp_Shell"
986849ba73SBarry Smith static PetscErrorCode PCSetUp_Shell(PC pc)
994b9ad928SBarry Smith {
100c5ae4b9aSBarry Smith   PC_Shell       *shell = (PC_Shell*)pc->data;
101dfbe8321SBarry Smith   PetscErrorCode ierr;
1024b9ad928SBarry Smith 
1034b9ad928SBarry Smith   PetscFunctionBegin;
104e7e72b3dSBarry Smith   if (!shell->setup) SETERRQ(((PetscObject)pc)->comm,PETSC_ERR_USER,"No setup() routine provided to Shell PC");
105eb6b5d47SBarry Smith   PetscStackCall("PCSHELL user function setup()",ierr  = (*shell->setup)(pc);CHKERRQ(ierr));
1064b9ad928SBarry Smith   PetscFunctionReturn(0);
1074b9ad928SBarry Smith }
1084b9ad928SBarry Smith 
1094b9ad928SBarry Smith #undef __FUNCT__
1104b9ad928SBarry Smith #define __FUNCT__ "PCApply_Shell"
1116849ba73SBarry Smith static PetscErrorCode PCApply_Shell(PC pc,Vec x,Vec y)
1124b9ad928SBarry Smith {
113c5ae4b9aSBarry Smith   PC_Shell       *shell = (PC_Shell*)pc->data;
114dfbe8321SBarry Smith   PetscErrorCode ierr;
1154b9ad928SBarry Smith 
1164b9ad928SBarry Smith   PetscFunctionBegin;
117e7e72b3dSBarry Smith   if (!shell->apply) SETERRQ(((PetscObject)pc)->comm,PETSC_ERR_USER,"No apply() routine provided to Shell PC");
118eb6b5d47SBarry Smith   PetscStackCall("PCSHELL user function apply()",ierr = (*shell->apply)(pc,x,y);CHKERRQ(ierr));
1194b9ad928SBarry Smith   PetscFunctionReturn(0);
1204b9ad928SBarry Smith }
1214b9ad928SBarry Smith 
1224b9ad928SBarry Smith #undef __FUNCT__
1232bb17772SBarry Smith #define __FUNCT__ "PCApplyBA_Shell"
1242bb17772SBarry Smith static PetscErrorCode PCApplyBA_Shell(PC pc,PCSide side,Vec x,Vec y,Vec w)
1252bb17772SBarry Smith {
126c5ae4b9aSBarry Smith   PC_Shell       *shell = (PC_Shell*)pc->data;
1272bb17772SBarry Smith   PetscErrorCode ierr;
1282bb17772SBarry Smith 
1292bb17772SBarry Smith   PetscFunctionBegin;
130e7e72b3dSBarry Smith   if (!shell->applyBA) SETERRQ(((PetscObject)pc)->comm,PETSC_ERR_USER,"No applyBA() routine provided to Shell PC");
131eb6b5d47SBarry Smith   PetscStackCall("PCSHELL user function applyBA()",ierr  = (*shell->applyBA)(pc,side,x,y,w);CHKERRQ(ierr));
1322bb17772SBarry Smith   PetscFunctionReturn(0);
1332bb17772SBarry Smith }
1342bb17772SBarry Smith 
1352bb17772SBarry Smith #undef __FUNCT__
1367cdd61b2SBarry Smith #define __FUNCT__ "PCPreSolve_Shell"
1377cdd61b2SBarry Smith static PetscErrorCode PCPreSolve_Shell(PC pc,KSP ksp,Vec b,Vec x)
1387cdd61b2SBarry Smith {
139c5ae4b9aSBarry Smith   PC_Shell       *shell = (PC_Shell*)pc->data;
1407cdd61b2SBarry Smith   PetscErrorCode ierr;
1417cdd61b2SBarry Smith 
1427cdd61b2SBarry Smith   PetscFunctionBegin;
143e7e72b3dSBarry Smith   if (!shell->presolve) SETERRQ(((PetscObject)pc)->comm,PETSC_ERR_USER,"No presolve() routine provided to Shell PC");
144eb6b5d47SBarry Smith   PetscStackCall("PCSHELL user function presolve()",ierr  = (*shell->presolve)(pc,ksp,b,x);CHKERRQ(ierr));
1457cdd61b2SBarry Smith   PetscFunctionReturn(0);
1467cdd61b2SBarry Smith }
1477cdd61b2SBarry Smith 
1487cdd61b2SBarry Smith #undef __FUNCT__
1497cdd61b2SBarry Smith #define __FUNCT__ "PCPostSolve_Shell"
1507cdd61b2SBarry Smith static PetscErrorCode PCPostSolve_Shell(PC pc,KSP ksp,Vec b,Vec x)
1517cdd61b2SBarry Smith {
152c5ae4b9aSBarry Smith   PC_Shell       *shell = (PC_Shell*)pc->data;
1537cdd61b2SBarry Smith   PetscErrorCode ierr;
1547cdd61b2SBarry Smith 
1557cdd61b2SBarry Smith   PetscFunctionBegin;
156e7e72b3dSBarry Smith   if (!shell->postsolve) SETERRQ(((PetscObject)pc)->comm,PETSC_ERR_USER,"No postsolve() routine provided to Shell PC");
157eb6b5d47SBarry Smith   PetscStackCall("PCSHELL user function postsolve()",ierr  = (*shell->postsolve)(pc,ksp,b,x);CHKERRQ(ierr));
1587cdd61b2SBarry Smith   PetscFunctionReturn(0);
1597cdd61b2SBarry Smith }
1607cdd61b2SBarry Smith 
1617cdd61b2SBarry Smith #undef __FUNCT__
1624b9ad928SBarry Smith #define __FUNCT__ "PCApplyTranspose_Shell"
1636849ba73SBarry Smith static PetscErrorCode PCApplyTranspose_Shell(PC pc,Vec x,Vec y)
1644b9ad928SBarry Smith {
165c5ae4b9aSBarry Smith   PC_Shell       *shell = (PC_Shell*)pc->data;
166dfbe8321SBarry Smith   PetscErrorCode ierr;
1674b9ad928SBarry Smith 
1684b9ad928SBarry Smith   PetscFunctionBegin;
169e7e72b3dSBarry Smith   if (!shell->applytranspose) SETERRQ(((PetscObject)pc)->comm,PETSC_ERR_USER,"No applytranspose() routine provided to Shell PC");
170eb6b5d47SBarry Smith   PetscStackCall("PCSHELL user function applytranspose()",ierr  = (*shell->applytranspose)(pc,x,y);CHKERRQ(ierr));
1714b9ad928SBarry Smith   PetscFunctionReturn(0);
1724b9ad928SBarry Smith }
1734b9ad928SBarry Smith 
1744b9ad928SBarry Smith #undef __FUNCT__
1754b9ad928SBarry Smith #define __FUNCT__ "PCApplyRichardson_Shell"
176ace3abfcSBarry 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)
1774b9ad928SBarry Smith {
178dfbe8321SBarry Smith   PetscErrorCode ierr;
179c5ae4b9aSBarry Smith   PC_Shell       *shell = (PC_Shell*)pc->data;
1804b9ad928SBarry Smith 
1814b9ad928SBarry Smith   PetscFunctionBegin;
182e7e72b3dSBarry Smith   if (!shell->applyrich) SETERRQ(((PetscObject)pc)->comm,PETSC_ERR_USER,"No applyrichardson() routine provided to Shell PC");
183eb6b5d47SBarry Smith   PetscStackCall("PCSHELL user function applyrichardson()",ierr  = (*shell->applyrich)(pc,x,y,w,rtol,abstol,dtol,it,guesszero,outits,reason);CHKERRQ(ierr));
1844b9ad928SBarry Smith   PetscFunctionReturn(0);
1854b9ad928SBarry Smith }
1864b9ad928SBarry Smith 
1874b9ad928SBarry Smith #undef __FUNCT__
1884b9ad928SBarry Smith #define __FUNCT__ "PCDestroy_Shell"
1896849ba73SBarry Smith static PetscErrorCode PCDestroy_Shell(PC pc)
1904b9ad928SBarry Smith {
1914b9ad928SBarry Smith   PC_Shell       *shell = (PC_Shell*)pc->data;
192dfbe8321SBarry Smith   PetscErrorCode ierr;
1934b9ad928SBarry Smith 
1944b9ad928SBarry Smith   PetscFunctionBegin;
195503cfb0cSBarry Smith   ierr = PetscFree(shell->name);CHKERRQ(ierr);
196*2fa5cd67SKarl Rupp   if (shell->destroy) PetscStackCall("PCSHELL user function destroy()",ierr  = (*shell->destroy)(pc);CHKERRQ(ierr));
197c31cb41cSBarry Smith   ierr = PetscFree(pc->data);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;
207ace3abfcSBarry Smith   PetscBool      iascii;
2084b9ad928SBarry Smith 
2094b9ad928SBarry Smith   PetscFunctionBegin;
210251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
21132077d6dSBarry Smith   if (iascii) {
212*2fa5cd67SKarl Rupp     if (shell->name) {
213*2fa5cd67SKarl Rupp       ierr = PetscViewerASCIIPrintf(viewer,"  Shell: %s\n",shell->name);CHKERRQ(ierr);
214*2fa5cd67SKarl Rupp     } else {
215*2fa5cd67SKarl Rupp       ierr = PetscViewerASCIIPrintf(viewer,"  Shell: no name\n");CHKERRQ(ierr);
216*2fa5cd67SKarl Rupp     }
2174b9ad928SBarry Smith   }
2184b9ad928SBarry Smith   if (shell->view) {
2194b9ad928SBarry Smith     ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
2206891c3e4SJed Brown     ierr = (*shell->view)(pc,viewer);CHKERRQ(ierr);
2214b9ad928SBarry Smith     ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
2224b9ad928SBarry Smith   }
2234b9ad928SBarry Smith   PetscFunctionReturn(0);
2244b9ad928SBarry Smith }
2254b9ad928SBarry Smith 
2264b9ad928SBarry Smith /* ------------------------------------------------------------------------------*/
2274b9ad928SBarry Smith EXTERN_C_BEGIN
2284b9ad928SBarry Smith #undef __FUNCT__
22918be62a5SSatish Balay #define __FUNCT__ "PCShellSetDestroy_Shell"
2307087cfbeSBarry Smith PetscErrorCode  PCShellSetDestroy_Shell(PC pc, PetscErrorCode (*destroy)(PC))
23118be62a5SSatish Balay {
232c5ae4b9aSBarry Smith   PC_Shell *shell= (PC_Shell*)pc->data;
23318be62a5SSatish Balay 
23418be62a5SSatish Balay   PetscFunctionBegin;
23518be62a5SSatish Balay   shell->destroy = destroy;
23618be62a5SSatish Balay   PetscFunctionReturn(0);
23718be62a5SSatish Balay }
23818be62a5SSatish Balay EXTERN_C_END
23918be62a5SSatish Balay 
24018be62a5SSatish Balay EXTERN_C_BEGIN
24118be62a5SSatish Balay #undef __FUNCT__
2424b9ad928SBarry Smith #define __FUNCT__ "PCShellSetSetUp_Shell"
2437087cfbeSBarry Smith PetscErrorCode  PCShellSetSetUp_Shell(PC pc, PetscErrorCode (*setup)(PC))
2444b9ad928SBarry Smith {
245c5ae4b9aSBarry Smith   PC_Shell *shell = (PC_Shell*)pc->data;;
2464b9ad928SBarry Smith 
2474b9ad928SBarry Smith   PetscFunctionBegin;
2484b9ad928SBarry Smith   shell->setup = setup;
249d01c8aa3SLisandro Dalcin   if (setup) pc->ops->setup = PCSetUp_Shell;
250d01c8aa3SLisandro Dalcin   else       pc->ops->setup = 0;
2514b9ad928SBarry Smith   PetscFunctionReturn(0);
2524b9ad928SBarry Smith }
2534b9ad928SBarry Smith EXTERN_C_END
2544b9ad928SBarry Smith 
2554b9ad928SBarry Smith EXTERN_C_BEGIN
2564b9ad928SBarry Smith #undef __FUNCT__
2574b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApply_Shell"
2587087cfbeSBarry Smith PetscErrorCode  PCShellSetApply_Shell(PC pc,PetscErrorCode (*apply)(PC,Vec,Vec))
2594b9ad928SBarry Smith {
260c5ae4b9aSBarry Smith   PC_Shell *shell = (PC_Shell*)pc->data;
2614b9ad928SBarry Smith 
2624b9ad928SBarry Smith   PetscFunctionBegin;
2634b9ad928SBarry Smith   shell->apply = apply;
2644b9ad928SBarry Smith   PetscFunctionReturn(0);
2654b9ad928SBarry Smith }
2664b9ad928SBarry Smith EXTERN_C_END
2674b9ad928SBarry Smith 
2684b9ad928SBarry Smith EXTERN_C_BEGIN
2694b9ad928SBarry Smith #undef __FUNCT__
2702bb17772SBarry Smith #define __FUNCT__ "PCShellSetApplyBA_Shell"
2717087cfbeSBarry Smith PetscErrorCode  PCShellSetApplyBA_Shell(PC pc,PetscErrorCode (*applyBA)(PC,PCSide,Vec,Vec,Vec))
2722bb17772SBarry Smith {
273c5ae4b9aSBarry Smith   PC_Shell *shell = (PC_Shell*)pc->data;
2742bb17772SBarry Smith 
2752bb17772SBarry Smith   PetscFunctionBegin;
276d01c8aa3SLisandro Dalcin   shell->applyBA = applyBA;
277d01c8aa3SLisandro Dalcin   if (applyBA) pc->ops->applyBA  = PCApplyBA_Shell;
278aef0136fSBarry Smith   else         pc->ops->applyBA  = 0;
2792bb17772SBarry Smith   PetscFunctionReturn(0);
2802bb17772SBarry Smith }
2812bb17772SBarry Smith EXTERN_C_END
2822bb17772SBarry Smith 
2832bb17772SBarry Smith EXTERN_C_BEGIN
2842bb17772SBarry Smith #undef __FUNCT__
2857cdd61b2SBarry Smith #define __FUNCT__ "PCShellSetPreSolve_Shell"
2867087cfbeSBarry Smith PetscErrorCode  PCShellSetPreSolve_Shell(PC pc,PetscErrorCode (*presolve)(PC,KSP,Vec,Vec))
2877cdd61b2SBarry Smith {
288c5ae4b9aSBarry Smith   PC_Shell *shell = (PC_Shell*)pc->data;
2897cdd61b2SBarry Smith 
2907cdd61b2SBarry Smith   PetscFunctionBegin;
2917cdd61b2SBarry Smith   shell->presolve = presolve;
292d01c8aa3SLisandro Dalcin   if (presolve) pc->ops->presolve = PCPreSolve_Shell;
293d01c8aa3SLisandro Dalcin   else          pc->ops->presolve = 0;
2947cdd61b2SBarry Smith   PetscFunctionReturn(0);
2957cdd61b2SBarry Smith }
2967cdd61b2SBarry Smith EXTERN_C_END
2977cdd61b2SBarry Smith 
2987cdd61b2SBarry Smith EXTERN_C_BEGIN
2997cdd61b2SBarry Smith #undef __FUNCT__
3007cdd61b2SBarry Smith #define __FUNCT__ "PCShellSetPostSolve_Shell"
3017087cfbeSBarry Smith PetscErrorCode  PCShellSetPostSolve_Shell(PC pc,PetscErrorCode (*postsolve)(PC,KSP,Vec,Vec))
3027cdd61b2SBarry Smith {
303c5ae4b9aSBarry Smith   PC_Shell *shell = (PC_Shell*)pc->data;
3047cdd61b2SBarry Smith 
3057cdd61b2SBarry Smith   PetscFunctionBegin;
3067cdd61b2SBarry Smith   shell->postsolve = postsolve;
307d01c8aa3SLisandro Dalcin   if (postsolve) pc->ops->postsolve = PCPostSolve_Shell;
308d01c8aa3SLisandro Dalcin   else           pc->ops->postsolve = 0;
3097cdd61b2SBarry Smith   PetscFunctionReturn(0);
3107cdd61b2SBarry Smith }
3117cdd61b2SBarry Smith EXTERN_C_END
3127cdd61b2SBarry Smith 
3137cdd61b2SBarry Smith EXTERN_C_BEGIN
3147cdd61b2SBarry Smith #undef __FUNCT__
3154b9ad928SBarry Smith #define __FUNCT__ "PCShellSetView_Shell"
3167087cfbeSBarry Smith PetscErrorCode  PCShellSetView_Shell(PC pc,PetscErrorCode (*view)(PC,PetscViewer))
3174b9ad928SBarry Smith {
318c5ae4b9aSBarry Smith   PC_Shell *shell = (PC_Shell*)pc->data;
3194b9ad928SBarry Smith 
3204b9ad928SBarry Smith   PetscFunctionBegin;
3214b9ad928SBarry Smith   shell->view = view;
3224b9ad928SBarry Smith   PetscFunctionReturn(0);
3234b9ad928SBarry Smith }
3244b9ad928SBarry Smith EXTERN_C_END
3254b9ad928SBarry Smith 
3264b9ad928SBarry Smith EXTERN_C_BEGIN
3274b9ad928SBarry Smith #undef __FUNCT__
3284b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApplyTranspose_Shell"
3297087cfbeSBarry Smith PetscErrorCode  PCShellSetApplyTranspose_Shell(PC pc,PetscErrorCode (*applytranspose)(PC,Vec,Vec))
3304b9ad928SBarry Smith {
331c5ae4b9aSBarry Smith   PC_Shell *shell = (PC_Shell*)pc->data;
3324b9ad928SBarry Smith 
3334b9ad928SBarry Smith   PetscFunctionBegin;
3344b9ad928SBarry Smith   shell->applytranspose = applytranspose;
335d01c8aa3SLisandro Dalcin   if (applytranspose) pc->ops->applytranspose = PCApplyTranspose_Shell;
336d01c8aa3SLisandro Dalcin   else                pc->ops->applytranspose = 0;
337d01c8aa3SLisandro Dalcin   PetscFunctionReturn(0);
338d01c8aa3SLisandro Dalcin }
339d01c8aa3SLisandro Dalcin EXTERN_C_END
340d01c8aa3SLisandro Dalcin 
341d01c8aa3SLisandro Dalcin EXTERN_C_BEGIN
342d01c8aa3SLisandro Dalcin #undef __FUNCT__
343d01c8aa3SLisandro Dalcin #define __FUNCT__ "PCShellSetApplyRichardson_Shell"
3447087cfbeSBarry Smith PetscErrorCode  PCShellSetApplyRichardson_Shell(PC pc,PetscErrorCode (*applyrich)(PC,Vec,Vec,Vec,PetscReal,PetscReal,PetscReal,PetscInt,PetscBool ,PetscInt*,PCRichardsonConvergedReason*))
345d01c8aa3SLisandro Dalcin {
346c5ae4b9aSBarry Smith   PC_Shell *shell = (PC_Shell*)pc->data;
347d01c8aa3SLisandro Dalcin 
348d01c8aa3SLisandro Dalcin   PetscFunctionBegin;
349d01c8aa3SLisandro Dalcin   shell->applyrich = applyrich;
350d01c8aa3SLisandro Dalcin   if (applyrich) pc->ops->applyrichardson = PCApplyRichardson_Shell;
351d01c8aa3SLisandro Dalcin   else           pc->ops->applyrichardson = 0;
3524b9ad928SBarry Smith   PetscFunctionReturn(0);
3534b9ad928SBarry Smith }
3544b9ad928SBarry Smith EXTERN_C_END
3554b9ad928SBarry Smith 
3564b9ad928SBarry Smith EXTERN_C_BEGIN
3574b9ad928SBarry Smith #undef __FUNCT__
3584b9ad928SBarry Smith #define __FUNCT__ "PCShellSetName_Shell"
3597087cfbeSBarry Smith PetscErrorCode  PCShellSetName_Shell(PC pc,const char name[])
3604b9ad928SBarry Smith {
361c5ae4b9aSBarry Smith   PC_Shell       *shell = (PC_Shell*)pc->data;
362dfbe8321SBarry Smith   PetscErrorCode ierr;
3634b9ad928SBarry Smith 
3644b9ad928SBarry Smith   PetscFunctionBegin;
365503cfb0cSBarry Smith   ierr = PetscFree(shell->name);CHKERRQ(ierr);
3664b9ad928SBarry Smith   ierr = PetscStrallocpy(name,&shell->name);CHKERRQ(ierr);
3674b9ad928SBarry Smith   PetscFunctionReturn(0);
3684b9ad928SBarry Smith }
3694b9ad928SBarry Smith EXTERN_C_END
3704b9ad928SBarry Smith 
3714b9ad928SBarry Smith EXTERN_C_BEGIN
3724b9ad928SBarry Smith #undef __FUNCT__
3734b9ad928SBarry Smith #define __FUNCT__ "PCShellGetName_Shell"
374ccaf0856SBarry Smith PetscErrorCode  PCShellGetName_Shell(PC pc,const char *name[])
3754b9ad928SBarry Smith {
376c5ae4b9aSBarry Smith   PC_Shell *shell = (PC_Shell*)pc->data;
3774b9ad928SBarry Smith 
3784b9ad928SBarry Smith   PetscFunctionBegin;
3794b9ad928SBarry Smith   *name = shell->name;
3804b9ad928SBarry Smith   PetscFunctionReturn(0);
3814b9ad928SBarry Smith }
3824b9ad928SBarry Smith EXTERN_C_END
3834b9ad928SBarry Smith 
3844b9ad928SBarry Smith /* -------------------------------------------------------------------------------*/
3854b9ad928SBarry Smith 
3864b9ad928SBarry Smith #undef __FUNCT__
38718be62a5SSatish Balay #define __FUNCT__ "PCShellSetDestroy"
38818be62a5SSatish Balay /*@C
38918be62a5SSatish Balay    PCShellSetDestroy - Sets routine to use to destroy the user-provided
39018be62a5SSatish Balay    application context.
39118be62a5SSatish Balay 
3923f9fe445SBarry Smith    Logically Collective on PC
39318be62a5SSatish Balay 
39418be62a5SSatish Balay    Input Parameters:
39518be62a5SSatish Balay +  pc - the preconditioner context
39618be62a5SSatish Balay .  destroy - the application-provided destroy routine
39718be62a5SSatish Balay 
39818be62a5SSatish Balay    Calling sequence of destroy:
39918be62a5SSatish Balay .vb
4006891c3e4SJed Brown    PetscErrorCode destroy (PC)
40118be62a5SSatish Balay .ve
40218be62a5SSatish Balay 
40318be62a5SSatish Balay .  ptr - the application context
40418be62a5SSatish Balay 
4054aa34b0aSBarry Smith    Notes: the function MUST return an error code of 0 on success and nonzero on failure.
4064aa34b0aSBarry Smith 
40718be62a5SSatish Balay    Level: developer
40818be62a5SSatish Balay 
40918be62a5SSatish Balay .keywords: PC, shell, set, destroy, user-provided
41018be62a5SSatish Balay 
41118be62a5SSatish Balay .seealso: PCShellSetApply(), PCShellSetContext()
41218be62a5SSatish Balay @*/
4137087cfbeSBarry Smith PetscErrorCode  PCShellSetDestroy(PC pc,PetscErrorCode (*destroy)(PC))
41418be62a5SSatish Balay {
4154ac538c5SBarry Smith   PetscErrorCode ierr;
41618be62a5SSatish Balay 
41718be62a5SSatish Balay   PetscFunctionBegin;
4180700a824SBarry Smith   PetscValidHeaderSpecific(pc,PC_CLASSID,1);
4194ac538c5SBarry Smith   ierr = PetscTryMethod(pc,"PCShellSetDestroy_C",(PC,PetscErrorCode (*)(PC)),(pc,destroy));CHKERRQ(ierr);
42018be62a5SSatish Balay   PetscFunctionReturn(0);
42118be62a5SSatish Balay }
42218be62a5SSatish Balay 
42318be62a5SSatish Balay 
42418be62a5SSatish Balay #undef __FUNCT__
4254b9ad928SBarry Smith #define __FUNCT__ "PCShellSetSetUp"
4264b9ad928SBarry Smith /*@C
4274b9ad928SBarry Smith    PCShellSetSetUp - Sets routine to use to "setup" the preconditioner whenever the
4284b9ad928SBarry Smith    matrix operator is changed.
4294b9ad928SBarry Smith 
4303f9fe445SBarry Smith    Logically Collective on PC
4314b9ad928SBarry Smith 
4324b9ad928SBarry Smith    Input Parameters:
4334b9ad928SBarry Smith +  pc - the preconditioner context
4344b9ad928SBarry Smith .  setup - the application-provided setup routine
4354b9ad928SBarry Smith 
4364b9ad928SBarry Smith    Calling sequence of setup:
4374b9ad928SBarry Smith .vb
4386891c3e4SJed Brown    PetscErrorCode setup (PC pc)
4394b9ad928SBarry Smith .ve
4404b9ad928SBarry Smith 
4416891c3e4SJed Brown .  pc - the preconditioner, get the application context with PCShellGetContext()
4424b9ad928SBarry Smith 
4434aa34b0aSBarry Smith    Notes: the function MUST return an error code of 0 on success and nonzero on failure.
4444aa34b0aSBarry Smith 
4454b9ad928SBarry Smith    Level: developer
4464b9ad928SBarry Smith 
4474b9ad928SBarry Smith .keywords: PC, shell, set, setup, user-provided
4484b9ad928SBarry Smith 
449be29d3c6SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetApply(), PCShellSetContext()
4504b9ad928SBarry Smith @*/
4517087cfbeSBarry Smith PetscErrorCode  PCShellSetSetUp(PC pc,PetscErrorCode (*setup)(PC))
4524b9ad928SBarry Smith {
4534ac538c5SBarry Smith   PetscErrorCode ierr;
4544b9ad928SBarry Smith 
4554b9ad928SBarry Smith   PetscFunctionBegin;
4560700a824SBarry Smith   PetscValidHeaderSpecific(pc,PC_CLASSID,1);
4574ac538c5SBarry Smith   ierr = PetscTryMethod(pc,"PCShellSetSetUp_C",(PC,PetscErrorCode (*)(PC)),(pc,setup));CHKERRQ(ierr);
4584b9ad928SBarry Smith   PetscFunctionReturn(0);
4594b9ad928SBarry Smith }
4604b9ad928SBarry Smith 
4614b9ad928SBarry Smith 
4624b9ad928SBarry Smith #undef __FUNCT__
4634b9ad928SBarry Smith #define __FUNCT__ "PCShellSetView"
4644b9ad928SBarry Smith /*@C
4654b9ad928SBarry Smith    PCShellSetView - Sets routine to use as viewer of shell preconditioner
4664b9ad928SBarry Smith 
4673f9fe445SBarry Smith    Logically Collective on PC
4684b9ad928SBarry Smith 
4694b9ad928SBarry Smith    Input Parameters:
4704b9ad928SBarry Smith +  pc - the preconditioner context
4714b9ad928SBarry Smith -  view - the application-provided view routine
4724b9ad928SBarry Smith 
4734b9ad928SBarry Smith    Calling sequence of apply:
4744b9ad928SBarry Smith .vb
4756891c3e4SJed Brown    PetscErrorCode view(PC pc,PetscViewer v)
4764b9ad928SBarry Smith .ve
4774b9ad928SBarry Smith 
4786891c3e4SJed Brown +  pc - the preconditioner, get the application context with PCShellGetContext()
4794b9ad928SBarry Smith -  v   - viewer
4804b9ad928SBarry Smith 
4814aa34b0aSBarry Smith    Notes: the function MUST return an error code of 0 on success and nonzero on failure.
4824aa34b0aSBarry Smith 
4834b9ad928SBarry Smith    Level: developer
4844b9ad928SBarry Smith 
4854b9ad928SBarry Smith .keywords: PC, shell, set, apply, user-provided
4864b9ad928SBarry Smith 
4874b9ad928SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose()
4884b9ad928SBarry Smith @*/
4897087cfbeSBarry Smith PetscErrorCode  PCShellSetView(PC pc,PetscErrorCode (*view)(PC,PetscViewer))
4904b9ad928SBarry Smith {
4914ac538c5SBarry Smith   PetscErrorCode ierr;
4924b9ad928SBarry Smith 
4934b9ad928SBarry Smith   PetscFunctionBegin;
4940700a824SBarry Smith   PetscValidHeaderSpecific(pc,PC_CLASSID,1);
4954ac538c5SBarry Smith   ierr = PetscTryMethod(pc,"PCShellSetView_C",(PC,PetscErrorCode (*)(PC,PetscViewer)),(pc,view));CHKERRQ(ierr);
4964b9ad928SBarry Smith   PetscFunctionReturn(0);
4974b9ad928SBarry Smith }
4984b9ad928SBarry Smith 
4994b9ad928SBarry Smith #undef __FUNCT__
5004b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApply"
5014b9ad928SBarry Smith /*@C
5024b9ad928SBarry Smith    PCShellSetApply - Sets routine to use as preconditioner.
5034b9ad928SBarry Smith 
5043f9fe445SBarry Smith    Logically Collective on PC
5054b9ad928SBarry Smith 
5064b9ad928SBarry Smith    Input Parameters:
5074b9ad928SBarry Smith +  pc - the preconditioner context
508be29d3c6SBarry Smith -  apply - the application-provided preconditioning routine
5094b9ad928SBarry Smith 
5104b9ad928SBarry Smith    Calling sequence of apply:
5114b9ad928SBarry Smith .vb
5126891c3e4SJed Brown    PetscErrorCode apply (PC pc,Vec xin,Vec xout)
5134b9ad928SBarry Smith .ve
5144b9ad928SBarry Smith 
5156891c3e4SJed Brown +  pc - the preconditioner, get the application context with PCShellGetContext()
5164b9ad928SBarry Smith .  xin - input vector
5174b9ad928SBarry Smith -  xout - output vector
5184b9ad928SBarry Smith 
5194aa34b0aSBarry Smith    Notes: the function MUST return an error code of 0 on success and nonzero on failure.
5204aa34b0aSBarry Smith 
521292fb18eSBarry Smith    Developer Notes: There should also be a PCShellSetApplySymmetricRight() and PCShellSetApplySymmetricLeft().
522292fb18eSBarry Smith 
5234b9ad928SBarry Smith    Level: developer
5244b9ad928SBarry Smith 
5254b9ad928SBarry Smith .keywords: PC, shell, set, apply, user-provided
5264b9ad928SBarry Smith 
5272bb17772SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose(), PCShellSetContext(), PCShellSetApplyBA()
5284b9ad928SBarry Smith @*/
5297087cfbeSBarry Smith PetscErrorCode  PCShellSetApply(PC pc,PetscErrorCode (*apply)(PC,Vec,Vec))
5304b9ad928SBarry Smith {
5314ac538c5SBarry Smith   PetscErrorCode ierr;
5324b9ad928SBarry Smith 
5334b9ad928SBarry Smith   PetscFunctionBegin;
5340700a824SBarry Smith   PetscValidHeaderSpecific(pc,PC_CLASSID,1);
5354ac538c5SBarry Smith   ierr = PetscTryMethod(pc,"PCShellSetApply_C",(PC,PetscErrorCode (*)(PC,Vec,Vec)),(pc,apply));CHKERRQ(ierr);
5364b9ad928SBarry Smith   PetscFunctionReturn(0);
5374b9ad928SBarry Smith }
5384b9ad928SBarry Smith 
5394b9ad928SBarry Smith #undef __FUNCT__
5402bb17772SBarry Smith #define __FUNCT__ "PCShellSetApplyBA"
5412bb17772SBarry Smith /*@C
5422bb17772SBarry Smith    PCShellSetApplyBA - Sets routine to use as preconditioner times operator.
5432bb17772SBarry Smith 
5443f9fe445SBarry Smith    Logically Collective on PC
5452bb17772SBarry Smith 
5462bb17772SBarry Smith    Input Parameters:
5472bb17772SBarry Smith +  pc - the preconditioner context
5482bb17772SBarry Smith -  applyBA - the application-provided BA routine
5492bb17772SBarry Smith 
5502bb17772SBarry Smith    Calling sequence of apply:
5512bb17772SBarry Smith .vb
5526891c3e4SJed Brown    PetscErrorCode applyBA (PC pc,Vec xin,Vec xout)
5532bb17772SBarry Smith .ve
5542bb17772SBarry Smith 
5556891c3e4SJed Brown +  pc - the preconditioner, get the application context with PCShellGetContext()
5562bb17772SBarry Smith .  xin - input vector
5572bb17772SBarry Smith -  xout - output vector
5582bb17772SBarry Smith 
5594aa34b0aSBarry Smith    Notes: the function MUST return an error code of 0 on success and nonzero on failure.
5604aa34b0aSBarry Smith 
5612bb17772SBarry Smith    Level: developer
5622bb17772SBarry Smith 
5632bb17772SBarry Smith .keywords: PC, shell, set, apply, user-provided
5642bb17772SBarry Smith 
5652bb17772SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose(), PCShellSetContext(), PCShellSetApply()
5662bb17772SBarry Smith @*/
5677087cfbeSBarry Smith PetscErrorCode  PCShellSetApplyBA(PC pc,PetscErrorCode (*applyBA)(PC,PCSide,Vec,Vec,Vec))
5682bb17772SBarry Smith {
5694ac538c5SBarry Smith   PetscErrorCode ierr;
5702bb17772SBarry Smith 
5712bb17772SBarry Smith   PetscFunctionBegin;
5720700a824SBarry Smith   PetscValidHeaderSpecific(pc,PC_CLASSID,1);
5734ac538c5SBarry Smith   ierr = PetscTryMethod(pc,"PCShellSetApplyBA_C",(PC,PetscErrorCode (*)(PC,PCSide,Vec,Vec,Vec)),(pc,applyBA));CHKERRQ(ierr);
5742bb17772SBarry Smith   PetscFunctionReturn(0);
5752bb17772SBarry Smith }
5762bb17772SBarry Smith 
5772bb17772SBarry Smith #undef __FUNCT__
5784b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApplyTranspose"
5794b9ad928SBarry Smith /*@C
5804b9ad928SBarry Smith    PCShellSetApplyTranspose - Sets routine to use as preconditioner transpose.
5814b9ad928SBarry Smith 
5823f9fe445SBarry Smith    Logically Collective on PC
5834b9ad928SBarry Smith 
5844b9ad928SBarry Smith    Input Parameters:
5854b9ad928SBarry Smith +  pc - the preconditioner context
5864b9ad928SBarry Smith -  apply - the application-provided preconditioning transpose routine
5874b9ad928SBarry Smith 
5884b9ad928SBarry Smith    Calling sequence of apply:
5894b9ad928SBarry Smith .vb
5906891c3e4SJed Brown    PetscErrorCode applytranspose (PC pc,Vec xin,Vec xout)
5914b9ad928SBarry Smith .ve
5924b9ad928SBarry Smith 
5936891c3e4SJed Brown +  pc - the preconditioner, get the application context with PCShellGetContext()
5944b9ad928SBarry Smith .  xin - input vector
5954b9ad928SBarry Smith -  xout - output vector
5964b9ad928SBarry Smith 
5974aa34b0aSBarry Smith    Notes: the function MUST return an error code of 0 on success and nonzero on failure.
5984aa34b0aSBarry Smith 
5994b9ad928SBarry Smith    Level: developer
6004b9ad928SBarry Smith 
6014b9ad928SBarry Smith    Notes:
6024b9ad928SBarry Smith    Uses the same context variable as PCShellSetApply().
6034b9ad928SBarry Smith 
6044b9ad928SBarry Smith .keywords: PC, shell, set, apply, user-provided
6054b9ad928SBarry Smith 
6062bb17772SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApply(), PCSetContext(), PCShellSetApplyBA()
6074b9ad928SBarry Smith @*/
6087087cfbeSBarry Smith PetscErrorCode  PCShellSetApplyTranspose(PC pc,PetscErrorCode (*applytranspose)(PC,Vec,Vec))
6094b9ad928SBarry Smith {
6104ac538c5SBarry Smith   PetscErrorCode ierr;
6114b9ad928SBarry Smith 
6124b9ad928SBarry Smith   PetscFunctionBegin;
6130700a824SBarry Smith   PetscValidHeaderSpecific(pc,PC_CLASSID,1);
6144ac538c5SBarry Smith   ierr = PetscTryMethod(pc,"PCShellSetApplyTranspose_C",(PC,PetscErrorCode (*)(PC,Vec,Vec)),(pc,applytranspose));CHKERRQ(ierr);
6154b9ad928SBarry Smith   PetscFunctionReturn(0);
6164b9ad928SBarry Smith }
6174b9ad928SBarry Smith 
6184b9ad928SBarry Smith #undef __FUNCT__
6197cdd61b2SBarry Smith #define __FUNCT__ "PCShellSetPreSolve"
6207cdd61b2SBarry Smith /*@C
6217cdd61b2SBarry Smith    PCShellSetPreSolve - Sets routine to apply to the operators/vectors before a KSPSolve() is
6227cdd61b2SBarry Smith       applied. This usually does something like scale the linear system in some application
6237cdd61b2SBarry Smith       specific way.
6247cdd61b2SBarry Smith 
6253f9fe445SBarry Smith    Logically Collective on PC
6267cdd61b2SBarry Smith 
6277cdd61b2SBarry Smith    Input Parameters:
6287cdd61b2SBarry Smith +  pc - the preconditioner context
6297cdd61b2SBarry Smith -  presolve - the application-provided presolve routine
6307cdd61b2SBarry Smith 
6317cdd61b2SBarry Smith    Calling sequence of presolve:
6327cdd61b2SBarry Smith .vb
6336891c3e4SJed Brown    PetscErrorCode presolve (PC,KSP ksp,Vec b,Vec x)
6347cdd61b2SBarry Smith .ve
6357cdd61b2SBarry Smith 
6366891c3e4SJed Brown +  pc - the preconditioner, get the application context with PCShellGetContext()
6377cdd61b2SBarry Smith .  xin - input vector
6387cdd61b2SBarry Smith -  xout - output vector
6397cdd61b2SBarry Smith 
6404aa34b0aSBarry Smith    Notes: the function MUST return an error code of 0 on success and nonzero on failure.
6414aa34b0aSBarry Smith 
6427cdd61b2SBarry Smith    Level: developer
6437cdd61b2SBarry Smith 
6447cdd61b2SBarry Smith .keywords: PC, shell, set, apply, user-provided
6457cdd61b2SBarry Smith 
646be29d3c6SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose(), PCShellSetPostSolve(), PCShellSetContext()
6477cdd61b2SBarry Smith @*/
6487087cfbeSBarry Smith PetscErrorCode  PCShellSetPreSolve(PC pc,PetscErrorCode (*presolve)(PC,KSP,Vec,Vec))
6497cdd61b2SBarry Smith {
6504ac538c5SBarry Smith   PetscErrorCode ierr;
6517cdd61b2SBarry Smith 
6527cdd61b2SBarry Smith   PetscFunctionBegin;
6530700a824SBarry Smith   PetscValidHeaderSpecific(pc,PC_CLASSID,1);
6544ac538c5SBarry Smith   ierr = PetscTryMethod(pc,"PCShellSetPreSolve_C",(PC,PetscErrorCode (*)(PC,KSP,Vec,Vec)),(pc,presolve));CHKERRQ(ierr);
6557cdd61b2SBarry Smith   PetscFunctionReturn(0);
6567cdd61b2SBarry Smith }
6577cdd61b2SBarry Smith 
6587cdd61b2SBarry Smith #undef __FUNCT__
6597cdd61b2SBarry Smith #define __FUNCT__ "PCShellSetPostSolve"
6607cdd61b2SBarry Smith /*@C
6617cdd61b2SBarry Smith    PCShellSetPostSolve - Sets routine to apply to the operators/vectors before a KSPSolve() is
6627cdd61b2SBarry Smith       applied. This usually does something like scale the linear system in some application
6637cdd61b2SBarry Smith       specific way.
6647cdd61b2SBarry Smith 
6653f9fe445SBarry Smith    Logically Collective on PC
6667cdd61b2SBarry Smith 
6677cdd61b2SBarry Smith    Input Parameters:
6687cdd61b2SBarry Smith +  pc - the preconditioner context
6697cdd61b2SBarry Smith -  postsolve - the application-provided presolve routine
6707cdd61b2SBarry Smith 
6717cdd61b2SBarry Smith    Calling sequence of postsolve:
6727cdd61b2SBarry Smith .vb
6736891c3e4SJed Brown    PetscErrorCode postsolve(PC,KSP ksp,Vec b,Vec x)
6747cdd61b2SBarry Smith .ve
6757cdd61b2SBarry Smith 
6766891c3e4SJed Brown +  pc - the preconditioner, get the application context with PCShellGetContext()
6777cdd61b2SBarry Smith .  xin - input vector
6787cdd61b2SBarry Smith -  xout - output vector
6797cdd61b2SBarry Smith 
6804aa34b0aSBarry Smith    Notes: the function MUST return an error code of 0 on success and nonzero on failure.
6814aa34b0aSBarry Smith 
6827cdd61b2SBarry Smith    Level: developer
6837cdd61b2SBarry Smith 
6847cdd61b2SBarry Smith .keywords: PC, shell, set, apply, user-provided
6857cdd61b2SBarry Smith 
686be29d3c6SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose(), PCShellSetPreSolve(), PCShellSetContext()
6877cdd61b2SBarry Smith @*/
6887087cfbeSBarry Smith PetscErrorCode  PCShellSetPostSolve(PC pc,PetscErrorCode (*postsolve)(PC,KSP,Vec,Vec))
6897cdd61b2SBarry Smith {
6904ac538c5SBarry Smith   PetscErrorCode ierr;
6917cdd61b2SBarry Smith 
6927cdd61b2SBarry Smith   PetscFunctionBegin;
6930700a824SBarry Smith   PetscValidHeaderSpecific(pc,PC_CLASSID,1);
6944ac538c5SBarry Smith   ierr = PetscTryMethod(pc,"PCShellSetPostSolve_C",(PC,PetscErrorCode (*)(PC,KSP,Vec,Vec)),(pc,postsolve));CHKERRQ(ierr);
6957cdd61b2SBarry Smith   PetscFunctionReturn(0);
6967cdd61b2SBarry Smith }
6977cdd61b2SBarry Smith 
6987cdd61b2SBarry Smith #undef __FUNCT__
6994b9ad928SBarry Smith #define __FUNCT__ "PCShellSetName"
7004b9ad928SBarry Smith /*@C
7014b9ad928SBarry Smith    PCShellSetName - Sets an optional name to associate with a shell
7024b9ad928SBarry Smith    preconditioner.
7034b9ad928SBarry Smith 
7044b9ad928SBarry Smith    Not Collective
7054b9ad928SBarry Smith 
7064b9ad928SBarry Smith    Input Parameters:
7074b9ad928SBarry Smith +  pc - the preconditioner context
7084b9ad928SBarry Smith -  name - character string describing shell preconditioner
7094b9ad928SBarry Smith 
7104b9ad928SBarry Smith    Level: developer
7114b9ad928SBarry Smith 
7124b9ad928SBarry Smith .keywords: PC, shell, set, name, user-provided
7134b9ad928SBarry Smith 
7144b9ad928SBarry Smith .seealso: PCShellGetName()
7154b9ad928SBarry Smith @*/
7167087cfbeSBarry Smith PetscErrorCode  PCShellSetName(PC pc,const char name[])
7174b9ad928SBarry Smith {
7184ac538c5SBarry Smith   PetscErrorCode ierr;
7194b9ad928SBarry Smith 
7204b9ad928SBarry Smith   PetscFunctionBegin;
7210700a824SBarry Smith   PetscValidHeaderSpecific(pc,PC_CLASSID,1);
7224ac538c5SBarry Smith   ierr = PetscTryMethod(pc,"PCShellSetName_C",(PC,const char []),(pc,name));CHKERRQ(ierr);
7234b9ad928SBarry Smith   PetscFunctionReturn(0);
7244b9ad928SBarry Smith }
7254b9ad928SBarry Smith 
7264b9ad928SBarry Smith #undef __FUNCT__
7274b9ad928SBarry Smith #define __FUNCT__ "PCShellGetName"
7284b9ad928SBarry Smith /*@C
7294b9ad928SBarry Smith    PCShellGetName - Gets an optional name that the user has set for a shell
7304b9ad928SBarry Smith    preconditioner.
7314b9ad928SBarry Smith 
7324b9ad928SBarry Smith    Not Collective
7334b9ad928SBarry Smith 
7344b9ad928SBarry Smith    Input Parameter:
7354b9ad928SBarry Smith .  pc - the preconditioner context
7364b9ad928SBarry Smith 
7374b9ad928SBarry Smith    Output Parameter:
7384b9ad928SBarry Smith .  name - character string describing shell preconditioner (you should not free this)
7394b9ad928SBarry Smith 
7404b9ad928SBarry Smith    Level: developer
7414b9ad928SBarry Smith 
7424b9ad928SBarry Smith .keywords: PC, shell, get, name, user-provided
7434b9ad928SBarry Smith 
7444b9ad928SBarry Smith .seealso: PCShellSetName()
7454b9ad928SBarry Smith @*/
746ccaf0856SBarry Smith PetscErrorCode  PCShellGetName(PC pc,const char *name[])
7474b9ad928SBarry Smith {
7484ac538c5SBarry Smith   PetscErrorCode ierr;
7494b9ad928SBarry Smith 
7504b9ad928SBarry Smith   PetscFunctionBegin;
7510700a824SBarry Smith   PetscValidHeaderSpecific(pc,PC_CLASSID,1);
7524482741eSBarry Smith   PetscValidPointer(name,2);
753ccaf0856SBarry Smith   ierr = PetscUseMethod(pc,"PCShellGetName_C",(PC,const char*[]),(pc,name));CHKERRQ(ierr);
7544b9ad928SBarry Smith   PetscFunctionReturn(0);
7554b9ad928SBarry Smith }
7564b9ad928SBarry Smith 
7574b9ad928SBarry Smith #undef __FUNCT__
7584b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApplyRichardson"
7594b9ad928SBarry Smith /*@C
7604b9ad928SBarry Smith    PCShellSetApplyRichardson - Sets routine to use as preconditioner
7614b9ad928SBarry Smith    in Richardson iteration.
7624b9ad928SBarry Smith 
7633f9fe445SBarry Smith    Logically Collective on PC
7644b9ad928SBarry Smith 
7654b9ad928SBarry Smith    Input Parameters:
7664b9ad928SBarry Smith +  pc - the preconditioner context
767be29d3c6SBarry Smith -  apply - the application-provided preconditioning routine
7684b9ad928SBarry Smith 
7694b9ad928SBarry Smith    Calling sequence of apply:
7704b9ad928SBarry Smith .vb
7716891c3e4SJed Brown    PetscErrorCode apply (PC pc,Vec b,Vec x,Vec r,PetscReal rtol,PetscReal abstol,PetscReal dtol,PetscInt maxits)
7724b9ad928SBarry Smith .ve
7734b9ad928SBarry Smith 
7746891c3e4SJed Brown +  pc - the preconditioner, get the application context with PCShellGetContext()
7754b9ad928SBarry Smith .  b - right-hand-side
7764b9ad928SBarry Smith .  x - current iterate
7774b9ad928SBarry Smith .  r - work space
7784b9ad928SBarry Smith .  rtol - relative tolerance of residual norm to stop at
77970441072SBarry Smith .  abstol - absolute tolerance of residual norm to stop at
7804b9ad928SBarry Smith .  dtol - if residual norm increases by this factor than return
7814b9ad928SBarry Smith -  maxits - number of iterations to run
7824b9ad928SBarry Smith 
7834aa34b0aSBarry Smith    Notes: the function MUST return an error code of 0 on success and nonzero on failure.
7844aa34b0aSBarry Smith 
7854b9ad928SBarry Smith    Level: developer
7864b9ad928SBarry Smith 
7874b9ad928SBarry Smith .keywords: PC, shell, set, apply, Richardson, user-provided
7884b9ad928SBarry Smith 
789be29d3c6SBarry Smith .seealso: PCShellSetApply(), PCShellSetContext()
7904b9ad928SBarry Smith @*/
7917087cfbeSBarry Smith PetscErrorCode  PCShellSetApplyRichardson(PC pc,PetscErrorCode (*apply)(PC,Vec,Vec,Vec,PetscReal,PetscReal,PetscReal,PetscInt,PetscBool,PetscInt*,PCRichardsonConvergedReason*))
7924b9ad928SBarry Smith {
7934ac538c5SBarry Smith   PetscErrorCode ierr;
7944b9ad928SBarry Smith 
7954b9ad928SBarry Smith   PetscFunctionBegin;
7960700a824SBarry Smith   PetscValidHeaderSpecific(pc,PC_CLASSID,1);
7974ac538c5SBarry Smith   ierr = PetscTryMethod(pc,"PCShellSetApplyRichardson_C",(PC,PetscErrorCode (*)(PC,Vec,Vec,Vec,PetscReal,PetscReal,PetscReal,PetscInt,PetscBool,PetscInt*,PCRichardsonConvergedReason*)),(pc,apply));CHKERRQ(ierr);
7984b9ad928SBarry Smith   PetscFunctionReturn(0);
7994b9ad928SBarry Smith }
8004b9ad928SBarry Smith 
8014b9ad928SBarry Smith /*MC
8024b9ad928SBarry Smith    PCSHELL - Creates a new preconditioner class for use with your
8034b9ad928SBarry Smith               own private data storage format.
8044b9ad928SBarry Smith 
8054b9ad928SBarry Smith    Level: advanced
80690198e61SBarry Smith >
8074b9ad928SBarry Smith    Concepts: providing your own preconditioner
8084b9ad928SBarry Smith 
8094b9ad928SBarry Smith   Usage:
8106891c3e4SJed Brown $             extern PetscErrorCode apply(PC,Vec,Vec);
8116891c3e4SJed Brown $             extern PetscErrorCode applyba(PC,PCSide,Vec,Vec,Vec);
8126891c3e4SJed Brown $             extern PetscErrorCode applytranspose(PC,Vec,Vec);
8136891c3e4SJed Brown $             extern PetscErrorCode setup(PC);
8146891c3e4SJed Brown $             extern PetscErrorCode destroy(PC);
8156891c3e4SJed Brown $
8164b9ad928SBarry Smith $             PCCreate(comm,&pc);
8174b9ad928SBarry Smith $             PCSetType(pc,PCSHELL);
818be29d3c6SBarry Smith $             PCShellSetContext(pc,ctx)
8196891c3e4SJed Brown $             PCShellSetApply(pc,apply);
8206891c3e4SJed Brown $             PCShellSetApplyBA(pc,applyba);               (optional)
8216891c3e4SJed Brown $             PCShellSetApplyTranspose(pc,applytranspose); (optional)
8224b9ad928SBarry Smith $             PCShellSetSetUp(pc,setup);                   (optional)
823d01c8aa3SLisandro Dalcin $             PCShellSetDestroy(pc,destroy);               (optional)
8244b9ad928SBarry Smith 
8254b9ad928SBarry Smith .seealso:  PCCreate(), PCSetType(), PCType (for list of available types), PC,
826fd2d0fe1Svictor            MATSHELL, PCShellSetSetUp(), PCShellSetApply(), PCShellSetView(),
827fd2d0fe1Svictor            PCShellSetApplyTranspose(), PCShellSetName(), PCShellSetApplyRichardson(),
8282bb17772SBarry Smith            PCShellGetName(), PCShellSetContext(), PCShellGetContext(), PCShellSetApplyBA()
8294b9ad928SBarry Smith M*/
8304b9ad928SBarry Smith 
8314b9ad928SBarry Smith EXTERN_C_BEGIN
8324b9ad928SBarry Smith #undef __FUNCT__
8334b9ad928SBarry Smith #define __FUNCT__ "PCCreate_Shell"
8347087cfbeSBarry Smith PetscErrorCode  PCCreate_Shell(PC pc)
8354b9ad928SBarry Smith {
836dfbe8321SBarry Smith   PetscErrorCode ierr;
8374b9ad928SBarry Smith   PC_Shell       *shell;
8384b9ad928SBarry Smith 
8394b9ad928SBarry Smith   PetscFunctionBegin;
84038f2d2fdSLisandro Dalcin   ierr     = PetscNewLog(pc,PC_Shell,&shell);CHKERRQ(ierr);
8414b9ad928SBarry Smith   pc->data = (void*)shell;
8424b9ad928SBarry Smith 
843d01c8aa3SLisandro Dalcin   pc->ops->destroy         = PCDestroy_Shell;
8444b9ad928SBarry Smith   pc->ops->view            = PCView_Shell;
845d01c8aa3SLisandro Dalcin   pc->ops->apply           = PCApply_Shell;
846d01c8aa3SLisandro Dalcin   pc->ops->applytranspose  = 0;
8474b9ad928SBarry Smith   pc->ops->applyrichardson = 0;
848d01c8aa3SLisandro Dalcin   pc->ops->setup           = 0;
8499bbb2c88SBarry Smith   pc->ops->presolve        = 0;
8509bbb2c88SBarry Smith   pc->ops->postsolve       = 0;
8514b9ad928SBarry Smith 
8524b9ad928SBarry Smith   shell->apply          = 0;
8534b9ad928SBarry Smith   shell->applytranspose = 0;
8544b9ad928SBarry Smith   shell->name           = 0;
8554b9ad928SBarry Smith   shell->applyrich      = 0;
8567cdd61b2SBarry Smith   shell->presolve       = 0;
8577cdd61b2SBarry Smith   shell->postsolve      = 0;
8584b9ad928SBarry Smith   shell->ctx            = 0;
8594b9ad928SBarry Smith   shell->setup          = 0;
8604b9ad928SBarry Smith   shell->view           = 0;
86118be62a5SSatish Balay   shell->destroy        = 0;
8624b9ad928SBarry Smith 
86318be62a5SSatish Balay   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetDestroy_C","PCShellSetDestroy_Shell",
86418be62a5SSatish Balay                                            PCShellSetDestroy_Shell);CHKERRQ(ierr);
8654b9ad928SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetSetUp_C","PCShellSetSetUp_Shell",
8664b9ad928SBarry Smith                                            PCShellSetSetUp_Shell);CHKERRQ(ierr);
8674b9ad928SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetApply_C","PCShellSetApply_Shell",
8684b9ad928SBarry Smith                                            PCShellSetApply_Shell);CHKERRQ(ierr);
8692bb17772SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetApplyBA_C","PCShellSetApplyBA_Shell",
8702bb17772SBarry Smith                                            PCShellSetApplyBA_Shell);CHKERRQ(ierr);
8717cdd61b2SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetPreSolve_C","PCShellSetPreSolve_Shell",
8727cdd61b2SBarry Smith                                            PCShellSetPreSolve_Shell);CHKERRQ(ierr);
8737cdd61b2SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetPostSolve_C","PCShellSetPostSolve_Shell",
8747cdd61b2SBarry Smith                                            PCShellSetPostSolve_Shell);CHKERRQ(ierr);
8754b9ad928SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetView_C","PCShellSetView_Shell",
8764b9ad928SBarry Smith                                            PCShellSetView_Shell);CHKERRQ(ierr);
877be29d3c6SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetApplyTranspose_C","PCShellSetApplyTranspose_Shell",
8784b9ad928SBarry Smith                                            PCShellSetApplyTranspose_Shell);CHKERRQ(ierr);
8794b9ad928SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetName_C","PCShellSetName_Shell",
8804b9ad928SBarry Smith                                            PCShellSetName_Shell);CHKERRQ(ierr);
8814b9ad928SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellGetName_C","PCShellGetName_Shell",
8824b9ad928SBarry Smith                                            PCShellGetName_Shell);CHKERRQ(ierr);
883be29d3c6SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetApplyRichardson_C","PCShellSetApplyRichardson_Shell",
8844b9ad928SBarry Smith                                            PCShellSetApplyRichardson_Shell);CHKERRQ(ierr);
8854b9ad928SBarry Smith   PetscFunctionReturn(0);
8864b9ad928SBarry Smith }
8874b9ad928SBarry Smith EXTERN_C_END
8884b9ad928SBarry Smith 
8894b9ad928SBarry Smith 
8904b9ad928SBarry Smith 
8914b9ad928SBarry Smith 
8924b9ad928SBarry Smith 
8934b9ad928SBarry Smith 
894