xref: /petsc/src/ksp/pc/impls/shell/shellpc.c (revision b45d2f2cb7e031d9c0de5873eca80614ca7b863b)
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*b45d2f2cSJed Brown #include <petsc-private/pcimpl.h>        /*I "petscpc.h" I*/
8*b45d2f2cSJed 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 */
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:
34c5ae4b9aSBarry Smith .   pc - should have been created with PCSetType(pc,shell)
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 
46c5ae4b9aSBarry Smith .seealso: 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 
79c5ae4b9aSBarry Smith .seealso: PCShellGetContext(), PCSHELL
80be29d3c6SBarry Smith @*/
817087cfbeSBarry Smith PetscErrorCode  PCShellSetContext(PC pc,void *ctx)
82be29d3c6SBarry Smith {
83c5ae4b9aSBarry Smith   PC_Shell      *shell = (PC_Shell*)pc->data;
84be29d3c6SBarry Smith   PetscErrorCode ierr;
85ace3abfcSBarry Smith   PetscBool      flg;
86be29d3c6SBarry Smith 
87be29d3c6SBarry Smith   PetscFunctionBegin;
880700a824SBarry Smith   PetscValidHeaderSpecific(pc,PC_CLASSID,1);
89be29d3c6SBarry Smith   ierr = PetscTypeCompare((PetscObject)pc,PCSHELL,&flg);CHKERRQ(ierr);
90be29d3c6SBarry Smith   if (flg) {
91be29d3c6SBarry Smith     shell->ctx = ctx;
92be29d3c6SBarry Smith   }
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);
19618be62a5SSatish Balay   if (shell->destroy) {
197eb6b5d47SBarry Smith     PetscStackCall("PCSHELL user function destroy()",ierr  = (*shell->destroy)(pc);CHKERRQ(ierr));
19818be62a5SSatish Balay   }
199c31cb41cSBarry Smith   ierr = PetscFree(pc->data);CHKERRQ(ierr);
2004b9ad928SBarry Smith   PetscFunctionReturn(0);
2014b9ad928SBarry Smith }
2024b9ad928SBarry Smith 
2034b9ad928SBarry Smith #undef __FUNCT__
2044b9ad928SBarry Smith #define __FUNCT__ "PCView_Shell"
2056849ba73SBarry Smith static PetscErrorCode PCView_Shell(PC pc,PetscViewer viewer)
2064b9ad928SBarry Smith {
2074b9ad928SBarry Smith   PC_Shell       *shell = (PC_Shell*)pc->data;
208dfbe8321SBarry Smith   PetscErrorCode ierr;
209ace3abfcSBarry Smith   PetscBool      iascii;
2104b9ad928SBarry Smith 
2114b9ad928SBarry Smith   PetscFunctionBegin;
2122692d6eeSBarry Smith   ierr = PetscTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
21332077d6dSBarry Smith   if (iascii) {
2144b9ad928SBarry Smith     if (shell->name) {ierr = PetscViewerASCIIPrintf(viewer,"  Shell: %s\n",shell->name);CHKERRQ(ierr);}
2154b9ad928SBarry Smith     else             {ierr = PetscViewerASCIIPrintf(viewer,"  Shell: no name\n");CHKERRQ(ierr);}
2164b9ad928SBarry Smith   }
2174b9ad928SBarry Smith   if (shell->view) {
2184b9ad928SBarry Smith     ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
2196891c3e4SJed Brown     ierr  = (*shell->view)(pc,viewer);CHKERRQ(ierr);
2204b9ad928SBarry Smith     ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
2214b9ad928SBarry Smith   }
2224b9ad928SBarry Smith   PetscFunctionReturn(0);
2234b9ad928SBarry Smith }
2244b9ad928SBarry Smith 
2254b9ad928SBarry Smith /* ------------------------------------------------------------------------------*/
2264b9ad928SBarry Smith EXTERN_C_BEGIN
2274b9ad928SBarry Smith #undef __FUNCT__
22818be62a5SSatish Balay #define __FUNCT__ "PCShellSetDestroy_Shell"
2297087cfbeSBarry Smith PetscErrorCode  PCShellSetDestroy_Shell(PC pc, PetscErrorCode (*destroy)(PC))
23018be62a5SSatish Balay {
231c5ae4b9aSBarry Smith   PC_Shell *shell= (PC_Shell*)pc->data;
23218be62a5SSatish Balay 
23318be62a5SSatish Balay   PetscFunctionBegin;
23418be62a5SSatish Balay   shell->destroy = destroy;
23518be62a5SSatish Balay   PetscFunctionReturn(0);
23618be62a5SSatish Balay }
23718be62a5SSatish Balay EXTERN_C_END
23818be62a5SSatish Balay 
23918be62a5SSatish Balay EXTERN_C_BEGIN
24018be62a5SSatish Balay #undef __FUNCT__
2414b9ad928SBarry Smith #define __FUNCT__ "PCShellSetSetUp_Shell"
2427087cfbeSBarry Smith PetscErrorCode  PCShellSetSetUp_Shell(PC pc, PetscErrorCode (*setup)(PC))
2434b9ad928SBarry Smith {
244c5ae4b9aSBarry Smith   PC_Shell *shell = (PC_Shell*)pc->data;;
2454b9ad928SBarry Smith 
2464b9ad928SBarry Smith   PetscFunctionBegin;
2474b9ad928SBarry Smith   shell->setup = setup;
248d01c8aa3SLisandro Dalcin   if (setup) pc->ops->setup = PCSetUp_Shell;
249d01c8aa3SLisandro Dalcin   else       pc->ops->setup = 0;
2504b9ad928SBarry Smith   PetscFunctionReturn(0);
2514b9ad928SBarry Smith }
2524b9ad928SBarry Smith EXTERN_C_END
2534b9ad928SBarry Smith 
2544b9ad928SBarry Smith EXTERN_C_BEGIN
2554b9ad928SBarry Smith #undef __FUNCT__
2564b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApply_Shell"
2577087cfbeSBarry Smith PetscErrorCode  PCShellSetApply_Shell(PC pc,PetscErrorCode (*apply)(PC,Vec,Vec))
2584b9ad928SBarry Smith {
259c5ae4b9aSBarry Smith   PC_Shell *shell = (PC_Shell*)pc->data;
2604b9ad928SBarry Smith 
2614b9ad928SBarry Smith   PetscFunctionBegin;
2624b9ad928SBarry Smith   shell->apply = apply;
2634b9ad928SBarry Smith   PetscFunctionReturn(0);
2644b9ad928SBarry Smith }
2654b9ad928SBarry Smith EXTERN_C_END
2664b9ad928SBarry Smith 
2674b9ad928SBarry Smith EXTERN_C_BEGIN
2684b9ad928SBarry Smith #undef __FUNCT__
2692bb17772SBarry Smith #define __FUNCT__ "PCShellSetApplyBA_Shell"
2707087cfbeSBarry Smith PetscErrorCode  PCShellSetApplyBA_Shell(PC pc,PetscErrorCode (*applyBA)(PC,PCSide,Vec,Vec,Vec))
2712bb17772SBarry Smith {
272c5ae4b9aSBarry Smith   PC_Shell *shell = (PC_Shell*)pc->data;
2732bb17772SBarry Smith 
2742bb17772SBarry Smith   PetscFunctionBegin;
275d01c8aa3SLisandro Dalcin   shell->applyBA = applyBA;
276d01c8aa3SLisandro Dalcin   if (applyBA) pc->ops->applyBA  = PCApplyBA_Shell;
277aef0136fSBarry Smith   else         pc->ops->applyBA  = 0;
2782bb17772SBarry Smith   PetscFunctionReturn(0);
2792bb17772SBarry Smith }
2802bb17772SBarry Smith EXTERN_C_END
2812bb17772SBarry Smith 
2822bb17772SBarry Smith EXTERN_C_BEGIN
2832bb17772SBarry Smith #undef __FUNCT__
2847cdd61b2SBarry Smith #define __FUNCT__ "PCShellSetPreSolve_Shell"
2857087cfbeSBarry Smith PetscErrorCode  PCShellSetPreSolve_Shell(PC pc,PetscErrorCode (*presolve)(PC,KSP,Vec,Vec))
2867cdd61b2SBarry Smith {
287c5ae4b9aSBarry Smith   PC_Shell *shell = (PC_Shell*)pc->data;
2887cdd61b2SBarry Smith 
2897cdd61b2SBarry Smith   PetscFunctionBegin;
2907cdd61b2SBarry Smith   shell->presolve = presolve;
291d01c8aa3SLisandro Dalcin   if (presolve) pc->ops->presolve = PCPreSolve_Shell;
292d01c8aa3SLisandro Dalcin   else          pc->ops->presolve = 0;
2937cdd61b2SBarry Smith   PetscFunctionReturn(0);
2947cdd61b2SBarry Smith }
2957cdd61b2SBarry Smith EXTERN_C_END
2967cdd61b2SBarry Smith 
2977cdd61b2SBarry Smith EXTERN_C_BEGIN
2987cdd61b2SBarry Smith #undef __FUNCT__
2997cdd61b2SBarry Smith #define __FUNCT__ "PCShellSetPostSolve_Shell"
3007087cfbeSBarry Smith PetscErrorCode  PCShellSetPostSolve_Shell(PC pc,PetscErrorCode (*postsolve)(PC,KSP,Vec,Vec))
3017cdd61b2SBarry Smith {
302c5ae4b9aSBarry Smith   PC_Shell *shell = (PC_Shell*)pc->data;
3037cdd61b2SBarry Smith 
3047cdd61b2SBarry Smith   PetscFunctionBegin;
3057cdd61b2SBarry Smith   shell->postsolve = postsolve;
306d01c8aa3SLisandro Dalcin   if (postsolve) pc->ops->postsolve = PCPostSolve_Shell;
307d01c8aa3SLisandro Dalcin   else           pc->ops->postsolve = 0;
3087cdd61b2SBarry Smith   PetscFunctionReturn(0);
3097cdd61b2SBarry Smith }
3107cdd61b2SBarry Smith EXTERN_C_END
3117cdd61b2SBarry Smith 
3127cdd61b2SBarry Smith EXTERN_C_BEGIN
3137cdd61b2SBarry Smith #undef __FUNCT__
3144b9ad928SBarry Smith #define __FUNCT__ "PCShellSetView_Shell"
3157087cfbeSBarry Smith PetscErrorCode  PCShellSetView_Shell(PC pc,PetscErrorCode (*view)(PC,PetscViewer))
3164b9ad928SBarry Smith {
317c5ae4b9aSBarry Smith   PC_Shell *shell = (PC_Shell*)pc->data;
3184b9ad928SBarry Smith 
3194b9ad928SBarry Smith   PetscFunctionBegin;
3204b9ad928SBarry Smith   shell->view = view;
3214b9ad928SBarry Smith   PetscFunctionReturn(0);
3224b9ad928SBarry Smith }
3234b9ad928SBarry Smith EXTERN_C_END
3244b9ad928SBarry Smith 
3254b9ad928SBarry Smith EXTERN_C_BEGIN
3264b9ad928SBarry Smith #undef __FUNCT__
3274b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApplyTranspose_Shell"
3287087cfbeSBarry Smith PetscErrorCode  PCShellSetApplyTranspose_Shell(PC pc,PetscErrorCode (*applytranspose)(PC,Vec,Vec))
3294b9ad928SBarry Smith {
330c5ae4b9aSBarry Smith   PC_Shell *shell = (PC_Shell*)pc->data;
3314b9ad928SBarry Smith 
3324b9ad928SBarry Smith   PetscFunctionBegin;
3334b9ad928SBarry Smith   shell->applytranspose = applytranspose;
334d01c8aa3SLisandro Dalcin   if (applytranspose) pc->ops->applytranspose = PCApplyTranspose_Shell;
335d01c8aa3SLisandro Dalcin   else                pc->ops->applytranspose = 0;
336d01c8aa3SLisandro Dalcin   PetscFunctionReturn(0);
337d01c8aa3SLisandro Dalcin }
338d01c8aa3SLisandro Dalcin EXTERN_C_END
339d01c8aa3SLisandro Dalcin 
340d01c8aa3SLisandro Dalcin EXTERN_C_BEGIN
341d01c8aa3SLisandro Dalcin #undef __FUNCT__
342d01c8aa3SLisandro Dalcin #define __FUNCT__ "PCShellSetApplyRichardson_Shell"
3437087cfbeSBarry Smith PetscErrorCode  PCShellSetApplyRichardson_Shell(PC pc,PetscErrorCode (*applyrich)(PC,Vec,Vec,Vec,PetscReal,PetscReal,PetscReal,PetscInt,PetscBool ,PetscInt*,PCRichardsonConvergedReason*))
344d01c8aa3SLisandro Dalcin {
345c5ae4b9aSBarry Smith   PC_Shell *shell = (PC_Shell*)pc->data;
346d01c8aa3SLisandro Dalcin 
347d01c8aa3SLisandro Dalcin   PetscFunctionBegin;
348d01c8aa3SLisandro Dalcin   shell->applyrich = applyrich;
349d01c8aa3SLisandro Dalcin   if (applyrich) pc->ops->applyrichardson  = PCApplyRichardson_Shell;
350d01c8aa3SLisandro Dalcin   else           pc->ops->applyrichardson  = 0;
3514b9ad928SBarry Smith   PetscFunctionReturn(0);
3524b9ad928SBarry Smith }
3534b9ad928SBarry Smith EXTERN_C_END
3544b9ad928SBarry Smith 
3554b9ad928SBarry Smith EXTERN_C_BEGIN
3564b9ad928SBarry Smith #undef __FUNCT__
3574b9ad928SBarry Smith #define __FUNCT__ "PCShellSetName_Shell"
3587087cfbeSBarry Smith PetscErrorCode  PCShellSetName_Shell(PC pc,const char name[])
3594b9ad928SBarry Smith {
360c5ae4b9aSBarry Smith   PC_Shell       *shell = (PC_Shell*)pc->data;
361dfbe8321SBarry Smith   PetscErrorCode ierr;
3624b9ad928SBarry Smith 
3634b9ad928SBarry Smith   PetscFunctionBegin;
364503cfb0cSBarry Smith   ierr = PetscFree(shell->name);CHKERRQ(ierr);
3654b9ad928SBarry Smith   ierr = PetscStrallocpy(name,&shell->name);CHKERRQ(ierr);
3664b9ad928SBarry Smith   PetscFunctionReturn(0);
3674b9ad928SBarry Smith }
3684b9ad928SBarry Smith EXTERN_C_END
3694b9ad928SBarry Smith 
3704b9ad928SBarry Smith EXTERN_C_BEGIN
3714b9ad928SBarry Smith #undef __FUNCT__
3724b9ad928SBarry Smith #define __FUNCT__ "PCShellGetName_Shell"
373ccaf0856SBarry Smith PetscErrorCode  PCShellGetName_Shell(PC pc,const char *name[])
3744b9ad928SBarry Smith {
375c5ae4b9aSBarry Smith   PC_Shell *shell = (PC_Shell*)pc->data;
3764b9ad928SBarry Smith 
3774b9ad928SBarry Smith   PetscFunctionBegin;
3784b9ad928SBarry Smith   *name  = shell->name;
3794b9ad928SBarry Smith   PetscFunctionReturn(0);
3804b9ad928SBarry Smith }
3814b9ad928SBarry Smith EXTERN_C_END
3824b9ad928SBarry Smith 
3834b9ad928SBarry Smith /* -------------------------------------------------------------------------------*/
3844b9ad928SBarry Smith 
3854b9ad928SBarry Smith #undef __FUNCT__
38618be62a5SSatish Balay #define __FUNCT__ "PCShellSetDestroy"
38718be62a5SSatish Balay /*@C
38818be62a5SSatish Balay    PCShellSetDestroy - Sets routine to use to destroy the user-provided
38918be62a5SSatish Balay    application context.
39018be62a5SSatish Balay 
3913f9fe445SBarry Smith    Logically Collective on PC
39218be62a5SSatish Balay 
39318be62a5SSatish Balay    Input Parameters:
39418be62a5SSatish Balay +  pc - the preconditioner context
39518be62a5SSatish Balay .  destroy - the application-provided destroy routine
39618be62a5SSatish Balay 
39718be62a5SSatish Balay    Calling sequence of destroy:
39818be62a5SSatish Balay .vb
3996891c3e4SJed Brown    PetscErrorCode destroy (PC)
40018be62a5SSatish Balay .ve
40118be62a5SSatish Balay 
40218be62a5SSatish Balay .  ptr - the application context
40318be62a5SSatish Balay 
4044aa34b0aSBarry Smith    Notes: the function MUST return an error code of 0 on success and nonzero on failure.
4054aa34b0aSBarry Smith 
40618be62a5SSatish Balay    Level: developer
40718be62a5SSatish Balay 
40818be62a5SSatish Balay .keywords: PC, shell, set, destroy, user-provided
40918be62a5SSatish Balay 
41018be62a5SSatish Balay .seealso: PCShellSetApply(), PCShellSetContext()
41118be62a5SSatish Balay @*/
4127087cfbeSBarry Smith PetscErrorCode  PCShellSetDestroy(PC pc,PetscErrorCode (*destroy)(PC))
41318be62a5SSatish Balay {
4144ac538c5SBarry Smith   PetscErrorCode ierr;
41518be62a5SSatish Balay 
41618be62a5SSatish Balay   PetscFunctionBegin;
4170700a824SBarry Smith   PetscValidHeaderSpecific(pc,PC_CLASSID,1);
4184ac538c5SBarry Smith   ierr = PetscTryMethod(pc,"PCShellSetDestroy_C",(PC,PetscErrorCode (*)(PC)),(pc,destroy));CHKERRQ(ierr);
41918be62a5SSatish Balay   PetscFunctionReturn(0);
42018be62a5SSatish Balay }
42118be62a5SSatish Balay 
42218be62a5SSatish Balay 
42318be62a5SSatish Balay #undef __FUNCT__
4244b9ad928SBarry Smith #define __FUNCT__ "PCShellSetSetUp"
4254b9ad928SBarry Smith /*@C
4264b9ad928SBarry Smith    PCShellSetSetUp - Sets routine to use to "setup" the preconditioner whenever the
4274b9ad928SBarry Smith    matrix operator is changed.
4284b9ad928SBarry Smith 
4293f9fe445SBarry Smith    Logically Collective on PC
4304b9ad928SBarry Smith 
4314b9ad928SBarry Smith    Input Parameters:
4324b9ad928SBarry Smith +  pc - the preconditioner context
4334b9ad928SBarry Smith .  setup - the application-provided setup routine
4344b9ad928SBarry Smith 
4354b9ad928SBarry Smith    Calling sequence of setup:
4364b9ad928SBarry Smith .vb
4376891c3e4SJed Brown    PetscErrorCode setup (PC pc)
4384b9ad928SBarry Smith .ve
4394b9ad928SBarry Smith 
4406891c3e4SJed Brown .  pc - the preconditioner, get the application context with PCShellGetContext()
4414b9ad928SBarry Smith 
4424aa34b0aSBarry Smith    Notes: the function MUST return an error code of 0 on success and nonzero on failure.
4434aa34b0aSBarry Smith 
4444b9ad928SBarry Smith    Level: developer
4454b9ad928SBarry Smith 
4464b9ad928SBarry Smith .keywords: PC, shell, set, setup, user-provided
4474b9ad928SBarry Smith 
448be29d3c6SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetApply(), PCShellSetContext()
4494b9ad928SBarry Smith @*/
4507087cfbeSBarry Smith PetscErrorCode  PCShellSetSetUp(PC pc,PetscErrorCode (*setup)(PC))
4514b9ad928SBarry Smith {
4524ac538c5SBarry Smith   PetscErrorCode ierr;
4534b9ad928SBarry Smith 
4544b9ad928SBarry Smith   PetscFunctionBegin;
4550700a824SBarry Smith   PetscValidHeaderSpecific(pc,PC_CLASSID,1);
4564ac538c5SBarry Smith   ierr = PetscTryMethod(pc,"PCShellSetSetUp_C",(PC,PetscErrorCode (*)(PC)),(pc,setup));CHKERRQ(ierr);
4574b9ad928SBarry Smith   PetscFunctionReturn(0);
4584b9ad928SBarry Smith }
4594b9ad928SBarry Smith 
4604b9ad928SBarry Smith 
4614b9ad928SBarry Smith #undef __FUNCT__
4624b9ad928SBarry Smith #define __FUNCT__ "PCShellSetView"
4634b9ad928SBarry Smith /*@C
4644b9ad928SBarry Smith    PCShellSetView - Sets routine to use as viewer of shell preconditioner
4654b9ad928SBarry Smith 
4663f9fe445SBarry Smith    Logically Collective on PC
4674b9ad928SBarry Smith 
4684b9ad928SBarry Smith    Input Parameters:
4694b9ad928SBarry Smith +  pc - the preconditioner context
4704b9ad928SBarry Smith -  view - the application-provided view routine
4714b9ad928SBarry Smith 
4724b9ad928SBarry Smith    Calling sequence of apply:
4734b9ad928SBarry Smith .vb
4746891c3e4SJed Brown    PetscErrorCode view(PC pc,PetscViewer v)
4754b9ad928SBarry Smith .ve
4764b9ad928SBarry Smith 
4776891c3e4SJed Brown +  pc - the preconditioner, get the application context with PCShellGetContext()
4784b9ad928SBarry Smith -  v   - viewer
4794b9ad928SBarry Smith 
4804aa34b0aSBarry Smith    Notes: the function MUST return an error code of 0 on success and nonzero on failure.
4814aa34b0aSBarry Smith 
4824b9ad928SBarry Smith    Level: developer
4834b9ad928SBarry Smith 
4844b9ad928SBarry Smith .keywords: PC, shell, set, apply, user-provided
4854b9ad928SBarry Smith 
4864b9ad928SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose()
4874b9ad928SBarry Smith @*/
4887087cfbeSBarry Smith PetscErrorCode  PCShellSetView(PC pc,PetscErrorCode (*view)(PC,PetscViewer))
4894b9ad928SBarry Smith {
4904ac538c5SBarry Smith   PetscErrorCode ierr;
4914b9ad928SBarry Smith 
4924b9ad928SBarry Smith   PetscFunctionBegin;
4930700a824SBarry Smith   PetscValidHeaderSpecific(pc,PC_CLASSID,1);
4944ac538c5SBarry Smith   ierr = PetscTryMethod(pc,"PCShellSetView_C",(PC,PetscErrorCode (*)(PC,PetscViewer)),(pc,view));CHKERRQ(ierr);
4954b9ad928SBarry Smith   PetscFunctionReturn(0);
4964b9ad928SBarry Smith }
4974b9ad928SBarry Smith 
4984b9ad928SBarry Smith #undef __FUNCT__
4994b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApply"
5004b9ad928SBarry Smith /*@C
5014b9ad928SBarry Smith    PCShellSetApply - Sets routine to use as preconditioner.
5024b9ad928SBarry Smith 
5033f9fe445SBarry Smith    Logically Collective on PC
5044b9ad928SBarry Smith 
5054b9ad928SBarry Smith    Input Parameters:
5064b9ad928SBarry Smith +  pc - the preconditioner context
507be29d3c6SBarry Smith -  apply - the application-provided preconditioning routine
5084b9ad928SBarry Smith 
5094b9ad928SBarry Smith    Calling sequence of apply:
5104b9ad928SBarry Smith .vb
5116891c3e4SJed Brown    PetscErrorCode apply (PC pc,Vec xin,Vec xout)
5124b9ad928SBarry Smith .ve
5134b9ad928SBarry Smith 
5146891c3e4SJed Brown +  pc - the preconditioner, get the application context with PCShellGetContext()
5154b9ad928SBarry Smith .  xin - input vector
5164b9ad928SBarry Smith -  xout - output vector
5174b9ad928SBarry Smith 
5184aa34b0aSBarry Smith    Notes: the function MUST return an error code of 0 on success and nonzero on failure.
5194aa34b0aSBarry Smith 
520292fb18eSBarry Smith    Developer Notes: There should also be a PCShellSetApplySymmetricRight() and PCShellSetApplySymmetricLeft().
521292fb18eSBarry Smith 
5224b9ad928SBarry Smith    Level: developer
5234b9ad928SBarry Smith 
5244b9ad928SBarry Smith .keywords: PC, shell, set, apply, user-provided
5254b9ad928SBarry Smith 
5262bb17772SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose(), PCShellSetContext(), PCShellSetApplyBA()
5274b9ad928SBarry Smith @*/
5287087cfbeSBarry Smith PetscErrorCode  PCShellSetApply(PC pc,PetscErrorCode (*apply)(PC,Vec,Vec))
5294b9ad928SBarry Smith {
5304ac538c5SBarry Smith   PetscErrorCode ierr;
5314b9ad928SBarry Smith 
5324b9ad928SBarry Smith   PetscFunctionBegin;
5330700a824SBarry Smith   PetscValidHeaderSpecific(pc,PC_CLASSID,1);
5344ac538c5SBarry Smith   ierr = PetscTryMethod(pc,"PCShellSetApply_C",(PC,PetscErrorCode (*)(PC,Vec,Vec)),(pc,apply));CHKERRQ(ierr);
5354b9ad928SBarry Smith   PetscFunctionReturn(0);
5364b9ad928SBarry Smith }
5374b9ad928SBarry Smith 
5384b9ad928SBarry Smith #undef __FUNCT__
5392bb17772SBarry Smith #define __FUNCT__ "PCShellSetApplyBA"
5402bb17772SBarry Smith /*@C
5412bb17772SBarry Smith    PCShellSetApplyBA - Sets routine to use as preconditioner times operator.
5422bb17772SBarry Smith 
5433f9fe445SBarry Smith    Logically Collective on PC
5442bb17772SBarry Smith 
5452bb17772SBarry Smith    Input Parameters:
5462bb17772SBarry Smith +  pc - the preconditioner context
5472bb17772SBarry Smith -  applyBA - the application-provided BA routine
5482bb17772SBarry Smith 
5492bb17772SBarry Smith    Calling sequence of apply:
5502bb17772SBarry Smith .vb
5516891c3e4SJed Brown    PetscErrorCode applyBA (PC pc,Vec xin,Vec xout)
5522bb17772SBarry Smith .ve
5532bb17772SBarry Smith 
5546891c3e4SJed Brown +  pc - the preconditioner, get the application context with PCShellGetContext()
5552bb17772SBarry Smith .  xin - input vector
5562bb17772SBarry Smith -  xout - output vector
5572bb17772SBarry Smith 
5584aa34b0aSBarry Smith    Notes: the function MUST return an error code of 0 on success and nonzero on failure.
5594aa34b0aSBarry Smith 
5602bb17772SBarry Smith    Level: developer
5612bb17772SBarry Smith 
5622bb17772SBarry Smith .keywords: PC, shell, set, apply, user-provided
5632bb17772SBarry Smith 
5642bb17772SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose(), PCShellSetContext(), PCShellSetApply()
5652bb17772SBarry Smith @*/
5667087cfbeSBarry Smith PetscErrorCode  PCShellSetApplyBA(PC pc,PetscErrorCode (*applyBA)(PC,PCSide,Vec,Vec,Vec))
5672bb17772SBarry Smith {
5684ac538c5SBarry Smith   PetscErrorCode ierr;
5692bb17772SBarry Smith 
5702bb17772SBarry Smith   PetscFunctionBegin;
5710700a824SBarry Smith   PetscValidHeaderSpecific(pc,PC_CLASSID,1);
5724ac538c5SBarry Smith   ierr = PetscTryMethod(pc,"PCShellSetApplyBA_C",(PC,PetscErrorCode (*)(PC,PCSide,Vec,Vec,Vec)),(pc,applyBA));CHKERRQ(ierr);
5732bb17772SBarry Smith   PetscFunctionReturn(0);
5742bb17772SBarry Smith }
5752bb17772SBarry Smith 
5762bb17772SBarry Smith #undef __FUNCT__
5774b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApplyTranspose"
5784b9ad928SBarry Smith /*@C
5794b9ad928SBarry Smith    PCShellSetApplyTranspose - Sets routine to use as preconditioner transpose.
5804b9ad928SBarry Smith 
5813f9fe445SBarry Smith    Logically Collective on PC
5824b9ad928SBarry Smith 
5834b9ad928SBarry Smith    Input Parameters:
5844b9ad928SBarry Smith +  pc - the preconditioner context
5854b9ad928SBarry Smith -  apply - the application-provided preconditioning transpose routine
5864b9ad928SBarry Smith 
5874b9ad928SBarry Smith    Calling sequence of apply:
5884b9ad928SBarry Smith .vb
5896891c3e4SJed Brown    PetscErrorCode applytranspose (PC pc,Vec xin,Vec xout)
5904b9ad928SBarry Smith .ve
5914b9ad928SBarry Smith 
5926891c3e4SJed Brown +  pc - the preconditioner, get the application context with PCShellGetContext()
5934b9ad928SBarry Smith .  xin - input vector
5944b9ad928SBarry Smith -  xout - output vector
5954b9ad928SBarry Smith 
5964aa34b0aSBarry Smith    Notes: the function MUST return an error code of 0 on success and nonzero on failure.
5974aa34b0aSBarry Smith 
5984b9ad928SBarry Smith    Level: developer
5994b9ad928SBarry Smith 
6004b9ad928SBarry Smith    Notes:
6014b9ad928SBarry Smith    Uses the same context variable as PCShellSetApply().
6024b9ad928SBarry Smith 
6034b9ad928SBarry Smith .keywords: PC, shell, set, apply, user-provided
6044b9ad928SBarry Smith 
6052bb17772SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApply(), PCSetContext(), PCShellSetApplyBA()
6064b9ad928SBarry Smith @*/
6077087cfbeSBarry Smith PetscErrorCode  PCShellSetApplyTranspose(PC pc,PetscErrorCode (*applytranspose)(PC,Vec,Vec))
6084b9ad928SBarry Smith {
6094ac538c5SBarry Smith   PetscErrorCode ierr;
6104b9ad928SBarry Smith 
6114b9ad928SBarry Smith   PetscFunctionBegin;
6120700a824SBarry Smith   PetscValidHeaderSpecific(pc,PC_CLASSID,1);
6134ac538c5SBarry Smith   ierr = PetscTryMethod(pc,"PCShellSetApplyTranspose_C",(PC,PetscErrorCode (*)(PC,Vec,Vec)),(pc,applytranspose));CHKERRQ(ierr);
6144b9ad928SBarry Smith   PetscFunctionReturn(0);
6154b9ad928SBarry Smith }
6164b9ad928SBarry Smith 
6174b9ad928SBarry Smith #undef __FUNCT__
6187cdd61b2SBarry Smith #define __FUNCT__ "PCShellSetPreSolve"
6197cdd61b2SBarry Smith /*@C
6207cdd61b2SBarry Smith    PCShellSetPreSolve - Sets routine to apply to the operators/vectors before a KSPSolve() is
6217cdd61b2SBarry Smith       applied. This usually does something like scale the linear system in some application
6227cdd61b2SBarry Smith       specific way.
6237cdd61b2SBarry Smith 
6243f9fe445SBarry Smith    Logically Collective on PC
6257cdd61b2SBarry Smith 
6267cdd61b2SBarry Smith    Input Parameters:
6277cdd61b2SBarry Smith +  pc - the preconditioner context
6287cdd61b2SBarry Smith -  presolve - the application-provided presolve routine
6297cdd61b2SBarry Smith 
6307cdd61b2SBarry Smith    Calling sequence of presolve:
6317cdd61b2SBarry Smith .vb
6326891c3e4SJed Brown    PetscErrorCode presolve (PC,KSP ksp,Vec b,Vec x)
6337cdd61b2SBarry Smith .ve
6347cdd61b2SBarry Smith 
6356891c3e4SJed Brown +  pc - the preconditioner, get the application context with PCShellGetContext()
6367cdd61b2SBarry Smith .  xin - input vector
6377cdd61b2SBarry Smith -  xout - output vector
6387cdd61b2SBarry Smith 
6394aa34b0aSBarry Smith    Notes: the function MUST return an error code of 0 on success and nonzero on failure.
6404aa34b0aSBarry Smith 
6417cdd61b2SBarry Smith    Level: developer
6427cdd61b2SBarry Smith 
6437cdd61b2SBarry Smith .keywords: PC, shell, set, apply, user-provided
6447cdd61b2SBarry Smith 
645be29d3c6SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose(), PCShellSetPostSolve(), PCShellSetContext()
6467cdd61b2SBarry Smith @*/
6477087cfbeSBarry Smith PetscErrorCode  PCShellSetPreSolve(PC pc,PetscErrorCode (*presolve)(PC,KSP,Vec,Vec))
6487cdd61b2SBarry Smith {
6494ac538c5SBarry Smith   PetscErrorCode ierr;
6507cdd61b2SBarry Smith 
6517cdd61b2SBarry Smith   PetscFunctionBegin;
6520700a824SBarry Smith   PetscValidHeaderSpecific(pc,PC_CLASSID,1);
6534ac538c5SBarry Smith   ierr = PetscTryMethod(pc,"PCShellSetPreSolve_C",(PC,PetscErrorCode (*)(PC,KSP,Vec,Vec)),(pc,presolve));CHKERRQ(ierr);
6547cdd61b2SBarry Smith   PetscFunctionReturn(0);
6557cdd61b2SBarry Smith }
6567cdd61b2SBarry Smith 
6577cdd61b2SBarry Smith #undef __FUNCT__
6587cdd61b2SBarry Smith #define __FUNCT__ "PCShellSetPostSolve"
6597cdd61b2SBarry Smith /*@C
6607cdd61b2SBarry Smith    PCShellSetPostSolve - Sets routine to apply to the operators/vectors before a KSPSolve() is
6617cdd61b2SBarry Smith       applied. This usually does something like scale the linear system in some application
6627cdd61b2SBarry Smith       specific way.
6637cdd61b2SBarry Smith 
6643f9fe445SBarry Smith    Logically Collective on PC
6657cdd61b2SBarry Smith 
6667cdd61b2SBarry Smith    Input Parameters:
6677cdd61b2SBarry Smith +  pc - the preconditioner context
6687cdd61b2SBarry Smith -  postsolve - the application-provided presolve routine
6697cdd61b2SBarry Smith 
6707cdd61b2SBarry Smith    Calling sequence of postsolve:
6717cdd61b2SBarry Smith .vb
6726891c3e4SJed Brown    PetscErrorCode postsolve(PC,KSP ksp,Vec b,Vec x)
6737cdd61b2SBarry Smith .ve
6747cdd61b2SBarry Smith 
6756891c3e4SJed Brown +  pc - the preconditioner, get the application context with PCShellGetContext()
6767cdd61b2SBarry Smith .  xin - input vector
6777cdd61b2SBarry Smith -  xout - output vector
6787cdd61b2SBarry Smith 
6794aa34b0aSBarry Smith    Notes: the function MUST return an error code of 0 on success and nonzero on failure.
6804aa34b0aSBarry Smith 
6817cdd61b2SBarry Smith    Level: developer
6827cdd61b2SBarry Smith 
6837cdd61b2SBarry Smith .keywords: PC, shell, set, apply, user-provided
6847cdd61b2SBarry Smith 
685be29d3c6SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose(), PCShellSetPreSolve(), PCShellSetContext()
6867cdd61b2SBarry Smith @*/
6877087cfbeSBarry Smith PetscErrorCode  PCShellSetPostSolve(PC pc,PetscErrorCode (*postsolve)(PC,KSP,Vec,Vec))
6887cdd61b2SBarry Smith {
6894ac538c5SBarry Smith   PetscErrorCode ierr;
6907cdd61b2SBarry Smith 
6917cdd61b2SBarry Smith   PetscFunctionBegin;
6920700a824SBarry Smith   PetscValidHeaderSpecific(pc,PC_CLASSID,1);
6934ac538c5SBarry Smith   ierr = PetscTryMethod(pc,"PCShellSetPostSolve_C",(PC,PetscErrorCode (*)(PC,KSP,Vec,Vec)),(pc,postsolve));CHKERRQ(ierr);
6947cdd61b2SBarry Smith   PetscFunctionReturn(0);
6957cdd61b2SBarry Smith }
6967cdd61b2SBarry Smith 
6977cdd61b2SBarry Smith #undef __FUNCT__
6984b9ad928SBarry Smith #define __FUNCT__ "PCShellSetName"
6994b9ad928SBarry Smith /*@C
7004b9ad928SBarry Smith    PCShellSetName - Sets an optional name to associate with a shell
7014b9ad928SBarry Smith    preconditioner.
7024b9ad928SBarry Smith 
7034b9ad928SBarry Smith    Not Collective
7044b9ad928SBarry Smith 
7054b9ad928SBarry Smith    Input Parameters:
7064b9ad928SBarry Smith +  pc - the preconditioner context
7074b9ad928SBarry Smith -  name - character string describing shell preconditioner
7084b9ad928SBarry Smith 
7094b9ad928SBarry Smith    Level: developer
7104b9ad928SBarry Smith 
7114b9ad928SBarry Smith .keywords: PC, shell, set, name, user-provided
7124b9ad928SBarry Smith 
7134b9ad928SBarry Smith .seealso: PCShellGetName()
7144b9ad928SBarry Smith @*/
7157087cfbeSBarry Smith PetscErrorCode  PCShellSetName(PC pc,const char name[])
7164b9ad928SBarry Smith {
7174ac538c5SBarry Smith   PetscErrorCode ierr;
7184b9ad928SBarry Smith 
7194b9ad928SBarry Smith   PetscFunctionBegin;
7200700a824SBarry Smith   PetscValidHeaderSpecific(pc,PC_CLASSID,1);
7214ac538c5SBarry Smith   ierr = PetscTryMethod(pc,"PCShellSetName_C",(PC,const char []),(pc,name));CHKERRQ(ierr);
7224b9ad928SBarry Smith   PetscFunctionReturn(0);
7234b9ad928SBarry Smith }
7244b9ad928SBarry Smith 
7254b9ad928SBarry Smith #undef __FUNCT__
7264b9ad928SBarry Smith #define __FUNCT__ "PCShellGetName"
7274b9ad928SBarry Smith /*@C
7284b9ad928SBarry Smith    PCShellGetName - Gets an optional name that the user has set for a shell
7294b9ad928SBarry Smith    preconditioner.
7304b9ad928SBarry Smith 
7314b9ad928SBarry Smith    Not Collective
7324b9ad928SBarry Smith 
7334b9ad928SBarry Smith    Input Parameter:
7344b9ad928SBarry Smith .  pc - the preconditioner context
7354b9ad928SBarry Smith 
7364b9ad928SBarry Smith    Output Parameter:
7374b9ad928SBarry Smith .  name - character string describing shell preconditioner (you should not free this)
7384b9ad928SBarry Smith 
7394b9ad928SBarry Smith    Level: developer
7404b9ad928SBarry Smith 
7414b9ad928SBarry Smith .keywords: PC, shell, get, name, user-provided
7424b9ad928SBarry Smith 
7434b9ad928SBarry Smith .seealso: PCShellSetName()
7444b9ad928SBarry Smith @*/
745ccaf0856SBarry Smith PetscErrorCode  PCShellGetName(PC pc,const char *name[])
7464b9ad928SBarry Smith {
7474ac538c5SBarry Smith   PetscErrorCode ierr;
7484b9ad928SBarry Smith 
7494b9ad928SBarry Smith   PetscFunctionBegin;
7500700a824SBarry Smith   PetscValidHeaderSpecific(pc,PC_CLASSID,1);
7514482741eSBarry Smith   PetscValidPointer(name,2);
752ccaf0856SBarry Smith   ierr = PetscUseMethod(pc,"PCShellGetName_C",(PC,const char *[]),(pc,name));CHKERRQ(ierr);
7534b9ad928SBarry Smith   PetscFunctionReturn(0);
7544b9ad928SBarry Smith }
7554b9ad928SBarry Smith 
7564b9ad928SBarry Smith #undef __FUNCT__
7574b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApplyRichardson"
7584b9ad928SBarry Smith /*@C
7594b9ad928SBarry Smith    PCShellSetApplyRichardson - Sets routine to use as preconditioner
7604b9ad928SBarry Smith    in Richardson iteration.
7614b9ad928SBarry Smith 
7623f9fe445SBarry Smith    Logically Collective on PC
7634b9ad928SBarry Smith 
7644b9ad928SBarry Smith    Input Parameters:
7654b9ad928SBarry Smith +  pc - the preconditioner context
766be29d3c6SBarry Smith -  apply - the application-provided preconditioning routine
7674b9ad928SBarry Smith 
7684b9ad928SBarry Smith    Calling sequence of apply:
7694b9ad928SBarry Smith .vb
7706891c3e4SJed Brown    PetscErrorCode apply (PC pc,Vec b,Vec x,Vec r,PetscReal rtol,PetscReal abstol,PetscReal dtol,PetscInt maxits)
7714b9ad928SBarry Smith .ve
7724b9ad928SBarry Smith 
7736891c3e4SJed Brown +  pc - the preconditioner, get the application context with PCShellGetContext()
7744b9ad928SBarry Smith .  b - right-hand-side
7754b9ad928SBarry Smith .  x - current iterate
7764b9ad928SBarry Smith .  r - work space
7774b9ad928SBarry Smith .  rtol - relative tolerance of residual norm to stop at
77870441072SBarry Smith .  abstol - absolute tolerance of residual norm to stop at
7794b9ad928SBarry Smith .  dtol - if residual norm increases by this factor than return
7804b9ad928SBarry Smith -  maxits - number of iterations to run
7814b9ad928SBarry Smith 
7824aa34b0aSBarry Smith    Notes: the function MUST return an error code of 0 on success and nonzero on failure.
7834aa34b0aSBarry Smith 
7844b9ad928SBarry Smith    Level: developer
7854b9ad928SBarry Smith 
7864b9ad928SBarry Smith .keywords: PC, shell, set, apply, Richardson, user-provided
7874b9ad928SBarry Smith 
788be29d3c6SBarry Smith .seealso: PCShellSetApply(), PCShellSetContext()
7894b9ad928SBarry Smith @*/
7907087cfbeSBarry Smith PetscErrorCode  PCShellSetApplyRichardson(PC pc,PetscErrorCode (*apply)(PC,Vec,Vec,Vec,PetscReal,PetscReal,PetscReal,PetscInt,PetscBool ,PetscInt*,PCRichardsonConvergedReason*))
7914b9ad928SBarry Smith {
7924ac538c5SBarry Smith   PetscErrorCode ierr;
7934b9ad928SBarry Smith 
7944b9ad928SBarry Smith   PetscFunctionBegin;
7950700a824SBarry Smith   PetscValidHeaderSpecific(pc,PC_CLASSID,1);
7964ac538c5SBarry Smith   ierr = PetscTryMethod(pc,"PCShellSetApplyRichardson_C",(PC,PetscErrorCode (*)(PC,Vec,Vec,Vec,PetscReal,PetscReal,PetscReal,PetscInt,PetscBool ,PetscInt*,PCRichardsonConvergedReason*)),(pc,apply));CHKERRQ(ierr);
7974b9ad928SBarry Smith   PetscFunctionReturn(0);
7984b9ad928SBarry Smith }
7994b9ad928SBarry Smith 
8004b9ad928SBarry Smith /*MC
8014b9ad928SBarry Smith    PCSHELL - Creates a new preconditioner class for use with your
8024b9ad928SBarry Smith               own private data storage format.
8034b9ad928SBarry Smith 
8044b9ad928SBarry Smith    Level: advanced
80590198e61SBarry Smith >
8064b9ad928SBarry Smith    Concepts: providing your own preconditioner
8074b9ad928SBarry Smith 
8084b9ad928SBarry Smith   Usage:
8096891c3e4SJed Brown $             extern PetscErrorCode apply(PC,Vec,Vec);
8106891c3e4SJed Brown $             extern PetscErrorCode applyba(PC,PCSide,Vec,Vec,Vec);
8116891c3e4SJed Brown $             extern PetscErrorCode applytranspose(PC,Vec,Vec);
8126891c3e4SJed Brown $             extern PetscErrorCode setup(PC);
8136891c3e4SJed Brown $             extern PetscErrorCode destroy(PC);
8146891c3e4SJed Brown $
8154b9ad928SBarry Smith $             PCCreate(comm,&pc);
8164b9ad928SBarry Smith $             PCSetType(pc,PCSHELL);
817be29d3c6SBarry Smith $             PCShellSetContext(pc,ctx)
8186891c3e4SJed Brown $             PCShellSetApply(pc,apply);
8196891c3e4SJed Brown $             PCShellSetApplyBA(pc,applyba);               (optional)
8206891c3e4SJed Brown $             PCShellSetApplyTranspose(pc,applytranspose); (optional)
8214b9ad928SBarry Smith $             PCShellSetSetUp(pc,setup);                   (optional)
822d01c8aa3SLisandro Dalcin $             PCShellSetDestroy(pc,destroy);               (optional)
8234b9ad928SBarry Smith 
8244b9ad928SBarry Smith .seealso:  PCCreate(), PCSetType(), PCType (for list of available types), PC,
825fd2d0fe1Svictor            MATSHELL, PCShellSetSetUp(), PCShellSetApply(), PCShellSetView(),
826fd2d0fe1Svictor            PCShellSetApplyTranspose(), PCShellSetName(), PCShellSetApplyRichardson(),
8272bb17772SBarry Smith            PCShellGetName(), PCShellSetContext(), PCShellGetContext(), PCShellSetApplyBA()
8284b9ad928SBarry Smith M*/
8294b9ad928SBarry Smith 
8304b9ad928SBarry Smith EXTERN_C_BEGIN
8314b9ad928SBarry Smith #undef __FUNCT__
8324b9ad928SBarry Smith #define __FUNCT__ "PCCreate_Shell"
8337087cfbeSBarry Smith PetscErrorCode  PCCreate_Shell(PC pc)
8344b9ad928SBarry Smith {
835dfbe8321SBarry Smith   PetscErrorCode ierr;
8364b9ad928SBarry Smith   PC_Shell       *shell;
8374b9ad928SBarry Smith 
8384b9ad928SBarry Smith   PetscFunctionBegin;
83938f2d2fdSLisandro Dalcin   ierr = PetscNewLog(pc,PC_Shell,&shell);CHKERRQ(ierr);
8404b9ad928SBarry Smith   pc->data  = (void*)shell;
8414b9ad928SBarry Smith 
842d01c8aa3SLisandro Dalcin   pc->ops->destroy         = PCDestroy_Shell;
8434b9ad928SBarry Smith   pc->ops->view            = PCView_Shell;
844d01c8aa3SLisandro Dalcin   pc->ops->apply           = PCApply_Shell;
845d01c8aa3SLisandro Dalcin   pc->ops->applytranspose  = 0;
8464b9ad928SBarry Smith   pc->ops->applyrichardson = 0;
847d01c8aa3SLisandro Dalcin   pc->ops->setup           = 0;
8489bbb2c88SBarry Smith   pc->ops->presolve        = 0;
8499bbb2c88SBarry Smith   pc->ops->postsolve       = 0;
8504b9ad928SBarry Smith 
8514b9ad928SBarry Smith   shell->apply          = 0;
8524b9ad928SBarry Smith   shell->applytranspose = 0;
8534b9ad928SBarry Smith   shell->name           = 0;
8544b9ad928SBarry Smith   shell->applyrich      = 0;
8557cdd61b2SBarry Smith   shell->presolve       = 0;
8567cdd61b2SBarry Smith   shell->postsolve      = 0;
8574b9ad928SBarry Smith   shell->ctx            = 0;
8584b9ad928SBarry Smith   shell->setup          = 0;
8594b9ad928SBarry Smith   shell->view           = 0;
86018be62a5SSatish Balay   shell->destroy        = 0;
8614b9ad928SBarry Smith 
86218be62a5SSatish Balay   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetDestroy_C","PCShellSetDestroy_Shell",
86318be62a5SSatish Balay                     PCShellSetDestroy_Shell);CHKERRQ(ierr);
8644b9ad928SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetSetUp_C","PCShellSetSetUp_Shell",
8654b9ad928SBarry Smith                     PCShellSetSetUp_Shell);CHKERRQ(ierr);
8664b9ad928SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetApply_C","PCShellSetApply_Shell",
8674b9ad928SBarry Smith                     PCShellSetApply_Shell);CHKERRQ(ierr);
8682bb17772SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetApplyBA_C","PCShellSetApplyBA_Shell",
8692bb17772SBarry Smith                     PCShellSetApplyBA_Shell);CHKERRQ(ierr);
8707cdd61b2SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetPreSolve_C","PCShellSetPreSolve_Shell",
8717cdd61b2SBarry Smith                     PCShellSetPreSolve_Shell);CHKERRQ(ierr);
8727cdd61b2SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetPostSolve_C","PCShellSetPostSolve_Shell",
8737cdd61b2SBarry Smith                     PCShellSetPostSolve_Shell);CHKERRQ(ierr);
8744b9ad928SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetView_C","PCShellSetView_Shell",
8754b9ad928SBarry Smith                     PCShellSetView_Shell);CHKERRQ(ierr);
876be29d3c6SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetApplyTranspose_C","PCShellSetApplyTranspose_Shell",
8774b9ad928SBarry Smith                     PCShellSetApplyTranspose_Shell);CHKERRQ(ierr);
8784b9ad928SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetName_C","PCShellSetName_Shell",
8794b9ad928SBarry Smith                     PCShellSetName_Shell);CHKERRQ(ierr);
8804b9ad928SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellGetName_C","PCShellGetName_Shell",
8814b9ad928SBarry Smith                     PCShellGetName_Shell);CHKERRQ(ierr);
882be29d3c6SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetApplyRichardson_C","PCShellSetApplyRichardson_Shell",
8834b9ad928SBarry Smith                     PCShellSetApplyRichardson_Shell);CHKERRQ(ierr);
8844b9ad928SBarry Smith   PetscFunctionReturn(0);
8854b9ad928SBarry Smith }
8864b9ad928SBarry Smith EXTERN_C_END
8874b9ad928SBarry Smith 
8884b9ad928SBarry Smith 
8894b9ad928SBarry Smith 
8904b9ad928SBarry Smith 
8914b9ad928SBarry Smith 
8924b9ad928SBarry Smith 
893