xref: /petsc/src/ksp/pc/impls/shell/shellpc.c (revision 7b6e20038cd7a330335af7f4640b5599e59f035f)
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 
7af0996ceSBarry Smith #include <petsc/private/pcimpl.h>        /*I "petscpc.h" I*/
84b9ad928SBarry Smith 
94b9ad928SBarry Smith typedef struct {
10be29d3c6SBarry Smith   void *ctx;                     /* user provided contexts for preconditioner */
112fa5cd67SKarl Rupp 
126891c3e4SJed Brown   PetscErrorCode (*destroy)(PC);
136891c3e4SJed Brown   PetscErrorCode (*setup)(PC);
146891c3e4SJed Brown   PetscErrorCode (*apply)(PC,Vec,Vec);
15*7b6e2003SPierre Jolivet   PetscErrorCode (*matapply)(PC,Mat,Mat);
161b581b66SBarry Smith   PetscErrorCode (*applysymmetricleft)(PC,Vec,Vec);
171b581b66SBarry Smith   PetscErrorCode (*applysymmetricright)(PC,Vec,Vec);
186891c3e4SJed Brown   PetscErrorCode (*applyBA)(PC,PCSide,Vec,Vec,Vec);
196891c3e4SJed Brown   PetscErrorCode (*presolve)(PC,KSP,Vec,Vec);
206891c3e4SJed Brown   PetscErrorCode (*postsolve)(PC,KSP,Vec,Vec);
216891c3e4SJed Brown   PetscErrorCode (*view)(PC,PetscViewer);
226891c3e4SJed Brown   PetscErrorCode (*applytranspose)(PC,Vec,Vec);
23ace3abfcSBarry Smith   PetscErrorCode (*applyrich)(PC,Vec,Vec,Vec,PetscReal,PetscReal,PetscReal,PetscInt,PetscBool,PetscInt*,PCRichardsonConvergedReason*);
242fa5cd67SKarl Rupp 
254b9ad928SBarry Smith   char *name;
264b9ad928SBarry Smith } PC_Shell;
274b9ad928SBarry Smith 
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 
4495452b02SPatrick Sanan    Fortran Notes:
4595452b02SPatrick Sanan     To use this from Fortran you must write a Fortran interface definition for this
46daf670e6SBarry Smith     function that tells Fortran the Fortran derived data type that you are passing in as the ctx argument.
47daf670e6SBarry 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);
590a545947SLisandro Dalcin   if (!flg) *ctx = NULL;
60be29d3c6SBarry Smith   else      *ctx = ((PC_Shell*)(pc->data))->ctx;
61be29d3c6SBarry Smith   PetscFunctionReturn(0);
62be29d3c6SBarry Smith }
63be29d3c6SBarry Smith 
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 
7595452b02SPatrick Sanan    Fortran Notes:
7695452b02SPatrick Sanan     To use this from Fortran you must write a Fortran interface definition for this
77daf670e6SBarry Smith     function that tells Fortran the Fortran derived data type that you are passing in as the ctx argument.
78daf670e6SBarry Smith 
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);
922fa5cd67SKarl Rupp   if (flg) shell->ctx = ctx;
93be29d3c6SBarry Smith   PetscFunctionReturn(0);
94be29d3c6SBarry Smith }
95be29d3c6SBarry Smith 
966849ba73SBarry Smith static PetscErrorCode PCSetUp_Shell(PC pc)
974b9ad928SBarry Smith {
98c5ae4b9aSBarry Smith   PC_Shell       *shell = (PC_Shell*)pc->data;
99dfbe8321SBarry Smith   PetscErrorCode ierr;
1004b9ad928SBarry Smith 
1014b9ad928SBarry Smith   PetscFunctionBegin;
102ce94432eSBarry Smith   if (!shell->setup) SETERRQ(PetscObjectComm((PetscObject)pc),PETSC_ERR_USER,"No setup() routine provided to Shell PC");
103eb6b5d47SBarry Smith   PetscStackCall("PCSHELL user function setup()",ierr = (*shell->setup)(pc);CHKERRQ(ierr));
1044b9ad928SBarry Smith   PetscFunctionReturn(0);
1054b9ad928SBarry Smith }
1064b9ad928SBarry Smith 
1076849ba73SBarry Smith static PetscErrorCode PCApply_Shell(PC pc,Vec x,Vec y)
1084b9ad928SBarry Smith {
109c5ae4b9aSBarry Smith   PC_Shell         *shell = (PC_Shell*)pc->data;
110dfbe8321SBarry Smith   PetscErrorCode   ierr;
111e3f487b0SBarry Smith   PetscObjectState instate,outstate;
1124b9ad928SBarry Smith 
1134b9ad928SBarry Smith   PetscFunctionBegin;
114ce94432eSBarry Smith   if (!shell->apply) SETERRQ(PetscObjectComm((PetscObject)pc),PETSC_ERR_USER,"No apply() routine provided to Shell PC");
115e3f487b0SBarry Smith   ierr = PetscObjectStateGet((PetscObject)y, &instate);CHKERRQ(ierr);
116eb6b5d47SBarry Smith   PetscStackCall("PCSHELL user function apply()",ierr = (*shell->apply)(pc,x,y);CHKERRQ(ierr));
117e3f487b0SBarry Smith   ierr = PetscObjectStateGet((PetscObject)y, &outstate);CHKERRQ(ierr);
118e3f487b0SBarry Smith   if (instate == outstate) {
119e3f487b0SBarry Smith     /* increase the state of the output vector since the user did not update its state themselve as should have been done */
120e3f487b0SBarry Smith     ierr = PetscObjectStateIncrease((PetscObject)y);CHKERRQ(ierr);
121e3f487b0SBarry Smith   }
1224b9ad928SBarry Smith   PetscFunctionReturn(0);
1234b9ad928SBarry Smith }
1244b9ad928SBarry Smith 
125*7b6e2003SPierre Jolivet static PetscErrorCode PCMatApply_Shell(PC pc,Mat X,Mat Y)
126*7b6e2003SPierre Jolivet {
127*7b6e2003SPierre Jolivet   PC_Shell         *shell = (PC_Shell*)pc->data;
128*7b6e2003SPierre Jolivet   PetscErrorCode   ierr;
129*7b6e2003SPierre Jolivet   PetscObjectState instate,outstate;
130*7b6e2003SPierre Jolivet 
131*7b6e2003SPierre Jolivet   PetscFunctionBegin;
132*7b6e2003SPierre Jolivet   if (!shell->matapply) SETERRQ(PetscObjectComm((PetscObject)pc),PETSC_ERR_USER,"No apply() routine provided to Shell PC");
133*7b6e2003SPierre Jolivet   ierr = PetscObjectStateGet((PetscObject)Y, &instate);CHKERRQ(ierr);
134*7b6e2003SPierre Jolivet   PetscStackCall("PCSHELL user function apply()",ierr = (*shell->matapply)(pc,X,Y);CHKERRQ(ierr));
135*7b6e2003SPierre Jolivet   ierr = PetscObjectStateGet((PetscObject)Y, &outstate);CHKERRQ(ierr);
136*7b6e2003SPierre Jolivet   if (instate == outstate) {
137*7b6e2003SPierre Jolivet     /* increase the state of the output vector since the user did not update its state themselve as should have been done */
138*7b6e2003SPierre Jolivet     ierr = PetscObjectStateIncrease((PetscObject)Y);CHKERRQ(ierr);
139*7b6e2003SPierre Jolivet   }
140*7b6e2003SPierre Jolivet   PetscFunctionReturn(0);
141*7b6e2003SPierre Jolivet }
142*7b6e2003SPierre Jolivet 
1431b581b66SBarry Smith static PetscErrorCode PCApplySymmetricLeft_Shell(PC pc,Vec x,Vec y)
1441b581b66SBarry Smith {
1451b581b66SBarry Smith   PC_Shell       *shell = (PC_Shell*)pc->data;
1461b581b66SBarry Smith   PetscErrorCode ierr;
1471b581b66SBarry Smith 
1481b581b66SBarry Smith   PetscFunctionBegin;
1491b581b66SBarry Smith   if (!shell->applysymmetricleft) SETERRQ(PetscObjectComm((PetscObject)pc),PETSC_ERR_USER,"No apply() routine provided to Shell PC");
1501b581b66SBarry Smith   PetscStackCall("PCSHELL user function apply()",ierr = (*shell->applysymmetricleft)(pc,x,y);CHKERRQ(ierr));
1511b581b66SBarry Smith   PetscFunctionReturn(0);
1521b581b66SBarry Smith }
1531b581b66SBarry Smith 
1541b581b66SBarry Smith static PetscErrorCode PCApplySymmetricRight_Shell(PC pc,Vec x,Vec y)
1551b581b66SBarry Smith {
1561b581b66SBarry Smith   PC_Shell       *shell = (PC_Shell*)pc->data;
1571b581b66SBarry Smith   PetscErrorCode ierr;
1581b581b66SBarry Smith 
1591b581b66SBarry Smith   PetscFunctionBegin;
1601b581b66SBarry Smith   if (!shell->applysymmetricright) SETERRQ(PetscObjectComm((PetscObject)pc),PETSC_ERR_USER,"No apply() routine provided to Shell PC");
1611b581b66SBarry Smith   PetscStackCall("PCSHELL user function apply()",ierr = (*shell->applysymmetricright)(pc,x,y);CHKERRQ(ierr));
1621b581b66SBarry Smith   PetscFunctionReturn(0);
1631b581b66SBarry Smith }
1641b581b66SBarry Smith 
1652bb17772SBarry Smith static PetscErrorCode PCApplyBA_Shell(PC pc,PCSide side,Vec x,Vec y,Vec w)
1662bb17772SBarry Smith {
167c5ae4b9aSBarry Smith   PC_Shell         *shell = (PC_Shell*)pc->data;
1682bb17772SBarry Smith   PetscErrorCode   ierr;
169e3f487b0SBarry Smith   PetscObjectState instate,outstate;
1702bb17772SBarry Smith 
1712bb17772SBarry Smith   PetscFunctionBegin;
172ce94432eSBarry Smith   if (!shell->applyBA) SETERRQ(PetscObjectComm((PetscObject)pc),PETSC_ERR_USER,"No applyBA() routine provided to Shell PC");
173e3f487b0SBarry Smith   ierr = PetscObjectStateGet((PetscObject)w, &instate);CHKERRQ(ierr);
174eb6b5d47SBarry Smith   PetscStackCall("PCSHELL user function applyBA()",ierr = (*shell->applyBA)(pc,side,x,y,w);CHKERRQ(ierr));
175e3f487b0SBarry Smith   ierr = PetscObjectStateGet((PetscObject)w, &outstate);CHKERRQ(ierr);
176e3f487b0SBarry Smith   if (instate == outstate) {
177e3f487b0SBarry Smith     /* increase the state of the output vector since the user did not update its state themselve as should have been done */
178e3f487b0SBarry Smith     ierr = PetscObjectStateIncrease((PetscObject)w);CHKERRQ(ierr);
179e3f487b0SBarry Smith   }
1802bb17772SBarry Smith   PetscFunctionReturn(0);
1812bb17772SBarry Smith }
1822bb17772SBarry Smith 
183a06fd7f2SStefano Zampini static PetscErrorCode PCPreSolveChangeRHS_Shell(PC pc,PetscBool* change)
184a06fd7f2SStefano Zampini {
185a06fd7f2SStefano Zampini   PetscFunctionBegin;
186a06fd7f2SStefano Zampini   *change = PETSC_TRUE;
187a06fd7f2SStefano Zampini   PetscFunctionReturn(0);
188a06fd7f2SStefano Zampini }
189a06fd7f2SStefano Zampini 
1907cdd61b2SBarry Smith static PetscErrorCode PCPreSolve_Shell(PC pc,KSP ksp,Vec b,Vec x)
1917cdd61b2SBarry Smith {
192c5ae4b9aSBarry Smith   PC_Shell       *shell = (PC_Shell*)pc->data;
1937cdd61b2SBarry Smith   PetscErrorCode ierr;
1947cdd61b2SBarry Smith 
1957cdd61b2SBarry Smith   PetscFunctionBegin;
196ce94432eSBarry Smith   if (!shell->presolve) SETERRQ(PetscObjectComm((PetscObject)pc),PETSC_ERR_USER,"No presolve() routine provided to Shell PC");
197eb6b5d47SBarry Smith   PetscStackCall("PCSHELL user function presolve()",ierr = (*shell->presolve)(pc,ksp,b,x);CHKERRQ(ierr));
1987cdd61b2SBarry Smith   PetscFunctionReturn(0);
1997cdd61b2SBarry Smith }
2007cdd61b2SBarry Smith 
2017cdd61b2SBarry Smith static PetscErrorCode PCPostSolve_Shell(PC pc,KSP ksp,Vec b,Vec x)
2027cdd61b2SBarry Smith {
203c5ae4b9aSBarry Smith   PC_Shell       *shell = (PC_Shell*)pc->data;
2047cdd61b2SBarry Smith   PetscErrorCode ierr;
2057cdd61b2SBarry Smith 
2067cdd61b2SBarry Smith   PetscFunctionBegin;
207ce94432eSBarry Smith   if (!shell->postsolve) SETERRQ(PetscObjectComm((PetscObject)pc),PETSC_ERR_USER,"No postsolve() routine provided to Shell PC");
208eb6b5d47SBarry Smith   PetscStackCall("PCSHELL user function postsolve()",ierr = (*shell->postsolve)(pc,ksp,b,x);CHKERRQ(ierr));
2097cdd61b2SBarry Smith   PetscFunctionReturn(0);
2107cdd61b2SBarry Smith }
2117cdd61b2SBarry Smith 
2126849ba73SBarry Smith static PetscErrorCode PCApplyTranspose_Shell(PC pc,Vec x,Vec y)
2134b9ad928SBarry Smith {
214c5ae4b9aSBarry Smith   PC_Shell         *shell = (PC_Shell*)pc->data;
215dfbe8321SBarry Smith   PetscErrorCode   ierr;
216e3f487b0SBarry Smith   PetscObjectState instate,outstate;
2174b9ad928SBarry Smith 
2184b9ad928SBarry Smith   PetscFunctionBegin;
219ce94432eSBarry Smith   if (!shell->applytranspose) SETERRQ(PetscObjectComm((PetscObject)pc),PETSC_ERR_USER,"No applytranspose() routine provided to Shell PC");
220e3f487b0SBarry Smith   ierr = PetscObjectStateGet((PetscObject)y, &instate);CHKERRQ(ierr);
221eb6b5d47SBarry Smith   PetscStackCall("PCSHELL user function applytranspose()",ierr = (*shell->applytranspose)(pc,x,y);CHKERRQ(ierr));
222e3f487b0SBarry Smith   ierr = PetscObjectStateGet((PetscObject)y, &outstate);CHKERRQ(ierr);
223e3f487b0SBarry Smith   if (instate == outstate) {
224e3f487b0SBarry Smith     /* increase the state of the output vector since the user did not update its state themself as should have been done */
225e3f487b0SBarry Smith     ierr = PetscObjectStateIncrease((PetscObject)y);CHKERRQ(ierr);
226e3f487b0SBarry Smith   }
2274b9ad928SBarry Smith   PetscFunctionReturn(0);
2284b9ad928SBarry Smith }
2294b9ad928SBarry Smith 
230ace3abfcSBarry 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)
2314b9ad928SBarry Smith {
232dfbe8321SBarry Smith   PetscErrorCode   ierr;
233c5ae4b9aSBarry Smith   PC_Shell         *shell = (PC_Shell*)pc->data;
234e3f487b0SBarry Smith   PetscObjectState instate,outstate;
2354b9ad928SBarry Smith 
2364b9ad928SBarry Smith   PetscFunctionBegin;
237ce94432eSBarry Smith   if (!shell->applyrich) SETERRQ(PetscObjectComm((PetscObject)pc),PETSC_ERR_USER,"No applyrichardson() routine provided to Shell PC");
238e3f487b0SBarry Smith   ierr = PetscObjectStateGet((PetscObject)y, &instate);CHKERRQ(ierr);
239eb6b5d47SBarry Smith   PetscStackCall("PCSHELL user function applyrichardson()",ierr = (*shell->applyrich)(pc,x,y,w,rtol,abstol,dtol,it,guesszero,outits,reason);CHKERRQ(ierr));
240e3f487b0SBarry Smith   ierr = PetscObjectStateGet((PetscObject)y, &outstate);CHKERRQ(ierr);
241e3f487b0SBarry Smith   if (instate == outstate) {
242e3f487b0SBarry Smith     /* increase the state of the output vector since the user did not update its state themself as should have been done */
243e3f487b0SBarry Smith     ierr = PetscObjectStateIncrease((PetscObject)y);CHKERRQ(ierr);
244e3f487b0SBarry Smith   }
2454b9ad928SBarry Smith   PetscFunctionReturn(0);
2464b9ad928SBarry Smith }
2474b9ad928SBarry Smith 
2486849ba73SBarry Smith static PetscErrorCode PCDestroy_Shell(PC pc)
2494b9ad928SBarry Smith {
2504b9ad928SBarry Smith   PC_Shell       *shell = (PC_Shell*)pc->data;
251dfbe8321SBarry Smith   PetscErrorCode ierr;
2524b9ad928SBarry Smith 
2534b9ad928SBarry Smith   PetscFunctionBegin;
254503cfb0cSBarry Smith   ierr = PetscFree(shell->name);CHKERRQ(ierr);
2552fa5cd67SKarl Rupp   if (shell->destroy) PetscStackCall("PCSHELL user function destroy()",ierr = (*shell->destroy)(pc);CHKERRQ(ierr));
256a06fd7f2SStefano Zampini   ierr = PetscObjectComposeFunction((PetscObject)pc,"PCShellSetDestroy_C",NULL);CHKERRQ(ierr);
257a06fd7f2SStefano Zampini   ierr = PetscObjectComposeFunction((PetscObject)pc,"PCShellSetSetUp_C",NULL);CHKERRQ(ierr);
258a06fd7f2SStefano Zampini   ierr = PetscObjectComposeFunction((PetscObject)pc,"PCShellSetApply_C",NULL);CHKERRQ(ierr);
259*7b6e2003SPierre Jolivet   ierr = PetscObjectComposeFunction((PetscObject)pc,"PCShellSetMatApply_C",NULL);CHKERRQ(ierr);
260a06fd7f2SStefano Zampini   ierr = PetscObjectComposeFunction((PetscObject)pc,"PCShellSetApplySymmetricLeft_C",NULL);CHKERRQ(ierr);
261a06fd7f2SStefano Zampini   ierr = PetscObjectComposeFunction((PetscObject)pc,"PCShellSetApplySymmetricRight_C",NULL);CHKERRQ(ierr);
262a06fd7f2SStefano Zampini   ierr = PetscObjectComposeFunction((PetscObject)pc,"PCShellSetApplyBA_C",NULL);CHKERRQ(ierr);
263a06fd7f2SStefano Zampini   ierr = PetscObjectComposeFunction((PetscObject)pc,"PCShellSetPreSolve_C",NULL);CHKERRQ(ierr);
264a06fd7f2SStefano Zampini   ierr = PetscObjectComposeFunction((PetscObject)pc,"PCShellSetPostSolve_C",NULL);CHKERRQ(ierr);
265a06fd7f2SStefano Zampini   ierr = PetscObjectComposeFunction((PetscObject)pc,"PCShellSetView_C",NULL);CHKERRQ(ierr);
266a06fd7f2SStefano Zampini   ierr = PetscObjectComposeFunction((PetscObject)pc,"PCShellSetApplyTranspose_C",NULL);CHKERRQ(ierr);
267a06fd7f2SStefano Zampini   ierr = PetscObjectComposeFunction((PetscObject)pc,"PCShellSetName_C",NULL);CHKERRQ(ierr);
268a06fd7f2SStefano Zampini   ierr = PetscObjectComposeFunction((PetscObject)pc,"PCShellGetName_C",NULL);CHKERRQ(ierr);
269a06fd7f2SStefano Zampini   ierr = PetscObjectComposeFunction((PetscObject)pc,"PCShellSetApplyRichardson_C",NULL);CHKERRQ(ierr);
270a06fd7f2SStefano Zampini   ierr = PetscObjectComposeFunction((PetscObject)pc,"PCPreSolveChangeRHS_C",NULL);CHKERRQ(ierr);
271c31cb41cSBarry Smith   ierr = PetscFree(pc->data);CHKERRQ(ierr);
2724b9ad928SBarry Smith   PetscFunctionReturn(0);
2734b9ad928SBarry Smith }
2744b9ad928SBarry Smith 
2756849ba73SBarry Smith static PetscErrorCode PCView_Shell(PC pc,PetscViewer viewer)
2764b9ad928SBarry Smith {
2774b9ad928SBarry Smith   PC_Shell       *shell = (PC_Shell*)pc->data;
278dfbe8321SBarry Smith   PetscErrorCode ierr;
279ace3abfcSBarry Smith   PetscBool      iascii;
2804b9ad928SBarry Smith 
2814b9ad928SBarry Smith   PetscFunctionBegin;
282251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
28332077d6dSBarry Smith   if (iascii) {
2842fa5cd67SKarl Rupp     if (shell->name) {
285efd4aadfSBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"  %s\n",shell->name);CHKERRQ(ierr);
2862fa5cd67SKarl Rupp     } else {
287efd4aadfSBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"  no name\n");CHKERRQ(ierr);
2882fa5cd67SKarl Rupp     }
2894b9ad928SBarry Smith   }
2904b9ad928SBarry Smith   if (shell->view) {
2914b9ad928SBarry Smith     ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
2926891c3e4SJed Brown     ierr = (*shell->view)(pc,viewer);CHKERRQ(ierr);
2934b9ad928SBarry Smith     ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
2944b9ad928SBarry Smith   }
2954b9ad928SBarry Smith   PetscFunctionReturn(0);
2964b9ad928SBarry Smith }
2974b9ad928SBarry Smith 
2984b9ad928SBarry Smith /* ------------------------------------------------------------------------------*/
299f7a08781SBarry Smith static PetscErrorCode  PCShellSetDestroy_Shell(PC pc, PetscErrorCode (*destroy)(PC))
30018be62a5SSatish Balay {
301c5ae4b9aSBarry Smith   PC_Shell *shell= (PC_Shell*)pc->data;
30218be62a5SSatish Balay 
30318be62a5SSatish Balay   PetscFunctionBegin;
30418be62a5SSatish Balay   shell->destroy = destroy;
30518be62a5SSatish Balay   PetscFunctionReturn(0);
30618be62a5SSatish Balay }
30718be62a5SSatish Balay 
308f7a08781SBarry Smith static PetscErrorCode  PCShellSetSetUp_Shell(PC pc, PetscErrorCode (*setup)(PC))
3094b9ad928SBarry Smith {
310feb237baSPierre Jolivet   PC_Shell *shell = (PC_Shell*)pc->data;
3114b9ad928SBarry Smith 
3124b9ad928SBarry Smith   PetscFunctionBegin;
3134b9ad928SBarry Smith   shell->setup = setup;
314d01c8aa3SLisandro Dalcin   if (setup) pc->ops->setup = PCSetUp_Shell;
3150a545947SLisandro Dalcin   else       pc->ops->setup = NULL;
3164b9ad928SBarry Smith   PetscFunctionReturn(0);
3174b9ad928SBarry Smith }
3184b9ad928SBarry Smith 
319f7a08781SBarry Smith static PetscErrorCode  PCShellSetApply_Shell(PC pc,PetscErrorCode (*apply)(PC,Vec,Vec))
3204b9ad928SBarry Smith {
321c5ae4b9aSBarry Smith   PC_Shell *shell = (PC_Shell*)pc->data;
3224b9ad928SBarry Smith 
3234b9ad928SBarry Smith   PetscFunctionBegin;
3244b9ad928SBarry Smith   shell->apply = apply;
3254b9ad928SBarry Smith   PetscFunctionReturn(0);
3264b9ad928SBarry Smith }
3274b9ad928SBarry Smith 
328*7b6e2003SPierre Jolivet static PetscErrorCode  PCShellSetMatApply_Shell(PC pc,PetscErrorCode (*matapply)(PC,Mat,Mat))
329*7b6e2003SPierre Jolivet {
330*7b6e2003SPierre Jolivet   PC_Shell *shell = (PC_Shell*)pc->data;
331*7b6e2003SPierre Jolivet 
332*7b6e2003SPierre Jolivet   PetscFunctionBegin;
333*7b6e2003SPierre Jolivet   shell->matapply = matapply;
334*7b6e2003SPierre Jolivet   PetscFunctionReturn(0);
335*7b6e2003SPierre Jolivet }
336*7b6e2003SPierre Jolivet 
3371b581b66SBarry Smith static PetscErrorCode  PCShellSetApplySymmetricLeft_Shell(PC pc,PetscErrorCode (*apply)(PC,Vec,Vec))
3381b581b66SBarry Smith {
3391b581b66SBarry Smith   PC_Shell *shell = (PC_Shell*)pc->data;
3401b581b66SBarry Smith 
3411b581b66SBarry Smith   PetscFunctionBegin;
3421b581b66SBarry Smith   shell->applysymmetricleft = apply;
3431b581b66SBarry Smith   PetscFunctionReturn(0);
3441b581b66SBarry Smith }
3451b581b66SBarry Smith 
3461b581b66SBarry Smith static PetscErrorCode  PCShellSetApplySymmetricRight_Shell(PC pc,PetscErrorCode (*apply)(PC,Vec,Vec))
3471b581b66SBarry Smith {
3481b581b66SBarry Smith   PC_Shell *shell = (PC_Shell*)pc->data;
3491b581b66SBarry Smith 
3501b581b66SBarry Smith   PetscFunctionBegin;
3511b581b66SBarry Smith   shell->applysymmetricright = apply;
3521b581b66SBarry Smith   PetscFunctionReturn(0);
3531b581b66SBarry Smith }
3541b581b66SBarry Smith 
355f7a08781SBarry Smith static PetscErrorCode  PCShellSetApplyBA_Shell(PC pc,PetscErrorCode (*applyBA)(PC,PCSide,Vec,Vec,Vec))
3562bb17772SBarry Smith {
357c5ae4b9aSBarry Smith   PC_Shell *shell = (PC_Shell*)pc->data;
3582bb17772SBarry Smith 
3592bb17772SBarry Smith   PetscFunctionBegin;
360d01c8aa3SLisandro Dalcin   shell->applyBA = applyBA;
361d01c8aa3SLisandro Dalcin   if (applyBA) pc->ops->applyBA  = PCApplyBA_Shell;
3620a545947SLisandro Dalcin   else         pc->ops->applyBA  = NULL;
3632bb17772SBarry Smith   PetscFunctionReturn(0);
3642bb17772SBarry Smith }
3652bb17772SBarry Smith 
366f7a08781SBarry Smith static PetscErrorCode  PCShellSetPreSolve_Shell(PC pc,PetscErrorCode (*presolve)(PC,KSP,Vec,Vec))
3677cdd61b2SBarry Smith {
368c5ae4b9aSBarry Smith   PC_Shell       *shell = (PC_Shell*)pc->data;
369a06fd7f2SStefano Zampini   PetscErrorCode ierr;
3707cdd61b2SBarry Smith 
3717cdd61b2SBarry Smith   PetscFunctionBegin;
3727cdd61b2SBarry Smith   shell->presolve = presolve;
373a06fd7f2SStefano Zampini   if (presolve) {
374a06fd7f2SStefano Zampini     pc->ops->presolve = PCPreSolve_Shell;
375a06fd7f2SStefano Zampini     ierr = PetscObjectComposeFunction((PetscObject)pc,"PCPreSolveChangeRHS_C",PCPreSolveChangeRHS_Shell);CHKERRQ(ierr);
376a06fd7f2SStefano Zampini   } else {
3770a545947SLisandro Dalcin     pc->ops->presolve = NULL;
378a06fd7f2SStefano Zampini     ierr = PetscObjectComposeFunction((PetscObject)pc,"PCPreSolveChangeRHS_C",NULL);CHKERRQ(ierr);
379a06fd7f2SStefano Zampini   }
3807cdd61b2SBarry Smith   PetscFunctionReturn(0);
3817cdd61b2SBarry Smith }
3827cdd61b2SBarry Smith 
383f7a08781SBarry Smith static PetscErrorCode  PCShellSetPostSolve_Shell(PC pc,PetscErrorCode (*postsolve)(PC,KSP,Vec,Vec))
3847cdd61b2SBarry Smith {
385c5ae4b9aSBarry Smith   PC_Shell *shell = (PC_Shell*)pc->data;
3867cdd61b2SBarry Smith 
3877cdd61b2SBarry Smith   PetscFunctionBegin;
3887cdd61b2SBarry Smith   shell->postsolve = postsolve;
389d01c8aa3SLisandro Dalcin   if (postsolve) pc->ops->postsolve = PCPostSolve_Shell;
3900a545947SLisandro Dalcin   else           pc->ops->postsolve = NULL;
3917cdd61b2SBarry Smith   PetscFunctionReturn(0);
3927cdd61b2SBarry Smith }
3937cdd61b2SBarry Smith 
394f7a08781SBarry Smith static PetscErrorCode  PCShellSetView_Shell(PC pc,PetscErrorCode (*view)(PC,PetscViewer))
3954b9ad928SBarry Smith {
396c5ae4b9aSBarry Smith   PC_Shell *shell = (PC_Shell*)pc->data;
3974b9ad928SBarry Smith 
3984b9ad928SBarry Smith   PetscFunctionBegin;
3994b9ad928SBarry Smith   shell->view = view;
4004b9ad928SBarry Smith   PetscFunctionReturn(0);
4014b9ad928SBarry Smith }
4024b9ad928SBarry Smith 
403f7a08781SBarry Smith static PetscErrorCode  PCShellSetApplyTranspose_Shell(PC pc,PetscErrorCode (*applytranspose)(PC,Vec,Vec))
4044b9ad928SBarry Smith {
405c5ae4b9aSBarry Smith   PC_Shell *shell = (PC_Shell*)pc->data;
4064b9ad928SBarry Smith 
4074b9ad928SBarry Smith   PetscFunctionBegin;
4084b9ad928SBarry Smith   shell->applytranspose = applytranspose;
409d01c8aa3SLisandro Dalcin   if (applytranspose) pc->ops->applytranspose = PCApplyTranspose_Shell;
4100a545947SLisandro Dalcin   else                pc->ops->applytranspose = NULL;
411d01c8aa3SLisandro Dalcin   PetscFunctionReturn(0);
412d01c8aa3SLisandro Dalcin }
413d01c8aa3SLisandro Dalcin 
414f7a08781SBarry Smith static PetscErrorCode  PCShellSetApplyRichardson_Shell(PC pc,PetscErrorCode (*applyrich)(PC,Vec,Vec,Vec,PetscReal,PetscReal,PetscReal,PetscInt,PetscBool ,PetscInt*,PCRichardsonConvergedReason*))
415d01c8aa3SLisandro Dalcin {
416c5ae4b9aSBarry Smith   PC_Shell *shell = (PC_Shell*)pc->data;
417d01c8aa3SLisandro Dalcin 
418d01c8aa3SLisandro Dalcin   PetscFunctionBegin;
419d01c8aa3SLisandro Dalcin   shell->applyrich = applyrich;
420d01c8aa3SLisandro Dalcin   if (applyrich) pc->ops->applyrichardson = PCApplyRichardson_Shell;
4210a545947SLisandro Dalcin   else           pc->ops->applyrichardson = NULL;
4224b9ad928SBarry Smith   PetscFunctionReturn(0);
4234b9ad928SBarry Smith }
4244b9ad928SBarry Smith 
425f7a08781SBarry Smith static PetscErrorCode  PCShellSetName_Shell(PC pc,const char name[])
4264b9ad928SBarry Smith {
427c5ae4b9aSBarry Smith   PC_Shell       *shell = (PC_Shell*)pc->data;
428dfbe8321SBarry Smith   PetscErrorCode ierr;
4294b9ad928SBarry Smith 
4304b9ad928SBarry Smith   PetscFunctionBegin;
431503cfb0cSBarry Smith   ierr = PetscFree(shell->name);CHKERRQ(ierr);
4324b9ad928SBarry Smith   ierr = PetscStrallocpy(name,&shell->name);CHKERRQ(ierr);
4334b9ad928SBarry Smith   PetscFunctionReturn(0);
4344b9ad928SBarry Smith }
4354b9ad928SBarry Smith 
436f7a08781SBarry Smith static PetscErrorCode  PCShellGetName_Shell(PC pc,const char *name[])
4374b9ad928SBarry Smith {
438c5ae4b9aSBarry Smith   PC_Shell *shell = (PC_Shell*)pc->data;
4394b9ad928SBarry Smith 
4404b9ad928SBarry Smith   PetscFunctionBegin;
4414b9ad928SBarry Smith   *name = shell->name;
4424b9ad928SBarry Smith   PetscFunctionReturn(0);
4434b9ad928SBarry Smith }
4444b9ad928SBarry Smith 
4454b9ad928SBarry Smith /* -------------------------------------------------------------------------------*/
4464b9ad928SBarry Smith 
44718be62a5SSatish Balay /*@C
44818be62a5SSatish Balay    PCShellSetDestroy - Sets routine to use to destroy the user-provided
44918be62a5SSatish Balay    application context.
45018be62a5SSatish Balay 
4513f9fe445SBarry Smith    Logically Collective on PC
45218be62a5SSatish Balay 
45318be62a5SSatish Balay    Input Parameters:
45418be62a5SSatish Balay +  pc - the preconditioner context
455a2b725a8SWilliam Gropp -  destroy - the application-provided destroy routine
45618be62a5SSatish Balay 
45718be62a5SSatish Balay    Calling sequence of destroy:
45818be62a5SSatish Balay .vb
4596891c3e4SJed Brown    PetscErrorCode destroy (PC)
46018be62a5SSatish Balay .ve
46118be62a5SSatish Balay 
46218be62a5SSatish Balay .  ptr - the application context
46318be62a5SSatish Balay 
46495452b02SPatrick Sanan    Notes:
46595452b02SPatrick Sanan     the function MUST return an error code of 0 on success and nonzero on failure.
4664aa34b0aSBarry Smith 
46718be62a5SSatish Balay    Level: developer
46818be62a5SSatish Balay 
46918be62a5SSatish Balay .seealso: PCShellSetApply(), PCShellSetContext()
47018be62a5SSatish Balay @*/
4717087cfbeSBarry Smith PetscErrorCode  PCShellSetDestroy(PC pc,PetscErrorCode (*destroy)(PC))
47218be62a5SSatish Balay {
4734ac538c5SBarry Smith   PetscErrorCode ierr;
47418be62a5SSatish Balay 
47518be62a5SSatish Balay   PetscFunctionBegin;
4760700a824SBarry Smith   PetscValidHeaderSpecific(pc,PC_CLASSID,1);
4774ac538c5SBarry Smith   ierr = PetscTryMethod(pc,"PCShellSetDestroy_C",(PC,PetscErrorCode (*)(PC)),(pc,destroy));CHKERRQ(ierr);
47818be62a5SSatish Balay   PetscFunctionReturn(0);
47918be62a5SSatish Balay }
48018be62a5SSatish Balay 
48118be62a5SSatish Balay 
4824b9ad928SBarry Smith /*@C
4834b9ad928SBarry Smith    PCShellSetSetUp - Sets routine to use to "setup" the preconditioner whenever the
4844b9ad928SBarry Smith    matrix operator is changed.
4854b9ad928SBarry Smith 
4863f9fe445SBarry Smith    Logically Collective on PC
4874b9ad928SBarry Smith 
4884b9ad928SBarry Smith    Input Parameters:
4894b9ad928SBarry Smith +  pc - the preconditioner context
490a2b725a8SWilliam Gropp -  setup - the application-provided setup routine
4914b9ad928SBarry Smith 
4924b9ad928SBarry Smith    Calling sequence of setup:
4934b9ad928SBarry Smith .vb
4946891c3e4SJed Brown    PetscErrorCode setup (PC pc)
4954b9ad928SBarry Smith .ve
4964b9ad928SBarry Smith 
4976891c3e4SJed Brown .  pc - the preconditioner, get the application context with PCShellGetContext()
4984b9ad928SBarry Smith 
49995452b02SPatrick Sanan    Notes:
50095452b02SPatrick Sanan     the function MUST return an error code of 0 on success and nonzero on failure.
5014aa34b0aSBarry Smith 
5024b9ad928SBarry Smith    Level: developer
5034b9ad928SBarry Smith 
504be29d3c6SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetApply(), PCShellSetContext()
5054b9ad928SBarry Smith @*/
5067087cfbeSBarry Smith PetscErrorCode  PCShellSetSetUp(PC pc,PetscErrorCode (*setup)(PC))
5074b9ad928SBarry Smith {
5084ac538c5SBarry Smith   PetscErrorCode ierr;
5094b9ad928SBarry Smith 
5104b9ad928SBarry Smith   PetscFunctionBegin;
5110700a824SBarry Smith   PetscValidHeaderSpecific(pc,PC_CLASSID,1);
5124ac538c5SBarry Smith   ierr = PetscTryMethod(pc,"PCShellSetSetUp_C",(PC,PetscErrorCode (*)(PC)),(pc,setup));CHKERRQ(ierr);
5134b9ad928SBarry Smith   PetscFunctionReturn(0);
5144b9ad928SBarry Smith }
5154b9ad928SBarry Smith 
5164b9ad928SBarry Smith 
5174b9ad928SBarry Smith /*@C
5184b9ad928SBarry Smith    PCShellSetView - Sets routine to use as viewer of shell preconditioner
5194b9ad928SBarry Smith 
5203f9fe445SBarry Smith    Logically Collective on PC
5214b9ad928SBarry Smith 
5224b9ad928SBarry Smith    Input Parameters:
5234b9ad928SBarry Smith +  pc - the preconditioner context
5244b9ad928SBarry Smith -  view - the application-provided view routine
5254b9ad928SBarry Smith 
52653a7a830SPatrick Sanan    Calling sequence of view:
5274b9ad928SBarry Smith .vb
5286891c3e4SJed Brown    PetscErrorCode view(PC pc,PetscViewer v)
5294b9ad928SBarry Smith .ve
5304b9ad928SBarry Smith 
5316891c3e4SJed Brown +  pc - the preconditioner, get the application context with PCShellGetContext()
5324b9ad928SBarry Smith -  v   - viewer
5334b9ad928SBarry Smith 
53495452b02SPatrick Sanan    Notes:
53595452b02SPatrick Sanan     the function MUST return an error code of 0 on success and nonzero on failure.
5364aa34b0aSBarry Smith 
5374b9ad928SBarry Smith    Level: developer
5384b9ad928SBarry Smith 
5394b9ad928SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose()
5404b9ad928SBarry Smith @*/
5417087cfbeSBarry Smith PetscErrorCode  PCShellSetView(PC pc,PetscErrorCode (*view)(PC,PetscViewer))
5424b9ad928SBarry Smith {
5434ac538c5SBarry Smith   PetscErrorCode ierr;
5444b9ad928SBarry Smith 
5454b9ad928SBarry Smith   PetscFunctionBegin;
5460700a824SBarry Smith   PetscValidHeaderSpecific(pc,PC_CLASSID,1);
5474ac538c5SBarry Smith   ierr = PetscTryMethod(pc,"PCShellSetView_C",(PC,PetscErrorCode (*)(PC,PetscViewer)),(pc,view));CHKERRQ(ierr);
5484b9ad928SBarry Smith   PetscFunctionReturn(0);
5494b9ad928SBarry Smith }
5504b9ad928SBarry Smith 
5514b9ad928SBarry Smith /*@C
5524b9ad928SBarry Smith    PCShellSetApply - Sets routine to use as preconditioner.
5534b9ad928SBarry Smith 
5543f9fe445SBarry Smith    Logically Collective on PC
5554b9ad928SBarry Smith 
5564b9ad928SBarry Smith    Input Parameters:
5574b9ad928SBarry Smith +  pc - the preconditioner context
558be29d3c6SBarry Smith -  apply - the application-provided preconditioning routine
5594b9ad928SBarry Smith 
5604b9ad928SBarry Smith    Calling sequence of apply:
5614b9ad928SBarry Smith .vb
5626891c3e4SJed Brown    PetscErrorCode apply (PC pc,Vec xin,Vec xout)
5634b9ad928SBarry Smith .ve
5644b9ad928SBarry Smith 
5656891c3e4SJed Brown +  pc - the preconditioner, get the application context with PCShellGetContext()
5664b9ad928SBarry Smith .  xin - input vector
5674b9ad928SBarry Smith -  xout - output vector
5684b9ad928SBarry Smith 
56995452b02SPatrick Sanan    Notes:
57095452b02SPatrick Sanan     the function MUST return an error code of 0 on success and nonzero on failure.
5714aa34b0aSBarry Smith 
5724b9ad928SBarry Smith    Level: developer
5734b9ad928SBarry Smith 
574a4c07401SPatrick Sanan .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose(), PCShellSetContext(), PCShellSetApplyBA(), PCShellSetApplySymmetricRight(),PCShellSetApplySymmetricLeft()
5754b9ad928SBarry Smith @*/
5767087cfbeSBarry Smith PetscErrorCode  PCShellSetApply(PC pc,PetscErrorCode (*apply)(PC,Vec,Vec))
5774b9ad928SBarry Smith {
5784ac538c5SBarry Smith   PetscErrorCode ierr;
5794b9ad928SBarry Smith 
5804b9ad928SBarry Smith   PetscFunctionBegin;
5810700a824SBarry Smith   PetscValidHeaderSpecific(pc,PC_CLASSID,1);
5824ac538c5SBarry Smith   ierr = PetscTryMethod(pc,"PCShellSetApply_C",(PC,PetscErrorCode (*)(PC,Vec,Vec)),(pc,apply));CHKERRQ(ierr);
5834b9ad928SBarry Smith   PetscFunctionReturn(0);
5844b9ad928SBarry Smith }
5854b9ad928SBarry Smith 
5861b581b66SBarry Smith /*@C
587*7b6e2003SPierre Jolivet    PCShellSetApply - Sets routine to use as preconditioner on a block of vectors.
588*7b6e2003SPierre Jolivet 
589*7b6e2003SPierre Jolivet    Logically Collective on PC
590*7b6e2003SPierre Jolivet 
591*7b6e2003SPierre Jolivet    Input Parameters:
592*7b6e2003SPierre Jolivet +  pc - the preconditioner context
593*7b6e2003SPierre Jolivet -  apply - the application-provided preconditioning routine
594*7b6e2003SPierre Jolivet 
595*7b6e2003SPierre Jolivet    Calling sequence of apply:
596*7b6e2003SPierre Jolivet .vb
597*7b6e2003SPierre Jolivet    PetscErrorCode apply (PC pc,Mat Xin,Mat Xout)
598*7b6e2003SPierre Jolivet .ve
599*7b6e2003SPierre Jolivet 
600*7b6e2003SPierre Jolivet +  pc - the preconditioner, get the application context with PCShellGetContext()
601*7b6e2003SPierre Jolivet .  Xin - input block of vectors
602*7b6e2003SPierre Jolivet -  Xout - output block of vectors
603*7b6e2003SPierre Jolivet 
604*7b6e2003SPierre Jolivet    Notes:
605*7b6e2003SPierre Jolivet     the function MUST return an error code of 0 on success and nonzero on failure.
606*7b6e2003SPierre Jolivet 
607*7b6e2003SPierre Jolivet    Level: developer
608*7b6e2003SPierre Jolivet 
609*7b6e2003SPierre Jolivet .seealso: PCShellSetApply()
610*7b6e2003SPierre Jolivet @*/
611*7b6e2003SPierre Jolivet PetscErrorCode  PCShellSetMatApply(PC pc,PetscErrorCode (*matapply)(PC,Mat,Mat))
612*7b6e2003SPierre Jolivet {
613*7b6e2003SPierre Jolivet   PetscErrorCode ierr;
614*7b6e2003SPierre Jolivet 
615*7b6e2003SPierre Jolivet   PetscFunctionBegin;
616*7b6e2003SPierre Jolivet   PetscValidHeaderSpecific(pc,PC_CLASSID,1);
617*7b6e2003SPierre Jolivet   ierr = PetscTryMethod(pc,"PCShellSetMatApply_C",(PC,PetscErrorCode (*)(PC,Mat,Mat)),(pc,matapply));CHKERRQ(ierr);
618*7b6e2003SPierre Jolivet   PetscFunctionReturn(0);
619*7b6e2003SPierre Jolivet }
620*7b6e2003SPierre Jolivet 
621*7b6e2003SPierre Jolivet /*@C
6221b581b66SBarry Smith    PCShellSetApplySymmetricLeft - Sets routine to use as left preconditioner (when the PC_SYMMETRIC is used).
6231b581b66SBarry Smith 
6241b581b66SBarry Smith    Logically Collective on PC
6251b581b66SBarry Smith 
6261b581b66SBarry Smith    Input Parameters:
6271b581b66SBarry Smith +  pc - the preconditioner context
6281b581b66SBarry Smith -  apply - the application-provided left preconditioning routine
6291b581b66SBarry Smith 
6301b581b66SBarry Smith    Calling sequence of apply:
6311b581b66SBarry Smith .vb
6321b581b66SBarry Smith    PetscErrorCode apply (PC pc,Vec xin,Vec xout)
6331b581b66SBarry Smith .ve
6341b581b66SBarry Smith 
6351b581b66SBarry Smith +  pc - the preconditioner, get the application context with PCShellGetContext()
6361b581b66SBarry Smith .  xin - input vector
6371b581b66SBarry Smith -  xout - output vector
6381b581b66SBarry Smith 
63995452b02SPatrick Sanan    Notes:
64095452b02SPatrick Sanan     the function MUST return an error code of 0 on success and nonzero on failure.
6411b581b66SBarry Smith 
6421b581b66SBarry Smith    Level: developer
6431b581b66SBarry Smith 
6441b581b66SBarry Smith .seealso: PCShellSetApply(), PCShellSetApplySymmetricLeft(), PCShellSetSetUp(), PCShellSetApplyTranspose(), PCShellSetContext()
6451b581b66SBarry Smith @*/
6461b581b66SBarry Smith PetscErrorCode  PCShellSetApplySymmetricLeft(PC pc,PetscErrorCode (*apply)(PC,Vec,Vec))
6471b581b66SBarry Smith {
6481b581b66SBarry Smith   PetscErrorCode ierr;
6491b581b66SBarry Smith 
6501b581b66SBarry Smith   PetscFunctionBegin;
6511b581b66SBarry Smith   PetscValidHeaderSpecific(pc,PC_CLASSID,1);
6521b581b66SBarry Smith   ierr = PetscTryMethod(pc,"PCShellSetApplySymmetricLeft_C",(PC,PetscErrorCode (*)(PC,Vec,Vec)),(pc,apply));CHKERRQ(ierr);
6531b581b66SBarry Smith   PetscFunctionReturn(0);
6541b581b66SBarry Smith }
6551b581b66SBarry Smith 
6561b581b66SBarry Smith /*@C
657a4c07401SPatrick Sanan    PCShellSetApplySymmetricRight - Sets routine to use as right preconditioner (when the PC_SYMMETRIC is used).
6581b581b66SBarry Smith 
6591b581b66SBarry Smith    Logically Collective on PC
6601b581b66SBarry Smith 
6611b581b66SBarry Smith    Input Parameters:
6621b581b66SBarry Smith +  pc - the preconditioner context
6631b581b66SBarry Smith -  apply - the application-provided right preconditioning routine
6641b581b66SBarry Smith 
6651b581b66SBarry Smith    Calling sequence of apply:
6661b581b66SBarry Smith .vb
6671b581b66SBarry Smith    PetscErrorCode apply (PC pc,Vec xin,Vec xout)
6681b581b66SBarry Smith .ve
6691b581b66SBarry Smith 
6701b581b66SBarry Smith +  pc - the preconditioner, get the application context with PCShellGetContext()
6711b581b66SBarry Smith .  xin - input vector
6721b581b66SBarry Smith -  xout - output vector
6731b581b66SBarry Smith 
67495452b02SPatrick Sanan    Notes:
67595452b02SPatrick Sanan     the function MUST return an error code of 0 on success and nonzero on failure.
6761b581b66SBarry Smith 
6771b581b66SBarry Smith    Level: developer
6781b581b66SBarry Smith 
6791b581b66SBarry Smith .seealso: PCShellSetApply(), PCShellSetApplySymmetricLeft(), PCShellSetSetUp(), PCShellSetApplyTranspose(), PCShellSetContext()
6801b581b66SBarry Smith @*/
6811b581b66SBarry Smith PetscErrorCode  PCShellSetApplySymmetricRight(PC pc,PetscErrorCode (*apply)(PC,Vec,Vec))
6821b581b66SBarry Smith {
6831b581b66SBarry Smith   PetscErrorCode ierr;
6841b581b66SBarry Smith 
6851b581b66SBarry Smith   PetscFunctionBegin;
6861b581b66SBarry Smith   PetscValidHeaderSpecific(pc,PC_CLASSID,1);
6871b581b66SBarry Smith   ierr = PetscTryMethod(pc,"PCShellSetApplySymmetricRight_C",(PC,PetscErrorCode (*)(PC,Vec,Vec)),(pc,apply));CHKERRQ(ierr);
6881b581b66SBarry Smith   PetscFunctionReturn(0);
6891b581b66SBarry Smith }
6901b581b66SBarry Smith 
6912bb17772SBarry Smith /*@C
6922bb17772SBarry Smith    PCShellSetApplyBA - Sets routine to use as preconditioner times operator.
6932bb17772SBarry Smith 
6943f9fe445SBarry Smith    Logically Collective on PC
6952bb17772SBarry Smith 
6962bb17772SBarry Smith    Input Parameters:
6972bb17772SBarry Smith +  pc - the preconditioner context
6982bb17772SBarry Smith -  applyBA - the application-provided BA routine
6992bb17772SBarry Smith 
70053a7a830SPatrick Sanan    Calling sequence of applyBA:
7012bb17772SBarry Smith .vb
7026891c3e4SJed Brown    PetscErrorCode applyBA (PC pc,Vec xin,Vec xout)
7032bb17772SBarry Smith .ve
7042bb17772SBarry Smith 
7056891c3e4SJed Brown +  pc - the preconditioner, get the application context with PCShellGetContext()
7062bb17772SBarry Smith .  xin - input vector
7072bb17772SBarry Smith -  xout - output vector
7082bb17772SBarry Smith 
70995452b02SPatrick Sanan    Notes:
71095452b02SPatrick Sanan     the function MUST return an error code of 0 on success and nonzero on failure.
7114aa34b0aSBarry Smith 
7122bb17772SBarry Smith    Level: developer
7132bb17772SBarry Smith 
7142bb17772SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose(), PCShellSetContext(), PCShellSetApply()
7152bb17772SBarry Smith @*/
7167087cfbeSBarry Smith PetscErrorCode  PCShellSetApplyBA(PC pc,PetscErrorCode (*applyBA)(PC,PCSide,Vec,Vec,Vec))
7172bb17772SBarry Smith {
7184ac538c5SBarry Smith   PetscErrorCode ierr;
7192bb17772SBarry Smith 
7202bb17772SBarry Smith   PetscFunctionBegin;
7210700a824SBarry Smith   PetscValidHeaderSpecific(pc,PC_CLASSID,1);
7224ac538c5SBarry Smith   ierr = PetscTryMethod(pc,"PCShellSetApplyBA_C",(PC,PetscErrorCode (*)(PC,PCSide,Vec,Vec,Vec)),(pc,applyBA));CHKERRQ(ierr);
7232bb17772SBarry Smith   PetscFunctionReturn(0);
7242bb17772SBarry Smith }
7252bb17772SBarry Smith 
7264b9ad928SBarry Smith /*@C
7274b9ad928SBarry Smith    PCShellSetApplyTranspose - Sets routine to use as preconditioner transpose.
7284b9ad928SBarry Smith 
7293f9fe445SBarry Smith    Logically Collective on PC
7304b9ad928SBarry Smith 
7314b9ad928SBarry Smith    Input Parameters:
7324b9ad928SBarry Smith +  pc - the preconditioner context
7334b9ad928SBarry Smith -  apply - the application-provided preconditioning transpose routine
7344b9ad928SBarry Smith 
7354b9ad928SBarry Smith    Calling sequence of apply:
7364b9ad928SBarry Smith .vb
7376891c3e4SJed Brown    PetscErrorCode applytranspose (PC pc,Vec xin,Vec xout)
7384b9ad928SBarry Smith .ve
7394b9ad928SBarry Smith 
7406891c3e4SJed Brown +  pc - the preconditioner, get the application context with PCShellGetContext()
7414b9ad928SBarry Smith .  xin - input vector
7424b9ad928SBarry Smith -  xout - output vector
7434b9ad928SBarry Smith 
74495452b02SPatrick Sanan    Notes:
74595452b02SPatrick Sanan     the function MUST return an error code of 0 on success and nonzero on failure.
7464aa34b0aSBarry Smith 
7474b9ad928SBarry Smith    Level: developer
7484b9ad928SBarry Smith 
7494b9ad928SBarry Smith    Notes:
7504b9ad928SBarry Smith    Uses the same context variable as PCShellSetApply().
7514b9ad928SBarry Smith 
7522bb17772SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApply(), PCSetContext(), PCShellSetApplyBA()
7534b9ad928SBarry Smith @*/
7547087cfbeSBarry Smith PetscErrorCode  PCShellSetApplyTranspose(PC pc,PetscErrorCode (*applytranspose)(PC,Vec,Vec))
7554b9ad928SBarry Smith {
7564ac538c5SBarry Smith   PetscErrorCode ierr;
7574b9ad928SBarry Smith 
7584b9ad928SBarry Smith   PetscFunctionBegin;
7590700a824SBarry Smith   PetscValidHeaderSpecific(pc,PC_CLASSID,1);
7604ac538c5SBarry Smith   ierr = PetscTryMethod(pc,"PCShellSetApplyTranspose_C",(PC,PetscErrorCode (*)(PC,Vec,Vec)),(pc,applytranspose));CHKERRQ(ierr);
7614b9ad928SBarry Smith   PetscFunctionReturn(0);
7624b9ad928SBarry Smith }
7634b9ad928SBarry Smith 
7647cdd61b2SBarry Smith /*@C
7657cdd61b2SBarry Smith    PCShellSetPreSolve - Sets routine to apply to the operators/vectors before a KSPSolve() is
7667cdd61b2SBarry Smith       applied. This usually does something like scale the linear system in some application
7677cdd61b2SBarry Smith       specific way.
7687cdd61b2SBarry Smith 
7693f9fe445SBarry Smith    Logically Collective on PC
7707cdd61b2SBarry Smith 
7717cdd61b2SBarry Smith    Input Parameters:
7727cdd61b2SBarry Smith +  pc - the preconditioner context
7737cdd61b2SBarry Smith -  presolve - the application-provided presolve routine
7747cdd61b2SBarry Smith 
7757cdd61b2SBarry Smith    Calling sequence of presolve:
7767cdd61b2SBarry Smith .vb
7776891c3e4SJed Brown    PetscErrorCode presolve (PC,KSP ksp,Vec b,Vec x)
7787cdd61b2SBarry Smith .ve
7797cdd61b2SBarry Smith 
7806891c3e4SJed Brown +  pc - the preconditioner, get the application context with PCShellGetContext()
7817cdd61b2SBarry Smith .  xin - input vector
7827cdd61b2SBarry Smith -  xout - output vector
7837cdd61b2SBarry Smith 
78495452b02SPatrick Sanan    Notes:
78595452b02SPatrick Sanan     the function MUST return an error code of 0 on success and nonzero on failure.
7864aa34b0aSBarry Smith 
7877cdd61b2SBarry Smith    Level: developer
7887cdd61b2SBarry Smith 
789be29d3c6SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose(), PCShellSetPostSolve(), PCShellSetContext()
7907cdd61b2SBarry Smith @*/
7917087cfbeSBarry Smith PetscErrorCode  PCShellSetPreSolve(PC pc,PetscErrorCode (*presolve)(PC,KSP,Vec,Vec))
7927cdd61b2SBarry Smith {
7934ac538c5SBarry Smith   PetscErrorCode ierr;
7947cdd61b2SBarry Smith 
7957cdd61b2SBarry Smith   PetscFunctionBegin;
7960700a824SBarry Smith   PetscValidHeaderSpecific(pc,PC_CLASSID,1);
7974ac538c5SBarry Smith   ierr = PetscTryMethod(pc,"PCShellSetPreSolve_C",(PC,PetscErrorCode (*)(PC,KSP,Vec,Vec)),(pc,presolve));CHKERRQ(ierr);
7987cdd61b2SBarry Smith   PetscFunctionReturn(0);
7997cdd61b2SBarry Smith }
8007cdd61b2SBarry Smith 
8017cdd61b2SBarry Smith /*@C
8027cdd61b2SBarry Smith    PCShellSetPostSolve - Sets routine to apply to the operators/vectors before a KSPSolve() is
8037cdd61b2SBarry Smith       applied. This usually does something like scale the linear system in some application
8047cdd61b2SBarry Smith       specific way.
8057cdd61b2SBarry Smith 
8063f9fe445SBarry Smith    Logically Collective on PC
8077cdd61b2SBarry Smith 
8087cdd61b2SBarry Smith    Input Parameters:
8097cdd61b2SBarry Smith +  pc - the preconditioner context
8107cdd61b2SBarry Smith -  postsolve - the application-provided presolve routine
8117cdd61b2SBarry Smith 
8127cdd61b2SBarry Smith    Calling sequence of postsolve:
8137cdd61b2SBarry Smith .vb
8146891c3e4SJed Brown    PetscErrorCode postsolve(PC,KSP ksp,Vec b,Vec x)
8157cdd61b2SBarry Smith .ve
8167cdd61b2SBarry Smith 
8176891c3e4SJed Brown +  pc - the preconditioner, get the application context with PCShellGetContext()
8187cdd61b2SBarry Smith .  xin - input vector
8197cdd61b2SBarry Smith -  xout - output vector
8207cdd61b2SBarry Smith 
82195452b02SPatrick Sanan    Notes:
82295452b02SPatrick Sanan     the function MUST return an error code of 0 on success and nonzero on failure.
8234aa34b0aSBarry Smith 
8247cdd61b2SBarry Smith    Level: developer
8257cdd61b2SBarry Smith 
826be29d3c6SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose(), PCShellSetPreSolve(), PCShellSetContext()
8277cdd61b2SBarry Smith @*/
8287087cfbeSBarry Smith PetscErrorCode  PCShellSetPostSolve(PC pc,PetscErrorCode (*postsolve)(PC,KSP,Vec,Vec))
8297cdd61b2SBarry Smith {
8304ac538c5SBarry Smith   PetscErrorCode ierr;
8317cdd61b2SBarry Smith 
8327cdd61b2SBarry Smith   PetscFunctionBegin;
8330700a824SBarry Smith   PetscValidHeaderSpecific(pc,PC_CLASSID,1);
8344ac538c5SBarry Smith   ierr = PetscTryMethod(pc,"PCShellSetPostSolve_C",(PC,PetscErrorCode (*)(PC,KSP,Vec,Vec)),(pc,postsolve));CHKERRQ(ierr);
8357cdd61b2SBarry Smith   PetscFunctionReturn(0);
8367cdd61b2SBarry Smith }
8377cdd61b2SBarry Smith 
8384b9ad928SBarry Smith /*@C
8394b9ad928SBarry Smith    PCShellSetName - Sets an optional name to associate with a shell
8404b9ad928SBarry Smith    preconditioner.
8414b9ad928SBarry Smith 
8424b9ad928SBarry Smith    Not Collective
8434b9ad928SBarry Smith 
8444b9ad928SBarry Smith    Input Parameters:
8454b9ad928SBarry Smith +  pc - the preconditioner context
8464b9ad928SBarry Smith -  name - character string describing shell preconditioner
8474b9ad928SBarry Smith 
8484b9ad928SBarry Smith    Level: developer
8494b9ad928SBarry Smith 
8504b9ad928SBarry Smith .seealso: PCShellGetName()
8514b9ad928SBarry Smith @*/
8527087cfbeSBarry Smith PetscErrorCode  PCShellSetName(PC pc,const char name[])
8534b9ad928SBarry Smith {
8544ac538c5SBarry Smith   PetscErrorCode ierr;
8554b9ad928SBarry Smith 
8564b9ad928SBarry Smith   PetscFunctionBegin;
8570700a824SBarry Smith   PetscValidHeaderSpecific(pc,PC_CLASSID,1);
8584ac538c5SBarry Smith   ierr = PetscTryMethod(pc,"PCShellSetName_C",(PC,const char []),(pc,name));CHKERRQ(ierr);
8594b9ad928SBarry Smith   PetscFunctionReturn(0);
8604b9ad928SBarry Smith }
8614b9ad928SBarry Smith 
8624b9ad928SBarry Smith /*@C
8634b9ad928SBarry Smith    PCShellGetName - Gets an optional name that the user has set for a shell
8644b9ad928SBarry Smith    preconditioner.
8654b9ad928SBarry Smith 
8664b9ad928SBarry Smith    Not Collective
8674b9ad928SBarry Smith 
8684b9ad928SBarry Smith    Input Parameter:
8694b9ad928SBarry Smith .  pc - the preconditioner context
8704b9ad928SBarry Smith 
8714b9ad928SBarry Smith    Output Parameter:
8724b9ad928SBarry Smith .  name - character string describing shell preconditioner (you should not free this)
8734b9ad928SBarry Smith 
8744b9ad928SBarry Smith    Level: developer
8754b9ad928SBarry Smith 
8764b9ad928SBarry Smith .seealso: PCShellSetName()
8774b9ad928SBarry Smith @*/
878ccaf0856SBarry Smith PetscErrorCode  PCShellGetName(PC pc,const char *name[])
8794b9ad928SBarry Smith {
8804ac538c5SBarry Smith   PetscErrorCode ierr;
8814b9ad928SBarry Smith 
8824b9ad928SBarry Smith   PetscFunctionBegin;
8830700a824SBarry Smith   PetscValidHeaderSpecific(pc,PC_CLASSID,1);
8844482741eSBarry Smith   PetscValidPointer(name,2);
885ccaf0856SBarry Smith   ierr = PetscUseMethod(pc,"PCShellGetName_C",(PC,const char*[]),(pc,name));CHKERRQ(ierr);
8864b9ad928SBarry Smith   PetscFunctionReturn(0);
8874b9ad928SBarry Smith }
8884b9ad928SBarry Smith 
8894b9ad928SBarry Smith /*@C
8904b9ad928SBarry Smith    PCShellSetApplyRichardson - Sets routine to use as preconditioner
8914b9ad928SBarry Smith    in Richardson iteration.
8924b9ad928SBarry Smith 
8933f9fe445SBarry Smith    Logically Collective on PC
8944b9ad928SBarry Smith 
8954b9ad928SBarry Smith    Input Parameters:
8964b9ad928SBarry Smith +  pc - the preconditioner context
897be29d3c6SBarry Smith -  apply - the application-provided preconditioning routine
8984b9ad928SBarry Smith 
8994b9ad928SBarry Smith    Calling sequence of apply:
9004b9ad928SBarry Smith .vb
9016891c3e4SJed Brown    PetscErrorCode apply (PC pc,Vec b,Vec x,Vec r,PetscReal rtol,PetscReal abstol,PetscReal dtol,PetscInt maxits)
9024b9ad928SBarry Smith .ve
9034b9ad928SBarry Smith 
9046891c3e4SJed Brown +  pc - the preconditioner, get the application context with PCShellGetContext()
9054b9ad928SBarry Smith .  b - right-hand-side
9064b9ad928SBarry Smith .  x - current iterate
9074b9ad928SBarry Smith .  r - work space
9084b9ad928SBarry Smith .  rtol - relative tolerance of residual norm to stop at
90970441072SBarry Smith .  abstol - absolute tolerance of residual norm to stop at
9104b9ad928SBarry Smith .  dtol - if residual norm increases by this factor than return
9114b9ad928SBarry Smith -  maxits - number of iterations to run
9124b9ad928SBarry Smith 
91395452b02SPatrick Sanan    Notes:
91495452b02SPatrick Sanan     the function MUST return an error code of 0 on success and nonzero on failure.
9154aa34b0aSBarry Smith 
9164b9ad928SBarry Smith    Level: developer
9174b9ad928SBarry Smith 
918be29d3c6SBarry Smith .seealso: PCShellSetApply(), PCShellSetContext()
9194b9ad928SBarry Smith @*/
9207087cfbeSBarry Smith PetscErrorCode  PCShellSetApplyRichardson(PC pc,PetscErrorCode (*apply)(PC,Vec,Vec,Vec,PetscReal,PetscReal,PetscReal,PetscInt,PetscBool,PetscInt*,PCRichardsonConvergedReason*))
9214b9ad928SBarry Smith {
9224ac538c5SBarry Smith   PetscErrorCode ierr;
9234b9ad928SBarry Smith 
9244b9ad928SBarry Smith   PetscFunctionBegin;
9250700a824SBarry Smith   PetscValidHeaderSpecific(pc,PC_CLASSID,1);
9264ac538c5SBarry Smith   ierr = PetscTryMethod(pc,"PCShellSetApplyRichardson_C",(PC,PetscErrorCode (*)(PC,Vec,Vec,Vec,PetscReal,PetscReal,PetscReal,PetscInt,PetscBool,PetscInt*,PCRichardsonConvergedReason*)),(pc,apply));CHKERRQ(ierr);
9274b9ad928SBarry Smith   PetscFunctionReturn(0);
9284b9ad928SBarry Smith }
9294b9ad928SBarry Smith 
9304b9ad928SBarry Smith /*MC
9314b9ad928SBarry Smith    PCSHELL - Creates a new preconditioner class for use with your
9324b9ad928SBarry Smith               own private data storage format.
9334b9ad928SBarry Smith 
9344b9ad928SBarry Smith    Level: advanced
935e0bb08deSStefano Zampini 
9364b9ad928SBarry Smith   Usage:
9376891c3e4SJed Brown $             extern PetscErrorCode apply(PC,Vec,Vec);
9386891c3e4SJed Brown $             extern PetscErrorCode applyba(PC,PCSide,Vec,Vec,Vec);
9396891c3e4SJed Brown $             extern PetscErrorCode applytranspose(PC,Vec,Vec);
9406891c3e4SJed Brown $             extern PetscErrorCode setup(PC);
9416891c3e4SJed Brown $             extern PetscErrorCode destroy(PC);
9426891c3e4SJed Brown $
9434b9ad928SBarry Smith $             PCCreate(comm,&pc);
9444b9ad928SBarry Smith $             PCSetType(pc,PCSHELL);
945be29d3c6SBarry Smith $             PCShellSetContext(pc,ctx)
9466891c3e4SJed Brown $             PCShellSetApply(pc,apply);
9476891c3e4SJed Brown $             PCShellSetApplyBA(pc,applyba);               (optional)
9486891c3e4SJed Brown $             PCShellSetApplyTranspose(pc,applytranspose); (optional)
9494b9ad928SBarry Smith $             PCShellSetSetUp(pc,setup);                   (optional)
950d01c8aa3SLisandro Dalcin $             PCShellSetDestroy(pc,destroy);               (optional)
9514b9ad928SBarry Smith 
9524b9ad928SBarry Smith .seealso:  PCCreate(), PCSetType(), PCType (for list of available types), PC,
953fd2d0fe1Svictor            MATSHELL, PCShellSetSetUp(), PCShellSetApply(), PCShellSetView(),
954fd2d0fe1Svictor            PCShellSetApplyTranspose(), PCShellSetName(), PCShellSetApplyRichardson(),
9552bb17772SBarry Smith            PCShellGetName(), PCShellSetContext(), PCShellGetContext(), PCShellSetApplyBA()
9564b9ad928SBarry Smith M*/
9574b9ad928SBarry Smith 
9588cc058d9SJed Brown PETSC_EXTERN PetscErrorCode PCCreate_Shell(PC pc)
9594b9ad928SBarry Smith {
960dfbe8321SBarry Smith   PetscErrorCode ierr;
9614b9ad928SBarry Smith   PC_Shell       *shell;
9624b9ad928SBarry Smith 
9634b9ad928SBarry Smith   PetscFunctionBegin;
964b00a9115SJed Brown   ierr     = PetscNewLog(pc,&shell);CHKERRQ(ierr);
9654b9ad928SBarry Smith   pc->data = (void*)shell;
9664b9ad928SBarry Smith 
967d01c8aa3SLisandro Dalcin   pc->ops->destroy         = PCDestroy_Shell;
9684b9ad928SBarry Smith   pc->ops->view            = PCView_Shell;
969d01c8aa3SLisandro Dalcin   pc->ops->apply           = PCApply_Shell;
970*7b6e2003SPierre Jolivet   pc->ops->matapply        = PCMatApply_Shell;
9711b581b66SBarry Smith   pc->ops->applysymmetricleft  = PCApplySymmetricLeft_Shell;
9721b581b66SBarry Smith   pc->ops->applysymmetricright = PCApplySymmetricRight_Shell;
9730a545947SLisandro Dalcin   pc->ops->applytranspose  = NULL;
9740a545947SLisandro Dalcin   pc->ops->applyrichardson = NULL;
9750a545947SLisandro Dalcin   pc->ops->setup           = NULL;
9760a545947SLisandro Dalcin   pc->ops->presolve        = NULL;
9770a545947SLisandro Dalcin   pc->ops->postsolve       = NULL;
9784b9ad928SBarry Smith 
9790a545947SLisandro Dalcin   shell->apply          = NULL;
9800a545947SLisandro Dalcin   shell->applytranspose = NULL;
9810a545947SLisandro Dalcin   shell->name           = NULL;
9820a545947SLisandro Dalcin   shell->applyrich      = NULL;
9830a545947SLisandro Dalcin   shell->presolve       = NULL;
9840a545947SLisandro Dalcin   shell->postsolve      = NULL;
9850a545947SLisandro Dalcin   shell->ctx            = NULL;
9860a545947SLisandro Dalcin   shell->setup          = NULL;
9870a545947SLisandro Dalcin   shell->view           = NULL;
9880a545947SLisandro Dalcin   shell->destroy        = NULL;
9890a545947SLisandro Dalcin   shell->applysymmetricleft  = NULL;
9900a545947SLisandro Dalcin   shell->applysymmetricright = NULL;
9914b9ad928SBarry Smith 
992bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)pc,"PCShellSetDestroy_C",PCShellSetDestroy_Shell);CHKERRQ(ierr);
993bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)pc,"PCShellSetSetUp_C",PCShellSetSetUp_Shell);CHKERRQ(ierr);
994bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)pc,"PCShellSetApply_C",PCShellSetApply_Shell);CHKERRQ(ierr);
995*7b6e2003SPierre Jolivet   ierr = PetscObjectComposeFunction((PetscObject)pc,"PCShellSetMatApply_C",PCShellSetMatApply_Shell);CHKERRQ(ierr);
9961b581b66SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)pc,"PCShellSetApplySymmetricLeft_C",PCShellSetApplySymmetricLeft_Shell);CHKERRQ(ierr);
9971b581b66SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)pc,"PCShellSetApplySymmetricRight_C",PCShellSetApplySymmetricRight_Shell);CHKERRQ(ierr);
998bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)pc,"PCShellSetApplyBA_C",PCShellSetApplyBA_Shell);CHKERRQ(ierr);
999bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)pc,"PCShellSetPreSolve_C",PCShellSetPreSolve_Shell);CHKERRQ(ierr);
1000bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)pc,"PCShellSetPostSolve_C",PCShellSetPostSolve_Shell);CHKERRQ(ierr);
1001bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)pc,"PCShellSetView_C",PCShellSetView_Shell);CHKERRQ(ierr);
1002bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)pc,"PCShellSetApplyTranspose_C",PCShellSetApplyTranspose_Shell);CHKERRQ(ierr);
1003bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)pc,"PCShellSetName_C",PCShellSetName_Shell);CHKERRQ(ierr);
1004bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)pc,"PCShellGetName_C",PCShellGetName_Shell);CHKERRQ(ierr);
1005bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)pc,"PCShellSetApplyRichardson_C",PCShellSetApplyRichardson_Shell);CHKERRQ(ierr);
10064b9ad928SBarry Smith   PetscFunctionReturn(0);
10074b9ad928SBarry Smith }
1008