xref: /petsc/src/ksp/pc/impls/shell/shellpc.c (revision eb6b5d477c546811461f5fc75db01dea28730918)
1dba47a55SKris Buschelman #define PETSCKSP_DLL
2dba47a55SKris Buschelman 
34d0a8057SBarry Smith 
44b9ad928SBarry Smith /*
54b9ad928SBarry Smith    This provides a simple shell for Fortran (and C programmers) to
64b9ad928SBarry Smith   create their own preconditioner without writing much interface code.
74b9ad928SBarry Smith */
84b9ad928SBarry Smith 
96356e834SBarry Smith #include "private/pcimpl.h"        /*I "petscpc.h" I*/
101d8d5f9aSSatish Balay #include "private/vecimpl.h"
114b9ad928SBarry Smith 
12ac226902SBarry Smith EXTERN_C_BEGIN
134b9ad928SBarry Smith typedef struct {
14be29d3c6SBarry Smith   void           *ctx;                     /* user provided contexts for preconditioner */
156891c3e4SJed Brown   PetscErrorCode (*destroy)(PC);
166891c3e4SJed Brown   PetscErrorCode (*setup)(PC);
176891c3e4SJed Brown   PetscErrorCode (*apply)(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);
237319c654SBarry Smith   PetscErrorCode (*applyrich)(PC,Vec,Vec,Vec,PetscReal,PetscReal,PetscReal,PetscInt,PetscTruth,PetscInt*,PCRichardsonConvergedReason*);
244b9ad928SBarry Smith   char           *name;
254b9ad928SBarry Smith } PC_Shell;
26ac226902SBarry Smith EXTERN_C_END
274b9ad928SBarry Smith 
284b9ad928SBarry Smith #undef __FUNCT__
29be29d3c6SBarry Smith #define __FUNCT__ "PCShellGetContext"
30b29801fcSSatish Balay /*@C
31be29d3c6SBarry Smith     PCShellGetContext - Returns the user-provided context associated with a shell PC
32be29d3c6SBarry Smith 
33be29d3c6SBarry Smith     Not Collective
34be29d3c6SBarry Smith 
35be29d3c6SBarry Smith     Input Parameter:
36be29d3c6SBarry Smith .   pc - should have been created with PCCreateShell()
37be29d3c6SBarry Smith 
38be29d3c6SBarry Smith     Output Parameter:
39be29d3c6SBarry Smith .   ctx - the user provided context
40be29d3c6SBarry Smith 
41be29d3c6SBarry Smith     Level: advanced
42be29d3c6SBarry Smith 
43be29d3c6SBarry Smith     Notes:
44be29d3c6SBarry Smith     This routine is intended for use within various shell routines
45be29d3c6SBarry Smith 
46be29d3c6SBarry Smith .keywords: PC, shell, get, context
47be29d3c6SBarry Smith 
48be29d3c6SBarry Smith .seealso: PCCreateShell(), PCShellSetContext()
49be29d3c6SBarry Smith @*/
50be29d3c6SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellGetContext(PC pc,void **ctx)
51be29d3c6SBarry Smith {
52be29d3c6SBarry Smith   PetscErrorCode ierr;
53be29d3c6SBarry Smith   PetscTruth     flg;
54be29d3c6SBarry Smith 
55be29d3c6SBarry Smith   PetscFunctionBegin;
560700a824SBarry Smith   PetscValidHeaderSpecific(pc,PC_CLASSID,1);
57be29d3c6SBarry Smith   PetscValidPointer(ctx,2);
58be29d3c6SBarry Smith   ierr = PetscTypeCompare((PetscObject)pc,PCSHELL,&flg);CHKERRQ(ierr);
59be29d3c6SBarry Smith   if (!flg) *ctx = 0;
60be29d3c6SBarry Smith   else      *ctx = ((PC_Shell*)(pc->data))->ctx;
61be29d3c6SBarry Smith   PetscFunctionReturn(0);
62be29d3c6SBarry Smith }
63be29d3c6SBarry Smith 
64be29d3c6SBarry Smith #undef __FUNCT__
65be29d3c6SBarry Smith #define __FUNCT__ "PCShellSetContext"
669dd1005fSJed Brown /*@
67be29d3c6SBarry Smith     PCShellSetContext - sets the context for a shell PC
68be29d3c6SBarry Smith 
693f9fe445SBarry Smith    Logically Collective on PC
70be29d3c6SBarry Smith 
71be29d3c6SBarry Smith     Input Parameters:
72be29d3c6SBarry Smith +   pc - the shell PC
73be29d3c6SBarry Smith -   ctx - the context
74be29d3c6SBarry Smith 
75be29d3c6SBarry Smith    Level: advanced
76be29d3c6SBarry Smith 
77be29d3c6SBarry Smith    Fortran Notes: The context can only be an integer or a PetscObject
78be29d3c6SBarry Smith       unfortunately it cannot be a Fortran array or derived type.
79be29d3c6SBarry Smith 
806895c445SBarry Smith 
81be29d3c6SBarry Smith .seealso: PCCreateShell(), PCShellGetContext()
82be29d3c6SBarry Smith @*/
83be29d3c6SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetContext(PC pc,void *ctx)
84be29d3c6SBarry Smith {
85d01c8aa3SLisandro Dalcin   PC_Shell      *shell;
86be29d3c6SBarry Smith   PetscErrorCode ierr;
87be29d3c6SBarry Smith   PetscTruth     flg;
88be29d3c6SBarry Smith 
89be29d3c6SBarry Smith   PetscFunctionBegin;
900700a824SBarry Smith   PetscValidHeaderSpecific(pc,PC_CLASSID,1);
91d01c8aa3SLisandro Dalcin   shell = (PC_Shell*)pc->data;
92be29d3c6SBarry Smith   ierr = PetscTypeCompare((PetscObject)pc,PCSHELL,&flg);CHKERRQ(ierr);
93be29d3c6SBarry Smith   if (flg) {
94be29d3c6SBarry Smith     shell->ctx = ctx;
95be29d3c6SBarry Smith   }
96be29d3c6SBarry Smith   PetscFunctionReturn(0);
97be29d3c6SBarry Smith }
98be29d3c6SBarry Smith 
99be29d3c6SBarry Smith #undef __FUNCT__
10018be62a5SSatish Balay #define __FUNCT__ "PCSetUp_Shell"
1016849ba73SBarry Smith static PetscErrorCode PCSetUp_Shell(PC pc)
1024b9ad928SBarry Smith {
1034b9ad928SBarry Smith   PC_Shell       *shell;
104dfbe8321SBarry Smith   PetscErrorCode ierr;
1054b9ad928SBarry Smith 
1064b9ad928SBarry Smith   PetscFunctionBegin;
1074b9ad928SBarry Smith   shell = (PC_Shell*)pc->data;
108e7e72b3dSBarry Smith   if (!shell->setup) SETERRQ(((PetscObject)pc)->comm,PETSC_ERR_USER,"No setup() routine provided to Shell PC");
109*eb6b5d47SBarry Smith   PetscStackCall("PCSHELL user function setup()",ierr  = (*shell->setup)(pc);CHKERRQ(ierr));
1104b9ad928SBarry Smith   PetscFunctionReturn(0);
1114b9ad928SBarry Smith }
1124b9ad928SBarry Smith 
1134b9ad928SBarry Smith #undef __FUNCT__
1144b9ad928SBarry Smith #define __FUNCT__ "PCApply_Shell"
1156849ba73SBarry Smith static PetscErrorCode PCApply_Shell(PC pc,Vec x,Vec y)
1164b9ad928SBarry Smith {
1174b9ad928SBarry Smith   PC_Shell       *shell;
118dfbe8321SBarry Smith   PetscErrorCode ierr;
1194b9ad928SBarry Smith 
1204b9ad928SBarry Smith   PetscFunctionBegin;
1214b9ad928SBarry Smith   shell = (PC_Shell*)pc->data;
122e7e72b3dSBarry Smith   if (!shell->apply) SETERRQ(((PetscObject)pc)->comm,PETSC_ERR_USER,"No apply() routine provided to Shell PC");
123*eb6b5d47SBarry Smith   PetscStackCall("PCSHELL user function apply()",ierr = (*shell->apply)(pc,x,y);CHKERRQ(ierr));
1244b9ad928SBarry Smith   PetscFunctionReturn(0);
1254b9ad928SBarry Smith }
1264b9ad928SBarry Smith 
1274b9ad928SBarry Smith #undef __FUNCT__
1282bb17772SBarry Smith #define __FUNCT__ "PCApplyBA_Shell"
1292bb17772SBarry Smith static PetscErrorCode PCApplyBA_Shell(PC pc,PCSide side,Vec x,Vec y,Vec w)
1302bb17772SBarry Smith {
1312bb17772SBarry Smith   PC_Shell       *shell;
1322bb17772SBarry Smith   PetscErrorCode ierr;
1332bb17772SBarry Smith 
1342bb17772SBarry Smith   PetscFunctionBegin;
1352bb17772SBarry Smith   shell = (PC_Shell*)pc->data;
136e7e72b3dSBarry Smith   if (!shell->applyBA) SETERRQ(((PetscObject)pc)->comm,PETSC_ERR_USER,"No applyBA() routine provided to Shell PC");
137*eb6b5d47SBarry Smith   PetscStackCall("PCSHELL user function applyBA()",ierr  = (*shell->applyBA)(pc,side,x,y,w);CHKERRQ(ierr));
1382bb17772SBarry Smith   PetscFunctionReturn(0);
1392bb17772SBarry Smith }
1402bb17772SBarry Smith 
1412bb17772SBarry Smith #undef __FUNCT__
1427cdd61b2SBarry Smith #define __FUNCT__ "PCPreSolve_Shell"
1437cdd61b2SBarry Smith static PetscErrorCode PCPreSolve_Shell(PC pc,KSP ksp,Vec b,Vec x)
1447cdd61b2SBarry Smith {
1457cdd61b2SBarry Smith   PC_Shell       *shell;
1467cdd61b2SBarry Smith   PetscErrorCode ierr;
1477cdd61b2SBarry Smith 
1487cdd61b2SBarry Smith   PetscFunctionBegin;
1497cdd61b2SBarry Smith   shell = (PC_Shell*)pc->data;
150e7e72b3dSBarry Smith   if (!shell->presolve) SETERRQ(((PetscObject)pc)->comm,PETSC_ERR_USER,"No presolve() routine provided to Shell PC");
151*eb6b5d47SBarry Smith   PetscStackCall("PCSHELL user function presolve()",ierr  = (*shell->presolve)(pc,ksp,b,x);CHKERRQ(ierr));
1527cdd61b2SBarry Smith   PetscFunctionReturn(0);
1537cdd61b2SBarry Smith }
1547cdd61b2SBarry Smith 
1557cdd61b2SBarry Smith #undef __FUNCT__
1567cdd61b2SBarry Smith #define __FUNCT__ "PCPostSolve_Shell"
1577cdd61b2SBarry Smith static PetscErrorCode PCPostSolve_Shell(PC pc,KSP ksp,Vec b,Vec x)
1587cdd61b2SBarry Smith {
1597cdd61b2SBarry Smith   PC_Shell       *shell;
1607cdd61b2SBarry Smith   PetscErrorCode ierr;
1617cdd61b2SBarry Smith 
1627cdd61b2SBarry Smith   PetscFunctionBegin;
1637cdd61b2SBarry Smith   shell = (PC_Shell*)pc->data;
164e7e72b3dSBarry Smith   if (!shell->postsolve) SETERRQ(((PetscObject)pc)->comm,PETSC_ERR_USER,"No postsolve() routine provided to Shell PC");
165*eb6b5d47SBarry Smith   PetscStackCall("PCSHELL user function postsolve()",ierr  = (*shell->postsolve)(pc,ksp,b,x);CHKERRQ(ierr));
1667cdd61b2SBarry Smith   PetscFunctionReturn(0);
1677cdd61b2SBarry Smith }
1687cdd61b2SBarry Smith 
1697cdd61b2SBarry Smith #undef __FUNCT__
1704b9ad928SBarry Smith #define __FUNCT__ "PCApplyTranspose_Shell"
1716849ba73SBarry Smith static PetscErrorCode PCApplyTranspose_Shell(PC pc,Vec x,Vec y)
1724b9ad928SBarry Smith {
1734b9ad928SBarry Smith   PC_Shell       *shell;
174dfbe8321SBarry Smith   PetscErrorCode ierr;
1754b9ad928SBarry Smith 
1764b9ad928SBarry Smith   PetscFunctionBegin;
1774b9ad928SBarry Smith   shell = (PC_Shell*)pc->data;
178e7e72b3dSBarry Smith   if (!shell->applytranspose) SETERRQ(((PetscObject)pc)->comm,PETSC_ERR_USER,"No applytranspose() routine provided to Shell PC");
179*eb6b5d47SBarry Smith   PetscStackCall("PCSHELL user function applytranspose()",ierr  = (*shell->applytranspose)(pc,x,y);CHKERRQ(ierr));
1804b9ad928SBarry Smith   PetscFunctionReturn(0);
1814b9ad928SBarry Smith }
1824b9ad928SBarry Smith 
1834b9ad928SBarry Smith #undef __FUNCT__
1844b9ad928SBarry Smith #define __FUNCT__ "PCApplyRichardson_Shell"
1857319c654SBarry Smith static PetscErrorCode PCApplyRichardson_Shell(PC pc,Vec x,Vec y,Vec w,PetscReal rtol,PetscReal abstol, PetscReal dtol,PetscInt it,PetscTruth guesszero,PetscInt *outits,PCRichardsonConvergedReason *reason)
1864b9ad928SBarry Smith {
187dfbe8321SBarry Smith   PetscErrorCode ierr;
1884b9ad928SBarry Smith   PC_Shell       *shell;
1894b9ad928SBarry Smith 
1904b9ad928SBarry Smith   PetscFunctionBegin;
1914b9ad928SBarry Smith   shell = (PC_Shell*)pc->data;
192e7e72b3dSBarry Smith   if (!shell->applyrich) SETERRQ(((PetscObject)pc)->comm,PETSC_ERR_USER,"No applyrichardson() routine provided to Shell PC");
193*eb6b5d47SBarry Smith   PetscStackCall("PCSHELL user function applyrichardson()",ierr  = (*shell->applyrich)(pc,x,y,w,rtol,abstol,dtol,it,guesszero,outits,reason);CHKERRQ(ierr));
1944b9ad928SBarry Smith   PetscFunctionReturn(0);
1954b9ad928SBarry Smith }
1964b9ad928SBarry Smith 
1974b9ad928SBarry Smith #undef __FUNCT__
1984b9ad928SBarry Smith #define __FUNCT__ "PCDestroy_Shell"
1996849ba73SBarry Smith static PetscErrorCode PCDestroy_Shell(PC pc)
2004b9ad928SBarry Smith {
2014b9ad928SBarry Smith   PC_Shell       *shell = (PC_Shell*)pc->data;
202dfbe8321SBarry Smith   PetscErrorCode ierr;
2034b9ad928SBarry Smith 
2044b9ad928SBarry Smith   PetscFunctionBegin;
205503cfb0cSBarry Smith   ierr = PetscFree(shell->name);CHKERRQ(ierr);
20618be62a5SSatish Balay   if (shell->destroy) {
207*eb6b5d47SBarry Smith     PetscStackCall("PCSHELL user function destroy()",ierr  = (*shell->destroy)(pc);CHKERRQ(ierr));
20818be62a5SSatish Balay   }
2094b9ad928SBarry Smith   ierr = PetscFree(shell);CHKERRQ(ierr);
2104b9ad928SBarry Smith   PetscFunctionReturn(0);
2114b9ad928SBarry Smith }
2124b9ad928SBarry Smith 
2134b9ad928SBarry Smith #undef __FUNCT__
2144b9ad928SBarry Smith #define __FUNCT__ "PCView_Shell"
2156849ba73SBarry Smith static PetscErrorCode PCView_Shell(PC pc,PetscViewer viewer)
2164b9ad928SBarry Smith {
2174b9ad928SBarry Smith   PC_Shell       *shell = (PC_Shell*)pc->data;
218dfbe8321SBarry Smith   PetscErrorCode ierr;
21932077d6dSBarry Smith   PetscTruth     iascii;
2204b9ad928SBarry Smith 
2214b9ad928SBarry Smith   PetscFunctionBegin;
2222692d6eeSBarry Smith   ierr = PetscTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
22332077d6dSBarry Smith   if (iascii) {
2244b9ad928SBarry Smith     if (shell->name) {ierr = PetscViewerASCIIPrintf(viewer,"  Shell: %s\n",shell->name);CHKERRQ(ierr);}
2254b9ad928SBarry Smith     else             {ierr = PetscViewerASCIIPrintf(viewer,"  Shell: no name\n");CHKERRQ(ierr);}
2264b9ad928SBarry Smith   }
2274b9ad928SBarry Smith   if (shell->view) {
2284b9ad928SBarry Smith     ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
2296891c3e4SJed Brown     ierr  = (*shell->view)(pc,viewer);CHKERRQ(ierr);
2304b9ad928SBarry Smith     ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
2314b9ad928SBarry Smith   }
2324b9ad928SBarry Smith   PetscFunctionReturn(0);
2334b9ad928SBarry Smith }
2344b9ad928SBarry Smith 
2354b9ad928SBarry Smith /* ------------------------------------------------------------------------------*/
2364b9ad928SBarry Smith EXTERN_C_BEGIN
2374b9ad928SBarry Smith #undef __FUNCT__
23818be62a5SSatish Balay #define __FUNCT__ "PCShellSetDestroy_Shell"
2396891c3e4SJed Brown PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetDestroy_Shell(PC pc, PetscErrorCode (*destroy)(PC))
24018be62a5SSatish Balay {
24118be62a5SSatish Balay   PC_Shell *shell;
24218be62a5SSatish Balay 
24318be62a5SSatish Balay   PetscFunctionBegin;
24418be62a5SSatish Balay   shell          = (PC_Shell*)pc->data;
24518be62a5SSatish Balay   shell->destroy = destroy;
24618be62a5SSatish Balay   PetscFunctionReturn(0);
24718be62a5SSatish Balay }
24818be62a5SSatish Balay EXTERN_C_END
24918be62a5SSatish Balay 
25018be62a5SSatish Balay EXTERN_C_BEGIN
25118be62a5SSatish Balay #undef __FUNCT__
2524b9ad928SBarry Smith #define __FUNCT__ "PCShellSetSetUp_Shell"
2536891c3e4SJed Brown PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetSetUp_Shell(PC pc, PetscErrorCode (*setup)(PC))
2544b9ad928SBarry Smith {
2554b9ad928SBarry Smith   PC_Shell *shell;
2564b9ad928SBarry Smith 
2574b9ad928SBarry Smith   PetscFunctionBegin;
2584b9ad928SBarry Smith   shell        = (PC_Shell*)pc->data;
2594b9ad928SBarry Smith   shell->setup = setup;
260d01c8aa3SLisandro Dalcin   if (setup) pc->ops->setup = PCSetUp_Shell;
261d01c8aa3SLisandro Dalcin   else       pc->ops->setup = 0;
2624b9ad928SBarry Smith   PetscFunctionReturn(0);
2634b9ad928SBarry Smith }
2644b9ad928SBarry Smith EXTERN_C_END
2654b9ad928SBarry Smith 
2664b9ad928SBarry Smith EXTERN_C_BEGIN
2674b9ad928SBarry Smith #undef __FUNCT__
2684b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApply_Shell"
2696891c3e4SJed Brown PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApply_Shell(PC pc,PetscErrorCode (*apply)(PC,Vec,Vec))
2704b9ad928SBarry Smith {
2714b9ad928SBarry Smith   PC_Shell *shell;
2724b9ad928SBarry Smith 
2734b9ad928SBarry Smith   PetscFunctionBegin;
2744b9ad928SBarry Smith   shell        = (PC_Shell*)pc->data;
2754b9ad928SBarry Smith   shell->apply = apply;
2764b9ad928SBarry Smith   PetscFunctionReturn(0);
2774b9ad928SBarry Smith }
2784b9ad928SBarry Smith EXTERN_C_END
2794b9ad928SBarry Smith 
2804b9ad928SBarry Smith EXTERN_C_BEGIN
2814b9ad928SBarry Smith #undef __FUNCT__
2822bb17772SBarry Smith #define __FUNCT__ "PCShellSetApplyBA_Shell"
2836891c3e4SJed Brown PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApplyBA_Shell(PC pc,PetscErrorCode (*applyBA)(PC,PCSide,Vec,Vec,Vec))
2842bb17772SBarry Smith {
2852bb17772SBarry Smith   PC_Shell *shell;
2862bb17772SBarry Smith 
2872bb17772SBarry Smith   PetscFunctionBegin;
2882bb17772SBarry Smith   shell          = (PC_Shell*)pc->data;
289d01c8aa3SLisandro Dalcin   shell->applyBA = applyBA;
290d01c8aa3SLisandro Dalcin   if (applyBA) pc->ops->applyBA  = PCApplyBA_Shell;
291aef0136fSBarry Smith   else         pc->ops->applyBA  = 0;
2922bb17772SBarry Smith   PetscFunctionReturn(0);
2932bb17772SBarry Smith }
2942bb17772SBarry Smith EXTERN_C_END
2952bb17772SBarry Smith 
2962bb17772SBarry Smith EXTERN_C_BEGIN
2972bb17772SBarry Smith #undef __FUNCT__
2987cdd61b2SBarry Smith #define __FUNCT__ "PCShellSetPreSolve_Shell"
2996891c3e4SJed Brown PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetPreSolve_Shell(PC pc,PetscErrorCode (*presolve)(PC,KSP,Vec,Vec))
3007cdd61b2SBarry Smith {
3017cdd61b2SBarry Smith   PC_Shell *shell;
3027cdd61b2SBarry Smith 
3037cdd61b2SBarry Smith   PetscFunctionBegin;
3047cdd61b2SBarry Smith   shell           = (PC_Shell*)pc->data;
3057cdd61b2SBarry Smith   shell->presolve = presolve;
306d01c8aa3SLisandro Dalcin   if (presolve) pc->ops->presolve = PCPreSolve_Shell;
307d01c8aa3SLisandro Dalcin   else          pc->ops->presolve = 0;
3087cdd61b2SBarry Smith   PetscFunctionReturn(0);
3097cdd61b2SBarry Smith }
3107cdd61b2SBarry Smith EXTERN_C_END
3117cdd61b2SBarry Smith 
3127cdd61b2SBarry Smith EXTERN_C_BEGIN
3137cdd61b2SBarry Smith #undef __FUNCT__
3147cdd61b2SBarry Smith #define __FUNCT__ "PCShellSetPostSolve_Shell"
3156891c3e4SJed Brown PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetPostSolve_Shell(PC pc,PetscErrorCode (*postsolve)(PC,KSP,Vec,Vec))
3167cdd61b2SBarry Smith {
3177cdd61b2SBarry Smith   PC_Shell *shell;
3187cdd61b2SBarry Smith 
3197cdd61b2SBarry Smith   PetscFunctionBegin;
3207cdd61b2SBarry Smith   shell            = (PC_Shell*)pc->data;
3217cdd61b2SBarry Smith   shell->postsolve = postsolve;
322d01c8aa3SLisandro Dalcin   if (postsolve) pc->ops->postsolve = PCPostSolve_Shell;
323d01c8aa3SLisandro Dalcin   else           pc->ops->postsolve = 0;
3247cdd61b2SBarry Smith   PetscFunctionReturn(0);
3257cdd61b2SBarry Smith }
3267cdd61b2SBarry Smith EXTERN_C_END
3277cdd61b2SBarry Smith 
3287cdd61b2SBarry Smith EXTERN_C_BEGIN
3297cdd61b2SBarry Smith #undef __FUNCT__
3304b9ad928SBarry Smith #define __FUNCT__ "PCShellSetView_Shell"
3316891c3e4SJed Brown PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetView_Shell(PC pc,PetscErrorCode (*view)(PC,PetscViewer))
3324b9ad928SBarry Smith {
3334b9ad928SBarry Smith   PC_Shell *shell;
3344b9ad928SBarry Smith 
3354b9ad928SBarry Smith   PetscFunctionBegin;
3364b9ad928SBarry Smith   shell        = (PC_Shell*)pc->data;
3374b9ad928SBarry Smith   shell->view = view;
3384b9ad928SBarry Smith   PetscFunctionReturn(0);
3394b9ad928SBarry Smith }
3404b9ad928SBarry Smith EXTERN_C_END
3414b9ad928SBarry Smith 
3424b9ad928SBarry Smith EXTERN_C_BEGIN
3434b9ad928SBarry Smith #undef __FUNCT__
3444b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApplyTranspose_Shell"
3456891c3e4SJed Brown PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApplyTranspose_Shell(PC pc,PetscErrorCode (*applytranspose)(PC,Vec,Vec))
3464b9ad928SBarry Smith {
3474b9ad928SBarry Smith   PC_Shell *shell;
3484b9ad928SBarry Smith 
3494b9ad928SBarry Smith   PetscFunctionBegin;
3504b9ad928SBarry Smith   shell                 = (PC_Shell*)pc->data;
3514b9ad928SBarry Smith   shell->applytranspose = applytranspose;
352d01c8aa3SLisandro Dalcin   if (applytranspose) pc->ops->applytranspose = PCApplyTranspose_Shell;
353d01c8aa3SLisandro Dalcin   else                pc->ops->applytranspose = 0;
354d01c8aa3SLisandro Dalcin   PetscFunctionReturn(0);
355d01c8aa3SLisandro Dalcin }
356d01c8aa3SLisandro Dalcin EXTERN_C_END
357d01c8aa3SLisandro Dalcin 
358d01c8aa3SLisandro Dalcin EXTERN_C_BEGIN
359d01c8aa3SLisandro Dalcin #undef __FUNCT__
360d01c8aa3SLisandro Dalcin #define __FUNCT__ "PCShellSetApplyRichardson_Shell"
3617319c654SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApplyRichardson_Shell(PC pc,PetscErrorCode (*applyrich)(PC,Vec,Vec,Vec,PetscReal,PetscReal,PetscReal,PetscInt,PetscTruth,PetscInt*,PCRichardsonConvergedReason*))
362d01c8aa3SLisandro Dalcin {
363d01c8aa3SLisandro Dalcin   PC_Shell *shell;
364d01c8aa3SLisandro Dalcin 
365d01c8aa3SLisandro Dalcin   PetscFunctionBegin;
366d01c8aa3SLisandro Dalcin   shell            = (PC_Shell*)pc->data;
367d01c8aa3SLisandro Dalcin   shell->applyrich = applyrich;
368d01c8aa3SLisandro Dalcin   if (applyrich) pc->ops->applyrichardson  = PCApplyRichardson_Shell;
369d01c8aa3SLisandro Dalcin   else           pc->ops->applyrichardson  = 0;
3704b9ad928SBarry Smith   PetscFunctionReturn(0);
3714b9ad928SBarry Smith }
3724b9ad928SBarry Smith EXTERN_C_END
3734b9ad928SBarry Smith 
3744b9ad928SBarry Smith EXTERN_C_BEGIN
3754b9ad928SBarry Smith #undef __FUNCT__
3764b9ad928SBarry Smith #define __FUNCT__ "PCShellSetName_Shell"
377dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetName_Shell(PC pc,const char name[])
3784b9ad928SBarry Smith {
3794b9ad928SBarry Smith   PC_Shell       *shell;
380dfbe8321SBarry Smith   PetscErrorCode ierr;
3814b9ad928SBarry Smith 
3824b9ad928SBarry Smith   PetscFunctionBegin;
3834b9ad928SBarry Smith   shell = (PC_Shell*)pc->data;
384503cfb0cSBarry Smith   ierr = PetscFree(shell->name);CHKERRQ(ierr);
3854b9ad928SBarry Smith   ierr = PetscStrallocpy(name,&shell->name);CHKERRQ(ierr);
3864b9ad928SBarry Smith   PetscFunctionReturn(0);
3874b9ad928SBarry Smith }
3884b9ad928SBarry Smith EXTERN_C_END
3894b9ad928SBarry Smith 
3904b9ad928SBarry Smith EXTERN_C_BEGIN
3914b9ad928SBarry Smith #undef __FUNCT__
3924b9ad928SBarry Smith #define __FUNCT__ "PCShellGetName_Shell"
393dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellGetName_Shell(PC pc,char *name[])
3944b9ad928SBarry Smith {
3954b9ad928SBarry Smith   PC_Shell *shell;
3964b9ad928SBarry Smith 
3974b9ad928SBarry Smith   PetscFunctionBegin;
3984b9ad928SBarry Smith   shell  = (PC_Shell*)pc->data;
3994b9ad928SBarry Smith   *name  = shell->name;
4004b9ad928SBarry Smith   PetscFunctionReturn(0);
4014b9ad928SBarry Smith }
4024b9ad928SBarry Smith EXTERN_C_END
4034b9ad928SBarry Smith 
4044b9ad928SBarry Smith /* -------------------------------------------------------------------------------*/
4054b9ad928SBarry Smith 
4064b9ad928SBarry Smith #undef __FUNCT__
40718be62a5SSatish Balay #define __FUNCT__ "PCShellSetDestroy"
40818be62a5SSatish Balay /*@C
40918be62a5SSatish Balay    PCShellSetDestroy - Sets routine to use to destroy the user-provided
41018be62a5SSatish Balay    application context.
41118be62a5SSatish Balay 
4123f9fe445SBarry Smith    Logically Collective on PC
41318be62a5SSatish Balay 
41418be62a5SSatish Balay    Input Parameters:
41518be62a5SSatish Balay +  pc - the preconditioner context
41618be62a5SSatish Balay .  destroy - the application-provided destroy routine
41718be62a5SSatish Balay 
41818be62a5SSatish Balay    Calling sequence of destroy:
41918be62a5SSatish Balay .vb
4206891c3e4SJed Brown    PetscErrorCode destroy (PC)
42118be62a5SSatish Balay .ve
42218be62a5SSatish Balay 
42318be62a5SSatish Balay .  ptr - the application context
42418be62a5SSatish Balay 
4254aa34b0aSBarry Smith    Notes: the function MUST return an error code of 0 on success and nonzero on failure.
4264aa34b0aSBarry Smith 
42718be62a5SSatish Balay    Level: developer
42818be62a5SSatish Balay 
42918be62a5SSatish Balay .keywords: PC, shell, set, destroy, user-provided
43018be62a5SSatish Balay 
43118be62a5SSatish Balay .seealso: PCShellSetApply(), PCShellSetContext()
43218be62a5SSatish Balay @*/
4336891c3e4SJed Brown PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetDestroy(PC pc,PetscErrorCode (*destroy)(PC))
43418be62a5SSatish Balay {
4356891c3e4SJed Brown   PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(PC));
43618be62a5SSatish Balay 
43718be62a5SSatish Balay   PetscFunctionBegin;
4380700a824SBarry Smith   PetscValidHeaderSpecific(pc,PC_CLASSID,1);
43918be62a5SSatish Balay   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetDestroy_C",(void (**)(void))&f);CHKERRQ(ierr);
44018be62a5SSatish Balay   if (f) {
44118be62a5SSatish Balay     ierr = (*f)(pc,destroy);CHKERRQ(ierr);
44218be62a5SSatish Balay   }
44318be62a5SSatish Balay   PetscFunctionReturn(0);
44418be62a5SSatish Balay }
44518be62a5SSatish Balay 
44618be62a5SSatish Balay 
44718be62a5SSatish Balay #undef __FUNCT__
4484b9ad928SBarry Smith #define __FUNCT__ "PCShellSetSetUp"
4494b9ad928SBarry Smith /*@C
4504b9ad928SBarry Smith    PCShellSetSetUp - Sets routine to use to "setup" the preconditioner whenever the
4514b9ad928SBarry Smith    matrix operator is changed.
4524b9ad928SBarry Smith 
4533f9fe445SBarry Smith    Logically Collective on PC
4544b9ad928SBarry Smith 
4554b9ad928SBarry Smith    Input Parameters:
4564b9ad928SBarry Smith +  pc - the preconditioner context
4574b9ad928SBarry Smith .  setup - the application-provided setup routine
4584b9ad928SBarry Smith 
4594b9ad928SBarry Smith    Calling sequence of setup:
4604b9ad928SBarry Smith .vb
4616891c3e4SJed Brown    PetscErrorCode setup (PC pc)
4624b9ad928SBarry Smith .ve
4634b9ad928SBarry Smith 
4646891c3e4SJed Brown .  pc - the preconditioner, get the application context with PCShellGetContext()
4654b9ad928SBarry Smith 
4664aa34b0aSBarry Smith    Notes: the function MUST return an error code of 0 on success and nonzero on failure.
4674aa34b0aSBarry Smith 
4684b9ad928SBarry Smith    Level: developer
4694b9ad928SBarry Smith 
4704b9ad928SBarry Smith .keywords: PC, shell, set, setup, user-provided
4714b9ad928SBarry Smith 
472be29d3c6SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetApply(), PCShellSetContext()
4734b9ad928SBarry Smith @*/
4746891c3e4SJed Brown PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetSetUp(PC pc,PetscErrorCode (*setup)(PC))
4754b9ad928SBarry Smith {
4766891c3e4SJed Brown   PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(PC));
4774b9ad928SBarry Smith 
4784b9ad928SBarry Smith   PetscFunctionBegin;
4790700a824SBarry Smith   PetscValidHeaderSpecific(pc,PC_CLASSID,1);
4804b9ad928SBarry Smith   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetSetUp_C",(void (**)(void))&f);CHKERRQ(ierr);
4814b9ad928SBarry Smith   if (f) {
4824b9ad928SBarry Smith     ierr = (*f)(pc,setup);CHKERRQ(ierr);
4834b9ad928SBarry Smith   }
4844b9ad928SBarry Smith   PetscFunctionReturn(0);
4854b9ad928SBarry Smith }
4864b9ad928SBarry Smith 
4874b9ad928SBarry Smith 
4884b9ad928SBarry Smith #undef __FUNCT__
4894b9ad928SBarry Smith #define __FUNCT__ "PCShellSetView"
4904b9ad928SBarry Smith /*@C
4914b9ad928SBarry Smith    PCShellSetView - Sets routine to use as viewer of shell preconditioner
4924b9ad928SBarry Smith 
4933f9fe445SBarry Smith    Logically Collective on PC
4944b9ad928SBarry Smith 
4954b9ad928SBarry Smith    Input Parameters:
4964b9ad928SBarry Smith +  pc - the preconditioner context
4974b9ad928SBarry Smith -  view - the application-provided view routine
4984b9ad928SBarry Smith 
4994b9ad928SBarry Smith    Calling sequence of apply:
5004b9ad928SBarry Smith .vb
5016891c3e4SJed Brown    PetscErrorCode view(PC pc,PetscViewer v)
5024b9ad928SBarry Smith .ve
5034b9ad928SBarry Smith 
5046891c3e4SJed Brown +  pc - the preconditioner, get the application context with PCShellGetContext()
5054b9ad928SBarry Smith -  v   - viewer
5064b9ad928SBarry Smith 
5074aa34b0aSBarry Smith    Notes: the function MUST return an error code of 0 on success and nonzero on failure.
5084aa34b0aSBarry Smith 
5094b9ad928SBarry Smith    Level: developer
5104b9ad928SBarry Smith 
5114b9ad928SBarry Smith .keywords: PC, shell, set, apply, user-provided
5124b9ad928SBarry Smith 
5134b9ad928SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose()
5144b9ad928SBarry Smith @*/
5156891c3e4SJed Brown PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetView(PC pc,PetscErrorCode (*view)(PC,PetscViewer))
5164b9ad928SBarry Smith {
5176891c3e4SJed Brown   PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(PC,PetscViewer));
5184b9ad928SBarry Smith 
5194b9ad928SBarry Smith   PetscFunctionBegin;
5200700a824SBarry Smith   PetscValidHeaderSpecific(pc,PC_CLASSID,1);
5214b9ad928SBarry Smith   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetView_C",(void (**)(void))&f);CHKERRQ(ierr);
5224b9ad928SBarry Smith   if (f) {
5234b9ad928SBarry Smith     ierr = (*f)(pc,view);CHKERRQ(ierr);
5244b9ad928SBarry Smith   }
5254b9ad928SBarry Smith   PetscFunctionReturn(0);
5264b9ad928SBarry Smith }
5274b9ad928SBarry Smith 
5284b9ad928SBarry Smith #undef __FUNCT__
5294b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApply"
5304b9ad928SBarry Smith /*@C
5314b9ad928SBarry Smith    PCShellSetApply - Sets routine to use as preconditioner.
5324b9ad928SBarry Smith 
5333f9fe445SBarry Smith    Logically Collective on PC
5344b9ad928SBarry Smith 
5354b9ad928SBarry Smith    Input Parameters:
5364b9ad928SBarry Smith +  pc - the preconditioner context
537be29d3c6SBarry Smith -  apply - the application-provided preconditioning routine
5384b9ad928SBarry Smith 
5394b9ad928SBarry Smith    Calling sequence of apply:
5404b9ad928SBarry Smith .vb
5416891c3e4SJed Brown    PetscErrorCode apply (PC pc,Vec xin,Vec xout)
5424b9ad928SBarry Smith .ve
5434b9ad928SBarry Smith 
5446891c3e4SJed Brown +  pc - the preconditioner, get the application context with PCShellGetContext()
5454b9ad928SBarry Smith .  xin - input vector
5464b9ad928SBarry Smith -  xout - output vector
5474b9ad928SBarry Smith 
5484aa34b0aSBarry Smith    Notes: the function MUST return an error code of 0 on success and nonzero on failure.
5494aa34b0aSBarry Smith 
5504b9ad928SBarry Smith    Level: developer
5514b9ad928SBarry Smith 
5524b9ad928SBarry Smith .keywords: PC, shell, set, apply, user-provided
5534b9ad928SBarry Smith 
5542bb17772SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose(), PCShellSetContext(), PCShellSetApplyBA()
5554b9ad928SBarry Smith @*/
5566891c3e4SJed Brown PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApply(PC pc,PetscErrorCode (*apply)(PC,Vec,Vec))
5574b9ad928SBarry Smith {
5586891c3e4SJed Brown   PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(PC,Vec,Vec));
5594b9ad928SBarry Smith 
5604b9ad928SBarry Smith   PetscFunctionBegin;
5610700a824SBarry Smith   PetscValidHeaderSpecific(pc,PC_CLASSID,1);
5624b9ad928SBarry Smith   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetApply_C",(void (**)(void))&f);CHKERRQ(ierr);
5634b9ad928SBarry Smith   if (f) {
564be29d3c6SBarry Smith     ierr = (*f)(pc,apply);CHKERRQ(ierr);
5654b9ad928SBarry Smith   }
5664b9ad928SBarry Smith   PetscFunctionReturn(0);
5674b9ad928SBarry Smith }
5684b9ad928SBarry Smith 
5694b9ad928SBarry Smith #undef __FUNCT__
5702bb17772SBarry Smith #define __FUNCT__ "PCShellSetApplyBA"
5712bb17772SBarry Smith /*@C
5722bb17772SBarry Smith    PCShellSetApplyBA - Sets routine to use as preconditioner times operator.
5732bb17772SBarry Smith 
5743f9fe445SBarry Smith    Logically Collective on PC
5752bb17772SBarry Smith 
5762bb17772SBarry Smith    Input Parameters:
5772bb17772SBarry Smith +  pc - the preconditioner context
5782bb17772SBarry Smith -  applyBA - the application-provided BA routine
5792bb17772SBarry Smith 
5802bb17772SBarry Smith    Calling sequence of apply:
5812bb17772SBarry Smith .vb
5826891c3e4SJed Brown    PetscErrorCode applyBA (PC pc,Vec xin,Vec xout)
5832bb17772SBarry Smith .ve
5842bb17772SBarry Smith 
5856891c3e4SJed Brown +  pc - the preconditioner, get the application context with PCShellGetContext()
5862bb17772SBarry Smith .  xin - input vector
5872bb17772SBarry Smith -  xout - output vector
5882bb17772SBarry Smith 
5894aa34b0aSBarry Smith    Notes: the function MUST return an error code of 0 on success and nonzero on failure.
5904aa34b0aSBarry Smith 
5912bb17772SBarry Smith    Level: developer
5922bb17772SBarry Smith 
5932bb17772SBarry Smith .keywords: PC, shell, set, apply, user-provided
5942bb17772SBarry Smith 
5952bb17772SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose(), PCShellSetContext(), PCShellSetApply()
5962bb17772SBarry Smith @*/
5976891c3e4SJed Brown PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApplyBA(PC pc,PetscErrorCode (*applyBA)(PC,PCSide,Vec,Vec,Vec))
5982bb17772SBarry Smith {
5996891c3e4SJed Brown   PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(PC,PCSide,Vec,Vec,Vec));
6002bb17772SBarry Smith 
6012bb17772SBarry Smith   PetscFunctionBegin;
6020700a824SBarry Smith   PetscValidHeaderSpecific(pc,PC_CLASSID,1);
6032bb17772SBarry Smith   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetApplyBA_C",(void (**)(void))&f);CHKERRQ(ierr);
6042bb17772SBarry Smith   if (f) {
6052bb17772SBarry Smith     ierr = (*f)(pc,applyBA);CHKERRQ(ierr);
6062bb17772SBarry Smith   }
6072bb17772SBarry Smith   PetscFunctionReturn(0);
6082bb17772SBarry Smith }
6092bb17772SBarry Smith 
6102bb17772SBarry Smith #undef __FUNCT__
6114b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApplyTranspose"
6124b9ad928SBarry Smith /*@C
6134b9ad928SBarry Smith    PCShellSetApplyTranspose - Sets routine to use as preconditioner transpose.
6144b9ad928SBarry Smith 
6153f9fe445SBarry Smith    Logically Collective on PC
6164b9ad928SBarry Smith 
6174b9ad928SBarry Smith    Input Parameters:
6184b9ad928SBarry Smith +  pc - the preconditioner context
6194b9ad928SBarry Smith -  apply - the application-provided preconditioning transpose routine
6204b9ad928SBarry Smith 
6214b9ad928SBarry Smith    Calling sequence of apply:
6224b9ad928SBarry Smith .vb
6236891c3e4SJed Brown    PetscErrorCode applytranspose (PC pc,Vec xin,Vec xout)
6244b9ad928SBarry Smith .ve
6254b9ad928SBarry Smith 
6266891c3e4SJed Brown +  pc - the preconditioner, get the application context with PCShellGetContext()
6274b9ad928SBarry Smith .  xin - input vector
6284b9ad928SBarry Smith -  xout - output vector
6294b9ad928SBarry Smith 
6304aa34b0aSBarry Smith    Notes: the function MUST return an error code of 0 on success and nonzero on failure.
6314aa34b0aSBarry Smith 
6324b9ad928SBarry Smith    Level: developer
6334b9ad928SBarry Smith 
6344b9ad928SBarry Smith    Notes:
6354b9ad928SBarry Smith    Uses the same context variable as PCShellSetApply().
6364b9ad928SBarry Smith 
6374b9ad928SBarry Smith .keywords: PC, shell, set, apply, user-provided
6384b9ad928SBarry Smith 
6392bb17772SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApply(), PCSetContext(), PCShellSetApplyBA()
6404b9ad928SBarry Smith @*/
6416891c3e4SJed Brown PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApplyTranspose(PC pc,PetscErrorCode (*applytranspose)(PC,Vec,Vec))
6424b9ad928SBarry Smith {
6436891c3e4SJed Brown   PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(PC,Vec,Vec));
6444b9ad928SBarry Smith 
6454b9ad928SBarry Smith   PetscFunctionBegin;
6460700a824SBarry Smith   PetscValidHeaderSpecific(pc,PC_CLASSID,1);
6474b9ad928SBarry Smith   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetApplyTranspose_C",(void (**)(void))&f);CHKERRQ(ierr);
6484b9ad928SBarry Smith   if (f) {
6494b9ad928SBarry Smith     ierr = (*f)(pc,applytranspose);CHKERRQ(ierr);
6504b9ad928SBarry Smith   }
6514b9ad928SBarry Smith   PetscFunctionReturn(0);
6524b9ad928SBarry Smith }
6534b9ad928SBarry Smith 
6544b9ad928SBarry Smith #undef __FUNCT__
6557cdd61b2SBarry Smith #define __FUNCT__ "PCShellSetPreSolve"
6567cdd61b2SBarry Smith /*@C
6577cdd61b2SBarry Smith    PCShellSetPreSolve - Sets routine to apply to the operators/vectors before a KSPSolve() is
6587cdd61b2SBarry Smith       applied. This usually does something like scale the linear system in some application
6597cdd61b2SBarry Smith       specific way.
6607cdd61b2SBarry Smith 
6613f9fe445SBarry Smith    Logically Collective on PC
6627cdd61b2SBarry Smith 
6637cdd61b2SBarry Smith    Input Parameters:
6647cdd61b2SBarry Smith +  pc - the preconditioner context
6657cdd61b2SBarry Smith -  presolve - the application-provided presolve routine
6667cdd61b2SBarry Smith 
6677cdd61b2SBarry Smith    Calling sequence of presolve:
6687cdd61b2SBarry Smith .vb
6696891c3e4SJed Brown    PetscErrorCode presolve (PC,KSP ksp,Vec b,Vec x)
6707cdd61b2SBarry Smith .ve
6717cdd61b2SBarry Smith 
6726891c3e4SJed Brown +  pc - the preconditioner, get the application context with PCShellGetContext()
6737cdd61b2SBarry Smith .  xin - input vector
6747cdd61b2SBarry Smith -  xout - output vector
6757cdd61b2SBarry Smith 
6764aa34b0aSBarry Smith    Notes: the function MUST return an error code of 0 on success and nonzero on failure.
6774aa34b0aSBarry Smith 
6787cdd61b2SBarry Smith    Level: developer
6797cdd61b2SBarry Smith 
6807cdd61b2SBarry Smith .keywords: PC, shell, set, apply, user-provided
6817cdd61b2SBarry Smith 
682be29d3c6SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose(), PCShellSetPostSolve(), PCShellSetContext()
6837cdd61b2SBarry Smith @*/
6846891c3e4SJed Brown PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetPreSolve(PC pc,PetscErrorCode (*presolve)(PC,KSP,Vec,Vec))
6857cdd61b2SBarry Smith {
6866891c3e4SJed Brown   PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(PC,KSP,Vec,Vec));
6877cdd61b2SBarry Smith 
6887cdd61b2SBarry Smith   PetscFunctionBegin;
6890700a824SBarry Smith   PetscValidHeaderSpecific(pc,PC_CLASSID,1);
6907cdd61b2SBarry Smith   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetPreSolve_C",(void (**)(void))&f);CHKERRQ(ierr);
6917cdd61b2SBarry Smith   if (f) {
6927cdd61b2SBarry Smith     ierr = (*f)(pc,presolve);CHKERRQ(ierr);
6937cdd61b2SBarry Smith   }
6947cdd61b2SBarry Smith   PetscFunctionReturn(0);
6957cdd61b2SBarry Smith }
6967cdd61b2SBarry Smith 
6977cdd61b2SBarry Smith #undef __FUNCT__
6987cdd61b2SBarry Smith #define __FUNCT__ "PCShellSetPostSolve"
6997cdd61b2SBarry Smith /*@C
7007cdd61b2SBarry Smith    PCShellSetPostSolve - Sets routine to apply to the operators/vectors before a KSPSolve() is
7017cdd61b2SBarry Smith       applied. This usually does something like scale the linear system in some application
7027cdd61b2SBarry Smith       specific way.
7037cdd61b2SBarry Smith 
7043f9fe445SBarry Smith    Logically Collective on PC
7057cdd61b2SBarry Smith 
7067cdd61b2SBarry Smith    Input Parameters:
7077cdd61b2SBarry Smith +  pc - the preconditioner context
7087cdd61b2SBarry Smith -  postsolve - the application-provided presolve routine
7097cdd61b2SBarry Smith 
7107cdd61b2SBarry Smith    Calling sequence of postsolve:
7117cdd61b2SBarry Smith .vb
7126891c3e4SJed Brown    PetscErrorCode postsolve(PC,KSP ksp,Vec b,Vec x)
7137cdd61b2SBarry Smith .ve
7147cdd61b2SBarry Smith 
7156891c3e4SJed Brown +  pc - the preconditioner, get the application context with PCShellGetContext()
7167cdd61b2SBarry Smith .  xin - input vector
7177cdd61b2SBarry Smith -  xout - output vector
7187cdd61b2SBarry Smith 
7194aa34b0aSBarry Smith    Notes: the function MUST return an error code of 0 on success and nonzero on failure.
7204aa34b0aSBarry Smith 
7217cdd61b2SBarry Smith    Level: developer
7227cdd61b2SBarry Smith 
7237cdd61b2SBarry Smith .keywords: PC, shell, set, apply, user-provided
7247cdd61b2SBarry Smith 
725be29d3c6SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose(), PCShellSetPreSolve(), PCShellSetContext()
7267cdd61b2SBarry Smith @*/
7276891c3e4SJed Brown PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetPostSolve(PC pc,PetscErrorCode (*postsolve)(PC,KSP,Vec,Vec))
7287cdd61b2SBarry Smith {
7296891c3e4SJed Brown   PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(PC,KSP,Vec,Vec));
7307cdd61b2SBarry Smith 
7317cdd61b2SBarry Smith   PetscFunctionBegin;
7320700a824SBarry Smith   PetscValidHeaderSpecific(pc,PC_CLASSID,1);
7337cdd61b2SBarry Smith   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetPostSolve_C",(void (**)(void))&f);CHKERRQ(ierr);
7347cdd61b2SBarry Smith   if (f) {
7357cdd61b2SBarry Smith     ierr = (*f)(pc,postsolve);CHKERRQ(ierr);
7367cdd61b2SBarry Smith   }
7377cdd61b2SBarry Smith   PetscFunctionReturn(0);
7387cdd61b2SBarry Smith }
7397cdd61b2SBarry Smith 
7407cdd61b2SBarry Smith #undef __FUNCT__
7414b9ad928SBarry Smith #define __FUNCT__ "PCShellSetName"
7424b9ad928SBarry Smith /*@C
7434b9ad928SBarry Smith    PCShellSetName - Sets an optional name to associate with a shell
7444b9ad928SBarry Smith    preconditioner.
7454b9ad928SBarry Smith 
7464b9ad928SBarry Smith    Not Collective
7474b9ad928SBarry Smith 
7484b9ad928SBarry Smith    Input Parameters:
7494b9ad928SBarry Smith +  pc - the preconditioner context
7504b9ad928SBarry Smith -  name - character string describing shell preconditioner
7514b9ad928SBarry Smith 
7524b9ad928SBarry Smith    Level: developer
7534b9ad928SBarry Smith 
7544b9ad928SBarry Smith .keywords: PC, shell, set, name, user-provided
7554b9ad928SBarry Smith 
7564b9ad928SBarry Smith .seealso: PCShellGetName()
7574b9ad928SBarry Smith @*/
758dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetName(PC pc,const char name[])
7594b9ad928SBarry Smith {
760dfbe8321SBarry Smith   PetscErrorCode ierr,(*f)(PC,const char []);
7614b9ad928SBarry Smith 
7624b9ad928SBarry Smith   PetscFunctionBegin;
7630700a824SBarry Smith   PetscValidHeaderSpecific(pc,PC_CLASSID,1);
7644b9ad928SBarry Smith   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetName_C",(void (**)(void))&f);CHKERRQ(ierr);
7654b9ad928SBarry Smith   if (f) {
7664b9ad928SBarry Smith     ierr = (*f)(pc,name);CHKERRQ(ierr);
7674b9ad928SBarry Smith   }
7684b9ad928SBarry Smith   PetscFunctionReturn(0);
7694b9ad928SBarry Smith }
7704b9ad928SBarry Smith 
7714b9ad928SBarry Smith #undef __FUNCT__
7724b9ad928SBarry Smith #define __FUNCT__ "PCShellGetName"
7734b9ad928SBarry Smith /*@C
7744b9ad928SBarry Smith    PCShellGetName - Gets an optional name that the user has set for a shell
7754b9ad928SBarry Smith    preconditioner.
7764b9ad928SBarry Smith 
7774b9ad928SBarry Smith    Not Collective
7784b9ad928SBarry Smith 
7794b9ad928SBarry Smith    Input Parameter:
7804b9ad928SBarry Smith .  pc - the preconditioner context
7814b9ad928SBarry Smith 
7824b9ad928SBarry Smith    Output Parameter:
7834b9ad928SBarry Smith .  name - character string describing shell preconditioner (you should not free this)
7844b9ad928SBarry Smith 
7854b9ad928SBarry Smith    Level: developer
7864b9ad928SBarry Smith 
7874b9ad928SBarry Smith .keywords: PC, shell, get, name, user-provided
7884b9ad928SBarry Smith 
7894b9ad928SBarry Smith .seealso: PCShellSetName()
7904b9ad928SBarry Smith @*/
791dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellGetName(PC pc,char *name[])
7924b9ad928SBarry Smith {
793dfbe8321SBarry Smith   PetscErrorCode ierr,(*f)(PC,char *[]);
7944b9ad928SBarry Smith 
7954b9ad928SBarry Smith   PetscFunctionBegin;
7960700a824SBarry Smith   PetscValidHeaderSpecific(pc,PC_CLASSID,1);
7974482741eSBarry Smith   PetscValidPointer(name,2);
7984b9ad928SBarry Smith   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellGetName_C",(void (**)(void))&f);CHKERRQ(ierr);
7994b9ad928SBarry Smith   if (f) {
8004b9ad928SBarry Smith     ierr = (*f)(pc,name);CHKERRQ(ierr);
801e7e72b3dSBarry Smith   } else  SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Not shell preconditioner, cannot get name");
8024b9ad928SBarry Smith   PetscFunctionReturn(0);
8034b9ad928SBarry Smith }
8044b9ad928SBarry Smith 
8054b9ad928SBarry Smith #undef __FUNCT__
8064b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApplyRichardson"
8074b9ad928SBarry Smith /*@C
8084b9ad928SBarry Smith    PCShellSetApplyRichardson - Sets routine to use as preconditioner
8094b9ad928SBarry Smith    in Richardson iteration.
8104b9ad928SBarry Smith 
8113f9fe445SBarry Smith    Logically Collective on PC
8124b9ad928SBarry Smith 
8134b9ad928SBarry Smith    Input Parameters:
8144b9ad928SBarry Smith +  pc - the preconditioner context
815be29d3c6SBarry Smith -  apply - the application-provided preconditioning routine
8164b9ad928SBarry Smith 
8174b9ad928SBarry Smith    Calling sequence of apply:
8184b9ad928SBarry Smith .vb
8196891c3e4SJed Brown    PetscErrorCode apply (PC pc,Vec b,Vec x,Vec r,PetscReal rtol,PetscReal abstol,PetscReal dtol,PetscInt maxits)
8204b9ad928SBarry Smith .ve
8214b9ad928SBarry Smith 
8226891c3e4SJed Brown +  pc - the preconditioner, get the application context with PCShellGetContext()
8234b9ad928SBarry Smith .  b - right-hand-side
8244b9ad928SBarry Smith .  x - current iterate
8254b9ad928SBarry Smith .  r - work space
8264b9ad928SBarry Smith .  rtol - relative tolerance of residual norm to stop at
82770441072SBarry Smith .  abstol - absolute tolerance of residual norm to stop at
8284b9ad928SBarry Smith .  dtol - if residual norm increases by this factor than return
8294b9ad928SBarry Smith -  maxits - number of iterations to run
8304b9ad928SBarry Smith 
8314aa34b0aSBarry Smith    Notes: the function MUST return an error code of 0 on success and nonzero on failure.
8324aa34b0aSBarry Smith 
8334b9ad928SBarry Smith    Level: developer
8344b9ad928SBarry Smith 
8354b9ad928SBarry Smith .keywords: PC, shell, set, apply, Richardson, user-provided
8364b9ad928SBarry Smith 
837be29d3c6SBarry Smith .seealso: PCShellSetApply(), PCShellSetContext()
8384b9ad928SBarry Smith @*/
8397319c654SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApplyRichardson(PC pc,PetscErrorCode (*apply)(PC,Vec,Vec,Vec,PetscReal,PetscReal,PetscReal,PetscInt,PetscTruth,PetscInt*,PCRichardsonConvergedReason*))
8404b9ad928SBarry Smith {
8417319c654SBarry Smith   PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(PC,Vec,Vec,Vec,PetscReal,PetscReal,PetscReal,PetscInt,PetscTruth,PetscInt*,PCRichardsonConvergedReason*));
8424b9ad928SBarry Smith 
8434b9ad928SBarry Smith   PetscFunctionBegin;
8440700a824SBarry Smith   PetscValidHeaderSpecific(pc,PC_CLASSID,1);
8454b9ad928SBarry Smith   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetApplyRichardson_C",(void (**)(void))&f);CHKERRQ(ierr);
8464b9ad928SBarry Smith   if (f) {
847be29d3c6SBarry Smith     ierr = (*f)(pc,apply);CHKERRQ(ierr);
8484b9ad928SBarry Smith   }
8494b9ad928SBarry Smith   PetscFunctionReturn(0);
8504b9ad928SBarry Smith }
8514b9ad928SBarry Smith 
8524b9ad928SBarry Smith /*MC
8534b9ad928SBarry Smith    PCSHELL - Creates a new preconditioner class for use with your
8544b9ad928SBarry Smith               own private data storage format.
8554b9ad928SBarry Smith 
8564b9ad928SBarry Smith    Level: advanced
85790198e61SBarry Smith >
8584b9ad928SBarry Smith    Concepts: providing your own preconditioner
8594b9ad928SBarry Smith 
8604b9ad928SBarry Smith   Usage:
8616891c3e4SJed Brown $             extern PetscErrorCode apply(PC,Vec,Vec);
8626891c3e4SJed Brown $             extern PetscErrorCode applyba(PC,PCSide,Vec,Vec,Vec);
8636891c3e4SJed Brown $             extern PetscErrorCode applytranspose(PC,Vec,Vec);
8646891c3e4SJed Brown $             extern PetscErrorCode setup(PC);
8656891c3e4SJed Brown $             extern PetscErrorCode destroy(PC);
8666891c3e4SJed Brown $
8674b9ad928SBarry Smith $             PCCreate(comm,&pc);
8684b9ad928SBarry Smith $             PCSetType(pc,PCSHELL);
869be29d3c6SBarry Smith $             PCShellSetContext(pc,ctx)
8706891c3e4SJed Brown $             PCShellSetApply(pc,apply);
8716891c3e4SJed Brown $             PCShellSetApplyBA(pc,applyba);               (optional)
8726891c3e4SJed Brown $             PCShellSetApplyTranspose(pc,applytranspose); (optional)
8734b9ad928SBarry Smith $             PCShellSetSetUp(pc,setup);                   (optional)
874d01c8aa3SLisandro Dalcin $             PCShellSetDestroy(pc,destroy);               (optional)
8754b9ad928SBarry Smith 
8764b9ad928SBarry Smith .seealso:  PCCreate(), PCSetType(), PCType (for list of available types), PC,
877fd2d0fe1Svictor            MATSHELL, PCShellSetSetUp(), PCShellSetApply(), PCShellSetView(),
878fd2d0fe1Svictor            PCShellSetApplyTranspose(), PCShellSetName(), PCShellSetApplyRichardson(),
8792bb17772SBarry Smith            PCShellGetName(), PCShellSetContext(), PCShellGetContext(), PCShellSetApplyBA()
8804b9ad928SBarry Smith M*/
8814b9ad928SBarry Smith 
8824b9ad928SBarry Smith EXTERN_C_BEGIN
8834b9ad928SBarry Smith #undef __FUNCT__
8844b9ad928SBarry Smith #define __FUNCT__ "PCCreate_Shell"
885dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCCreate_Shell(PC pc)
8864b9ad928SBarry Smith {
887dfbe8321SBarry Smith   PetscErrorCode ierr;
8884b9ad928SBarry Smith   PC_Shell       *shell;
8894b9ad928SBarry Smith 
8904b9ad928SBarry Smith   PetscFunctionBegin;
89138f2d2fdSLisandro Dalcin   ierr = PetscNewLog(pc,PC_Shell,&shell);CHKERRQ(ierr);
8924b9ad928SBarry Smith   pc->data  = (void*)shell;
8934b9ad928SBarry Smith 
894d01c8aa3SLisandro Dalcin   pc->ops->destroy         = PCDestroy_Shell;
8954b9ad928SBarry Smith   pc->ops->view            = PCView_Shell;
896d01c8aa3SLisandro Dalcin   pc->ops->apply           = PCApply_Shell;
897d01c8aa3SLisandro Dalcin   pc->ops->applytranspose  = 0;
8984b9ad928SBarry Smith   pc->ops->applyrichardson = 0;
899d01c8aa3SLisandro Dalcin   pc->ops->setup           = 0;
9009bbb2c88SBarry Smith   pc->ops->presolve        = 0;
9019bbb2c88SBarry Smith   pc->ops->postsolve       = 0;
9024b9ad928SBarry Smith 
9034b9ad928SBarry Smith   shell->apply          = 0;
9044b9ad928SBarry Smith   shell->applytranspose = 0;
9054b9ad928SBarry Smith   shell->name           = 0;
9064b9ad928SBarry Smith   shell->applyrich      = 0;
9077cdd61b2SBarry Smith   shell->presolve       = 0;
9087cdd61b2SBarry Smith   shell->postsolve      = 0;
9094b9ad928SBarry Smith   shell->ctx            = 0;
9104b9ad928SBarry Smith   shell->setup          = 0;
9114b9ad928SBarry Smith   shell->view           = 0;
91218be62a5SSatish Balay   shell->destroy        = 0;
9134b9ad928SBarry Smith 
91418be62a5SSatish Balay   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetDestroy_C","PCShellSetDestroy_Shell",
91518be62a5SSatish Balay                     PCShellSetDestroy_Shell);CHKERRQ(ierr);
9164b9ad928SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetSetUp_C","PCShellSetSetUp_Shell",
9174b9ad928SBarry Smith                     PCShellSetSetUp_Shell);CHKERRQ(ierr);
9184b9ad928SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetApply_C","PCShellSetApply_Shell",
9194b9ad928SBarry Smith                     PCShellSetApply_Shell);CHKERRQ(ierr);
9202bb17772SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetApplyBA_C","PCShellSetApplyBA_Shell",
9212bb17772SBarry Smith                     PCShellSetApplyBA_Shell);CHKERRQ(ierr);
9227cdd61b2SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetPreSolve_C","PCShellSetPreSolve_Shell",
9237cdd61b2SBarry Smith                     PCShellSetPreSolve_Shell);CHKERRQ(ierr);
9247cdd61b2SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetPostSolve_C","PCShellSetPostSolve_Shell",
9257cdd61b2SBarry Smith                     PCShellSetPostSolve_Shell);CHKERRQ(ierr);
9264b9ad928SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetView_C","PCShellSetView_Shell",
9274b9ad928SBarry Smith                     PCShellSetView_Shell);CHKERRQ(ierr);
928be29d3c6SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetApplyTranspose_C","PCShellSetApplyTranspose_Shell",
9294b9ad928SBarry Smith                     PCShellSetApplyTranspose_Shell);CHKERRQ(ierr);
9304b9ad928SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetName_C","PCShellSetName_Shell",
9314b9ad928SBarry Smith                     PCShellSetName_Shell);CHKERRQ(ierr);
9324b9ad928SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellGetName_C","PCShellGetName_Shell",
9334b9ad928SBarry Smith                     PCShellGetName_Shell);CHKERRQ(ierr);
934be29d3c6SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetApplyRichardson_C","PCShellSetApplyRichardson_Shell",
9354b9ad928SBarry Smith                     PCShellSetApplyRichardson_Shell);CHKERRQ(ierr);
9364b9ad928SBarry Smith   PetscFunctionReturn(0);
9374b9ad928SBarry Smith }
9384b9ad928SBarry Smith EXTERN_C_END
9394b9ad928SBarry Smith 
9404b9ad928SBarry Smith 
9414b9ad928SBarry Smith 
9424b9ad928SBarry Smith 
9434b9ad928SBarry Smith 
9444b9ad928SBarry Smith 
945