xref: /petsc/src/ksp/pc/impls/shell/shellpc.c (revision 38f2d2fdb3b6f522a3102c6eb796cebecf3224c0)
1dba47a55SKris Buschelman #define PETSCKSP_DLL
2dba47a55SKris Buschelman 
34b9ad928SBarry Smith /*
44b9ad928SBarry Smith    This provides a simple shell for Fortran (and C programmers) to
54b9ad928SBarry Smith   create their own preconditioner without writing much interface code.
64b9ad928SBarry Smith */
74b9ad928SBarry Smith 
86356e834SBarry Smith #include "private/pcimpl.h"        /*I "petscpc.h" I*/
91d8d5f9aSSatish Balay #include "private/vecimpl.h"
104b9ad928SBarry Smith 
11ac226902SBarry Smith EXTERN_C_BEGIN
124b9ad928SBarry Smith typedef struct {
13be29d3c6SBarry Smith   void           *ctx;                     /* user provided contexts for preconditioner */
1418be62a5SSatish Balay   PetscErrorCode (*destroy)(void*);
156849ba73SBarry Smith   PetscErrorCode (*setup)(void*);
166849ba73SBarry Smith   PetscErrorCode (*apply)(void*,Vec,Vec);
172bb17772SBarry Smith   PetscErrorCode (*applyBA)(void*,PCSide,Vec,Vec,Vec);
187cdd61b2SBarry Smith   PetscErrorCode (*presolve)(void*,KSP,Vec,Vec);
197cdd61b2SBarry Smith   PetscErrorCode (*postsolve)(void*,KSP,Vec,Vec);
206849ba73SBarry Smith   PetscErrorCode (*view)(void*,PetscViewer);
216849ba73SBarry Smith   PetscErrorCode (*applytranspose)(void*,Vec,Vec);
2213f74950SBarry Smith   PetscErrorCode (*applyrich)(void*,Vec,Vec,Vec,PetscReal,PetscReal,PetscReal,PetscInt);
234b9ad928SBarry Smith   char           *name;
244b9ad928SBarry Smith } PC_Shell;
25ac226902SBarry Smith EXTERN_C_END
264b9ad928SBarry Smith 
274b9ad928SBarry Smith #undef __FUNCT__
28be29d3c6SBarry Smith #define __FUNCT__ "PCShellGetContext"
29b29801fcSSatish Balay /*@C
30be29d3c6SBarry Smith     PCShellGetContext - Returns the user-provided context associated with a shell PC
31be29d3c6SBarry Smith 
32be29d3c6SBarry Smith     Not Collective
33be29d3c6SBarry Smith 
34be29d3c6SBarry Smith     Input Parameter:
35be29d3c6SBarry Smith .   pc - should have been created with PCCreateShell()
36be29d3c6SBarry Smith 
37be29d3c6SBarry Smith     Output Parameter:
38be29d3c6SBarry Smith .   ctx - the user provided context
39be29d3c6SBarry Smith 
40be29d3c6SBarry Smith     Level: advanced
41be29d3c6SBarry Smith 
42be29d3c6SBarry Smith     Notes:
43be29d3c6SBarry Smith     This routine is intended for use within various shell routines
44be29d3c6SBarry Smith 
45be29d3c6SBarry Smith .keywords: PC, shell, get, context
46be29d3c6SBarry Smith 
47be29d3c6SBarry Smith .seealso: PCCreateShell(), PCShellSetContext()
48be29d3c6SBarry Smith @*/
49be29d3c6SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellGetContext(PC pc,void **ctx)
50be29d3c6SBarry Smith {
51be29d3c6SBarry Smith   PetscErrorCode ierr;
52be29d3c6SBarry Smith   PetscTruth     flg;
53be29d3c6SBarry Smith 
54be29d3c6SBarry Smith   PetscFunctionBegin;
55be29d3c6SBarry Smith   PetscValidHeaderSpecific(pc,PC_COOKIE,1);
56be29d3c6SBarry Smith   PetscValidPointer(ctx,2);
57be29d3c6SBarry Smith   ierr = PetscTypeCompare((PetscObject)pc,PCSHELL,&flg);CHKERRQ(ierr);
58be29d3c6SBarry Smith   if (!flg) *ctx = 0;
59be29d3c6SBarry Smith   else      *ctx = ((PC_Shell*)(pc->data))->ctx;
60be29d3c6SBarry Smith   PetscFunctionReturn(0);
61be29d3c6SBarry Smith }
62be29d3c6SBarry Smith 
63be29d3c6SBarry Smith #undef __FUNCT__
64be29d3c6SBarry Smith #define __FUNCT__ "PCShellSetContext"
65b29801fcSSatish Balay /*@
66be29d3c6SBarry Smith     PCShellSetContext - sets the context for a shell PC
67be29d3c6SBarry Smith 
68be29d3c6SBarry Smith    Collective on PC
69be29d3c6SBarry Smith 
70be29d3c6SBarry Smith     Input Parameters:
71be29d3c6SBarry Smith +   pc - the shell PC
72be29d3c6SBarry Smith -   ctx - the context
73be29d3c6SBarry Smith 
74be29d3c6SBarry Smith    Level: advanced
75be29d3c6SBarry Smith 
76be29d3c6SBarry Smith    Fortran Notes: The context can only be an integer or a PetscObject
77be29d3c6SBarry Smith       unfortunately it cannot be a Fortran array or derived type.
78be29d3c6SBarry Smith 
79be29d3c6SBarry Smith .seealso: PCCreateShell(), PCShellGetContext()
80be29d3c6SBarry Smith @*/
81be29d3c6SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetContext(PC pc,void *ctx)
82be29d3c6SBarry Smith {
83d01c8aa3SLisandro Dalcin   PC_Shell      *shell;
84be29d3c6SBarry Smith   PetscErrorCode ierr;
85be29d3c6SBarry Smith   PetscTruth     flg;
86be29d3c6SBarry Smith 
87be29d3c6SBarry Smith   PetscFunctionBegin;
88be29d3c6SBarry Smith   PetscValidHeaderSpecific(pc,PC_COOKIE,1);
89d01c8aa3SLisandro Dalcin   shell = (PC_Shell*)pc->data;
90be29d3c6SBarry Smith   ierr = PetscTypeCompare((PetscObject)pc,PCSHELL,&flg);CHKERRQ(ierr);
91be29d3c6SBarry Smith   if (flg) {
92be29d3c6SBarry Smith     shell->ctx = ctx;
93be29d3c6SBarry Smith   }
94be29d3c6SBarry Smith   PetscFunctionReturn(0);
95be29d3c6SBarry Smith }
96be29d3c6SBarry Smith 
97be29d3c6SBarry Smith #undef __FUNCT__
9818be62a5SSatish Balay #define __FUNCT__ "PCSetUp_Shell"
996849ba73SBarry Smith static PetscErrorCode PCSetUp_Shell(PC pc)
1004b9ad928SBarry Smith {
1014b9ad928SBarry Smith   PC_Shell       *shell;
102dfbe8321SBarry Smith   PetscErrorCode ierr;
1034b9ad928SBarry Smith 
1044b9ad928SBarry Smith   PetscFunctionBegin;
1054b9ad928SBarry Smith   shell = (PC_Shell*)pc->data;
106d01c8aa3SLisandro Dalcin   if (!shell->setup) SETERRQ(PETSC_ERR_USER,"No setup() routine provided to Shell PC");
107d01c8aa3SLisandro Dalcin   PetscStackPush("PCSHELL user function setup()");
108e9a2bbcdSBarry Smith   CHKMEMQ;
1094b9ad928SBarry Smith   ierr  = (*shell->setup)(shell->ctx);CHKERRQ(ierr);
110e9a2bbcdSBarry Smith   CHKMEMQ;
111d01c8aa3SLisandro Dalcin   PetscStackPop;
1124b9ad928SBarry Smith   PetscFunctionReturn(0);
1134b9ad928SBarry Smith }
1144b9ad928SBarry Smith 
1154b9ad928SBarry Smith #undef __FUNCT__
1164b9ad928SBarry Smith #define __FUNCT__ "PCApply_Shell"
1176849ba73SBarry Smith static PetscErrorCode PCApply_Shell(PC pc,Vec x,Vec y)
1184b9ad928SBarry Smith {
1194b9ad928SBarry Smith   PC_Shell       *shell;
120dfbe8321SBarry Smith   PetscErrorCode ierr;
1214b9ad928SBarry Smith 
1224b9ad928SBarry Smith   PetscFunctionBegin;
1234b9ad928SBarry Smith   shell = (PC_Shell*)pc->data;
1241302d50aSBarry Smith   if (!shell->apply) SETERRQ(PETSC_ERR_USER,"No apply() routine provided to Shell PC");
125d01c8aa3SLisandro Dalcin   PetscStackPush("PCSHELL user function apply()");
126e9a2bbcdSBarry Smith   CHKMEMQ;
1274b9ad928SBarry Smith   ierr  = (*shell->apply)(shell->ctx,x,y);CHKERRQ(ierr);
128e9a2bbcdSBarry Smith   CHKMEMQ;
129e9a2bbcdSBarry Smith   PetscStackPop;
1304b9ad928SBarry Smith   PetscFunctionReturn(0);
1314b9ad928SBarry Smith }
1324b9ad928SBarry Smith 
1334b9ad928SBarry Smith #undef __FUNCT__
1342bb17772SBarry Smith #define __FUNCT__ "PCApplyBA_Shell"
1352bb17772SBarry Smith static PetscErrorCode PCApplyBA_Shell(PC pc,PCSide side,Vec x,Vec y,Vec w)
1362bb17772SBarry Smith {
1372bb17772SBarry Smith   PC_Shell       *shell;
1382bb17772SBarry Smith   PetscErrorCode ierr;
1392bb17772SBarry Smith 
1402bb17772SBarry Smith   PetscFunctionBegin;
1412bb17772SBarry Smith   shell = (PC_Shell*)pc->data;
1422bb17772SBarry Smith   if (!shell->applyBA) SETERRQ(PETSC_ERR_USER,"No applyBA() routine provided to Shell PC");
143d01c8aa3SLisandro Dalcin   PetscStackPush("PCSHELL user function applyBA()");
1442bb17772SBarry Smith   CHKMEMQ;
1452bb17772SBarry Smith   ierr  = (*shell->applyBA)(shell->ctx,side,x,y,w);CHKERRQ(ierr);
1462bb17772SBarry Smith   CHKMEMQ;
1472bb17772SBarry Smith   PetscStackPop;
1482bb17772SBarry Smith   PetscFunctionReturn(0);
1492bb17772SBarry Smith }
1502bb17772SBarry Smith 
1512bb17772SBarry Smith #undef __FUNCT__
1527cdd61b2SBarry Smith #define __FUNCT__ "PCPreSolve_Shell"
1537cdd61b2SBarry Smith static PetscErrorCode PCPreSolve_Shell(PC pc,KSP ksp,Vec b,Vec x)
1547cdd61b2SBarry Smith {
1557cdd61b2SBarry Smith   PC_Shell       *shell;
1567cdd61b2SBarry Smith   PetscErrorCode ierr;
1577cdd61b2SBarry Smith 
1587cdd61b2SBarry Smith   PetscFunctionBegin;
1597cdd61b2SBarry Smith   shell = (PC_Shell*)pc->data;
16091ad8336SSatish Balay   if (!shell->presolve) SETERRQ(PETSC_ERR_USER,"No presolve() routine provided to Shell PC");
161d01c8aa3SLisandro Dalcin   PetscStackPush("PCSHELL user function presolve()");
162d01c8aa3SLisandro Dalcin   CHKMEMQ;
1637cdd61b2SBarry Smith   ierr  = (*shell->presolve)(shell->ctx,ksp,b,x);CHKERRQ(ierr);
164d01c8aa3SLisandro Dalcin   CHKMEMQ;
165d01c8aa3SLisandro Dalcin   PetscStackPop;
1667cdd61b2SBarry Smith   PetscFunctionReturn(0);
1677cdd61b2SBarry Smith }
1687cdd61b2SBarry Smith 
1697cdd61b2SBarry Smith #undef __FUNCT__
1707cdd61b2SBarry Smith #define __FUNCT__ "PCPostSolve_Shell"
1717cdd61b2SBarry Smith static PetscErrorCode PCPostSolve_Shell(PC pc,KSP ksp,Vec b,Vec x)
1727cdd61b2SBarry Smith {
1737cdd61b2SBarry Smith   PC_Shell       *shell;
1747cdd61b2SBarry Smith   PetscErrorCode ierr;
1757cdd61b2SBarry Smith 
1767cdd61b2SBarry Smith   PetscFunctionBegin;
1777cdd61b2SBarry Smith   shell = (PC_Shell*)pc->data;
17891ad8336SSatish Balay   if (!shell->postsolve) SETERRQ(PETSC_ERR_USER,"No postsolve() routine provided to Shell PC");
179d01c8aa3SLisandro Dalcin   PetscStackPush("PCSHELL user function postsolve()");
180d01c8aa3SLisandro Dalcin   CHKMEMQ;
18191ad8336SSatish Balay   ierr  = (*shell->postsolve)(shell->ctx,ksp,b,x);CHKERRQ(ierr);
182d01c8aa3SLisandro Dalcin   CHKMEMQ;
183d01c8aa3SLisandro Dalcin   PetscStackPop;
1847cdd61b2SBarry Smith   PetscFunctionReturn(0);
1857cdd61b2SBarry Smith }
1867cdd61b2SBarry Smith 
1877cdd61b2SBarry Smith #undef __FUNCT__
1884b9ad928SBarry Smith #define __FUNCT__ "PCApplyTranspose_Shell"
1896849ba73SBarry Smith static PetscErrorCode PCApplyTranspose_Shell(PC pc,Vec x,Vec y)
1904b9ad928SBarry Smith {
1914b9ad928SBarry Smith   PC_Shell       *shell;
192dfbe8321SBarry Smith   PetscErrorCode ierr;
1934b9ad928SBarry Smith 
1944b9ad928SBarry Smith   PetscFunctionBegin;
1954b9ad928SBarry Smith   shell = (PC_Shell*)pc->data;
1961302d50aSBarry Smith   if (!shell->applytranspose) SETERRQ(PETSC_ERR_USER,"No applytranspose() routine provided to Shell PC");
197d01c8aa3SLisandro Dalcin   PetscStackPush("PCSHELL user function applytranspose()");
198d01c8aa3SLisandro Dalcin   CHKMEMQ;
1994b9ad928SBarry Smith   ierr  = (*shell->applytranspose)(shell->ctx,x,y);CHKERRQ(ierr);
200d01c8aa3SLisandro Dalcin   CHKMEMQ;
201d01c8aa3SLisandro Dalcin   PetscStackPop;
2024b9ad928SBarry Smith   PetscFunctionReturn(0);
2034b9ad928SBarry Smith }
2044b9ad928SBarry Smith 
2054b9ad928SBarry Smith #undef __FUNCT__
2064b9ad928SBarry Smith #define __FUNCT__ "PCApplyRichardson_Shell"
20713f74950SBarry Smith static PetscErrorCode PCApplyRichardson_Shell(PC pc,Vec x,Vec y,Vec w,PetscReal rtol,PetscReal abstol, PetscReal dtol,PetscInt it)
2084b9ad928SBarry Smith {
209dfbe8321SBarry Smith   PetscErrorCode ierr;
2104b9ad928SBarry Smith   PC_Shell       *shell;
2114b9ad928SBarry Smith 
2124b9ad928SBarry Smith   PetscFunctionBegin;
2134b9ad928SBarry Smith   shell = (PC_Shell*)pc->data;
214d01c8aa3SLisandro Dalcin   if (!shell->applyrich) SETERRQ(PETSC_ERR_USER,"No applyrichardson() routine provided to Shell PC");
215d01c8aa3SLisandro Dalcin   PetscStackPush("PCSHELL user function applyrichardson()");
216d01c8aa3SLisandro Dalcin   CHKMEMQ;
217be29d3c6SBarry Smith   ierr  = (*shell->applyrich)(shell->ctx,x,y,w,rtol,abstol,dtol,it);CHKERRQ(ierr);
218d01c8aa3SLisandro Dalcin   CHKMEMQ;
219d01c8aa3SLisandro Dalcin   PetscStackPop;
2204b9ad928SBarry Smith   PetscFunctionReturn(0);
2214b9ad928SBarry Smith }
2224b9ad928SBarry Smith 
2234b9ad928SBarry Smith #undef __FUNCT__
2244b9ad928SBarry Smith #define __FUNCT__ "PCDestroy_Shell"
2256849ba73SBarry Smith static PetscErrorCode PCDestroy_Shell(PC pc)
2264b9ad928SBarry Smith {
2274b9ad928SBarry Smith   PC_Shell       *shell = (PC_Shell*)pc->data;
228dfbe8321SBarry Smith   PetscErrorCode ierr;
2294b9ad928SBarry Smith 
2304b9ad928SBarry Smith   PetscFunctionBegin;
23105b42c5fSBarry Smith   ierr = PetscStrfree(shell->name);CHKERRQ(ierr);
23218be62a5SSatish Balay   if (shell->destroy) {
23318be62a5SSatish Balay     ierr  = (*shell->destroy)(shell->ctx);CHKERRQ(ierr);
23418be62a5SSatish Balay   }
2354b9ad928SBarry Smith   ierr = PetscFree(shell);CHKERRQ(ierr);
2364b9ad928SBarry Smith   PetscFunctionReturn(0);
2374b9ad928SBarry Smith }
2384b9ad928SBarry Smith 
2394b9ad928SBarry Smith #undef __FUNCT__
2404b9ad928SBarry Smith #define __FUNCT__ "PCView_Shell"
2416849ba73SBarry Smith static PetscErrorCode PCView_Shell(PC pc,PetscViewer viewer)
2424b9ad928SBarry Smith {
2434b9ad928SBarry Smith   PC_Shell       *shell = (PC_Shell*)pc->data;
244dfbe8321SBarry Smith   PetscErrorCode ierr;
24532077d6dSBarry Smith   PetscTruth     iascii;
2464b9ad928SBarry Smith 
2474b9ad928SBarry Smith   PetscFunctionBegin;
24832077d6dSBarry Smith   ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_ASCII,&iascii);CHKERRQ(ierr);
24932077d6dSBarry Smith   if (iascii) {
2504b9ad928SBarry Smith     if (shell->name) {ierr = PetscViewerASCIIPrintf(viewer,"  Shell: %s\n",shell->name);CHKERRQ(ierr);}
2514b9ad928SBarry Smith     else             {ierr = PetscViewerASCIIPrintf(viewer,"  Shell: no name\n");CHKERRQ(ierr);}
2524b9ad928SBarry Smith   }
2534b9ad928SBarry Smith   if (shell->view) {
2544b9ad928SBarry Smith     ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
2554b9ad928SBarry Smith     ierr  = (*shell->view)(shell->ctx,viewer);CHKERRQ(ierr);
2564b9ad928SBarry Smith     ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
2574b9ad928SBarry Smith   }
2584b9ad928SBarry Smith   PetscFunctionReturn(0);
2594b9ad928SBarry Smith }
2604b9ad928SBarry Smith 
2614b9ad928SBarry Smith /* ------------------------------------------------------------------------------*/
2624b9ad928SBarry Smith EXTERN_C_BEGIN
2634b9ad928SBarry Smith #undef __FUNCT__
26418be62a5SSatish Balay #define __FUNCT__ "PCShellSetDestroy_Shell"
26518be62a5SSatish Balay PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetDestroy_Shell(PC pc, PetscErrorCode (*destroy)(void*))
26618be62a5SSatish Balay {
26718be62a5SSatish Balay   PC_Shell *shell;
26818be62a5SSatish Balay 
26918be62a5SSatish Balay   PetscFunctionBegin;
27018be62a5SSatish Balay   shell          = (PC_Shell*)pc->data;
27118be62a5SSatish Balay   shell->destroy = destroy;
27218be62a5SSatish Balay   PetscFunctionReturn(0);
27318be62a5SSatish Balay }
27418be62a5SSatish Balay EXTERN_C_END
27518be62a5SSatish Balay 
27618be62a5SSatish Balay EXTERN_C_BEGIN
27718be62a5SSatish Balay #undef __FUNCT__
2784b9ad928SBarry Smith #define __FUNCT__ "PCShellSetSetUp_Shell"
279dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetSetUp_Shell(PC pc, PetscErrorCode (*setup)(void*))
2804b9ad928SBarry Smith {
2814b9ad928SBarry Smith   PC_Shell *shell;
2824b9ad928SBarry Smith 
2834b9ad928SBarry Smith   PetscFunctionBegin;
2844b9ad928SBarry Smith   shell        = (PC_Shell*)pc->data;
2854b9ad928SBarry Smith   shell->setup = setup;
286d01c8aa3SLisandro Dalcin   if (setup) pc->ops->setup = PCSetUp_Shell;
287d01c8aa3SLisandro Dalcin   else       pc->ops->setup = 0;
2884b9ad928SBarry Smith   PetscFunctionReturn(0);
2894b9ad928SBarry Smith }
2904b9ad928SBarry Smith EXTERN_C_END
2914b9ad928SBarry Smith 
2924b9ad928SBarry Smith EXTERN_C_BEGIN
2934b9ad928SBarry Smith #undef __FUNCT__
2944b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApply_Shell"
295be29d3c6SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApply_Shell(PC pc,PetscErrorCode (*apply)(void*,Vec,Vec))
2964b9ad928SBarry Smith {
2974b9ad928SBarry Smith   PC_Shell *shell;
2984b9ad928SBarry Smith 
2994b9ad928SBarry Smith   PetscFunctionBegin;
3004b9ad928SBarry Smith   shell        = (PC_Shell*)pc->data;
3014b9ad928SBarry Smith   shell->apply = apply;
3024b9ad928SBarry Smith   PetscFunctionReturn(0);
3034b9ad928SBarry Smith }
3044b9ad928SBarry Smith EXTERN_C_END
3054b9ad928SBarry Smith 
3064b9ad928SBarry Smith EXTERN_C_BEGIN
3074b9ad928SBarry Smith #undef __FUNCT__
3082bb17772SBarry Smith #define __FUNCT__ "PCShellSetApplyBA_Shell"
309d01c8aa3SLisandro Dalcin PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApplyBA_Shell(PC pc,PetscErrorCode (*applyBA)(void*,PCSide,Vec,Vec,Vec))
3102bb17772SBarry Smith {
3112bb17772SBarry Smith   PC_Shell *shell;
3122bb17772SBarry Smith 
3132bb17772SBarry Smith   PetscFunctionBegin;
3142bb17772SBarry Smith   shell          = (PC_Shell*)pc->data;
315d01c8aa3SLisandro Dalcin   shell->applyBA = applyBA;
316d01c8aa3SLisandro Dalcin   if (applyBA) pc->ops->applyBA  = PCApplyBA_Shell;
317aef0136fSBarry Smith   else         pc->ops->applyBA  = 0;
3182bb17772SBarry Smith   PetscFunctionReturn(0);
3192bb17772SBarry Smith }
3202bb17772SBarry Smith EXTERN_C_END
3212bb17772SBarry Smith 
3222bb17772SBarry Smith EXTERN_C_BEGIN
3232bb17772SBarry Smith #undef __FUNCT__
3247cdd61b2SBarry Smith #define __FUNCT__ "PCShellSetPreSolve_Shell"
325be29d3c6SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetPreSolve_Shell(PC pc,PetscErrorCode (*presolve)(void*,KSP,Vec,Vec))
3267cdd61b2SBarry Smith {
3277cdd61b2SBarry Smith   PC_Shell *shell;
3287cdd61b2SBarry Smith 
3297cdd61b2SBarry Smith   PetscFunctionBegin;
3307cdd61b2SBarry Smith   shell           = (PC_Shell*)pc->data;
3317cdd61b2SBarry Smith   shell->presolve = presolve;
332d01c8aa3SLisandro Dalcin   if (presolve) pc->ops->presolve = PCPreSolve_Shell;
333d01c8aa3SLisandro Dalcin   else          pc->ops->presolve = 0;
3347cdd61b2SBarry Smith   PetscFunctionReturn(0);
3357cdd61b2SBarry Smith }
3367cdd61b2SBarry Smith EXTERN_C_END
3377cdd61b2SBarry Smith 
3387cdd61b2SBarry Smith EXTERN_C_BEGIN
3397cdd61b2SBarry Smith #undef __FUNCT__
3407cdd61b2SBarry Smith #define __FUNCT__ "PCShellSetPostSolve_Shell"
341be29d3c6SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetPostSolve_Shell(PC pc,PetscErrorCode (*postsolve)(void*,KSP,Vec,Vec))
3427cdd61b2SBarry Smith {
3437cdd61b2SBarry Smith   PC_Shell *shell;
3447cdd61b2SBarry Smith 
3457cdd61b2SBarry Smith   PetscFunctionBegin;
3467cdd61b2SBarry Smith   shell            = (PC_Shell*)pc->data;
3477cdd61b2SBarry Smith   shell->postsolve = postsolve;
348d01c8aa3SLisandro Dalcin   if (postsolve) pc->ops->postsolve = PCPostSolve_Shell;
349d01c8aa3SLisandro Dalcin   else           pc->ops->postsolve = 0;
3507cdd61b2SBarry Smith   PetscFunctionReturn(0);
3517cdd61b2SBarry Smith }
3527cdd61b2SBarry Smith EXTERN_C_END
3537cdd61b2SBarry Smith 
3547cdd61b2SBarry Smith EXTERN_C_BEGIN
3557cdd61b2SBarry Smith #undef __FUNCT__
3564b9ad928SBarry Smith #define __FUNCT__ "PCShellSetView_Shell"
357dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetView_Shell(PC pc,PetscErrorCode (*view)(void*,PetscViewer))
3584b9ad928SBarry Smith {
3594b9ad928SBarry Smith   PC_Shell *shell;
3604b9ad928SBarry Smith 
3614b9ad928SBarry Smith   PetscFunctionBegin;
3624b9ad928SBarry Smith   shell        = (PC_Shell*)pc->data;
3634b9ad928SBarry Smith   shell->view = view;
3644b9ad928SBarry Smith   PetscFunctionReturn(0);
3654b9ad928SBarry Smith }
3664b9ad928SBarry Smith EXTERN_C_END
3674b9ad928SBarry Smith 
3684b9ad928SBarry Smith EXTERN_C_BEGIN
3694b9ad928SBarry Smith #undef __FUNCT__
3704b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApplyTranspose_Shell"
371dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApplyTranspose_Shell(PC pc,PetscErrorCode (*applytranspose)(void*,Vec,Vec))
3724b9ad928SBarry Smith {
3734b9ad928SBarry Smith   PC_Shell *shell;
3744b9ad928SBarry Smith 
3754b9ad928SBarry Smith   PetscFunctionBegin;
3764b9ad928SBarry Smith   shell                 = (PC_Shell*)pc->data;
3774b9ad928SBarry Smith   shell->applytranspose = applytranspose;
378d01c8aa3SLisandro Dalcin   if (applytranspose) pc->ops->applytranspose = PCApplyTranspose_Shell;
379d01c8aa3SLisandro Dalcin   else                pc->ops->applytranspose = 0;
380d01c8aa3SLisandro Dalcin   PetscFunctionReturn(0);
381d01c8aa3SLisandro Dalcin }
382d01c8aa3SLisandro Dalcin EXTERN_C_END
383d01c8aa3SLisandro Dalcin 
384d01c8aa3SLisandro Dalcin EXTERN_C_BEGIN
385d01c8aa3SLisandro Dalcin #undef __FUNCT__
386d01c8aa3SLisandro Dalcin #define __FUNCT__ "PCShellSetApplyRichardson_Shell"
387d01c8aa3SLisandro Dalcin PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApplyRichardson_Shell(PC pc,PetscErrorCode (*applyrich)(void*,Vec,Vec,Vec,PetscReal,PetscReal,PetscReal,PetscInt))
388d01c8aa3SLisandro Dalcin {
389d01c8aa3SLisandro Dalcin   PC_Shell *shell;
390d01c8aa3SLisandro Dalcin 
391d01c8aa3SLisandro Dalcin   PetscFunctionBegin;
392d01c8aa3SLisandro Dalcin   shell            = (PC_Shell*)pc->data;
393d01c8aa3SLisandro Dalcin   shell->applyrich = applyrich;
394d01c8aa3SLisandro Dalcin   if (applyrich) pc->ops->applyrichardson  = PCApplyRichardson_Shell;
395d01c8aa3SLisandro Dalcin   else           pc->ops->applyrichardson  = 0;
3964b9ad928SBarry Smith   PetscFunctionReturn(0);
3974b9ad928SBarry Smith }
3984b9ad928SBarry Smith EXTERN_C_END
3994b9ad928SBarry Smith 
4004b9ad928SBarry Smith EXTERN_C_BEGIN
4014b9ad928SBarry Smith #undef __FUNCT__
4024b9ad928SBarry Smith #define __FUNCT__ "PCShellSetName_Shell"
403dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetName_Shell(PC pc,const char name[])
4044b9ad928SBarry Smith {
4054b9ad928SBarry Smith   PC_Shell       *shell;
406dfbe8321SBarry Smith   PetscErrorCode ierr;
4074b9ad928SBarry Smith 
4084b9ad928SBarry Smith   PetscFunctionBegin;
4094b9ad928SBarry Smith   shell = (PC_Shell*)pc->data;
410f259bd47SBarry Smith   ierr = PetscStrfree(shell->name);CHKERRQ(ierr);
4114b9ad928SBarry Smith   ierr = PetscStrallocpy(name,&shell->name);CHKERRQ(ierr);
4124b9ad928SBarry Smith   PetscFunctionReturn(0);
4134b9ad928SBarry Smith }
4144b9ad928SBarry Smith EXTERN_C_END
4154b9ad928SBarry Smith 
4164b9ad928SBarry Smith EXTERN_C_BEGIN
4174b9ad928SBarry Smith #undef __FUNCT__
4184b9ad928SBarry Smith #define __FUNCT__ "PCShellGetName_Shell"
419dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellGetName_Shell(PC pc,char *name[])
4204b9ad928SBarry Smith {
4214b9ad928SBarry Smith   PC_Shell *shell;
4224b9ad928SBarry Smith 
4234b9ad928SBarry Smith   PetscFunctionBegin;
4244b9ad928SBarry Smith   shell  = (PC_Shell*)pc->data;
4254b9ad928SBarry Smith   *name  = shell->name;
4264b9ad928SBarry Smith   PetscFunctionReturn(0);
4274b9ad928SBarry Smith }
4284b9ad928SBarry Smith EXTERN_C_END
4294b9ad928SBarry Smith 
4304b9ad928SBarry Smith /* -------------------------------------------------------------------------------*/
4314b9ad928SBarry Smith 
4324b9ad928SBarry Smith #undef __FUNCT__
43318be62a5SSatish Balay #define __FUNCT__ "PCShellSetDestroy"
43418be62a5SSatish Balay /*@C
43518be62a5SSatish Balay    PCShellSetDestroy - Sets routine to use to destroy the user-provided
43618be62a5SSatish Balay    application context.
43718be62a5SSatish Balay 
43818be62a5SSatish Balay    Collective on PC
43918be62a5SSatish Balay 
44018be62a5SSatish Balay    Input Parameters:
44118be62a5SSatish Balay +  pc - the preconditioner context
44218be62a5SSatish Balay .  destroy - the application-provided destroy routine
44318be62a5SSatish Balay 
44418be62a5SSatish Balay    Calling sequence of destroy:
44518be62a5SSatish Balay .vb
44618be62a5SSatish Balay    PetscErrorCode destroy (void *ptr)
44718be62a5SSatish Balay .ve
44818be62a5SSatish Balay 
44918be62a5SSatish Balay .  ptr - the application context
45018be62a5SSatish Balay 
45118be62a5SSatish Balay    Level: developer
45218be62a5SSatish Balay 
45318be62a5SSatish Balay .keywords: PC, shell, set, destroy, user-provided
45418be62a5SSatish Balay 
45518be62a5SSatish Balay .seealso: PCShellSetApply(), PCShellSetContext()
45618be62a5SSatish Balay @*/
45718be62a5SSatish Balay PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetDestroy(PC pc,PetscErrorCode (*destroy)(void*))
45818be62a5SSatish Balay {
45918be62a5SSatish Balay   PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*));
46018be62a5SSatish Balay 
46118be62a5SSatish Balay   PetscFunctionBegin;
46218be62a5SSatish Balay   PetscValidHeaderSpecific(pc,PC_COOKIE,1);
46318be62a5SSatish Balay   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetDestroy_C",(void (**)(void))&f);CHKERRQ(ierr);
46418be62a5SSatish Balay   if (f) {
46518be62a5SSatish Balay     ierr = (*f)(pc,destroy);CHKERRQ(ierr);
46618be62a5SSatish Balay   }
46718be62a5SSatish Balay   PetscFunctionReturn(0);
46818be62a5SSatish Balay }
46918be62a5SSatish Balay 
47018be62a5SSatish Balay 
47118be62a5SSatish Balay #undef __FUNCT__
4724b9ad928SBarry Smith #define __FUNCT__ "PCShellSetSetUp"
4734b9ad928SBarry Smith /*@C
4744b9ad928SBarry Smith    PCShellSetSetUp - Sets routine to use to "setup" the preconditioner whenever the
4754b9ad928SBarry Smith    matrix operator is changed.
4764b9ad928SBarry Smith 
4774b9ad928SBarry Smith    Collective on PC
4784b9ad928SBarry Smith 
4794b9ad928SBarry Smith    Input Parameters:
4804b9ad928SBarry Smith +  pc - the preconditioner context
4814b9ad928SBarry Smith .  setup - the application-provided setup routine
4824b9ad928SBarry Smith 
4834b9ad928SBarry Smith    Calling sequence of setup:
4844b9ad928SBarry Smith .vb
48513f74950SBarry Smith    PetscErrorCode setup (void *ptr)
4864b9ad928SBarry Smith .ve
4874b9ad928SBarry Smith 
4884b9ad928SBarry Smith .  ptr - the application context
4894b9ad928SBarry Smith 
4904b9ad928SBarry Smith    Level: developer
4914b9ad928SBarry Smith 
4924b9ad928SBarry Smith .keywords: PC, shell, set, setup, user-provided
4934b9ad928SBarry Smith 
494be29d3c6SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetApply(), PCShellSetContext()
4954b9ad928SBarry Smith @*/
496dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetSetUp(PC pc,PetscErrorCode (*setup)(void*))
4974b9ad928SBarry Smith {
4986849ba73SBarry Smith   PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*));
4994b9ad928SBarry Smith 
5004b9ad928SBarry Smith   PetscFunctionBegin;
5014482741eSBarry Smith   PetscValidHeaderSpecific(pc,PC_COOKIE,1);
5024b9ad928SBarry Smith   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetSetUp_C",(void (**)(void))&f);CHKERRQ(ierr);
5034b9ad928SBarry Smith   if (f) {
5044b9ad928SBarry Smith     ierr = (*f)(pc,setup);CHKERRQ(ierr);
5054b9ad928SBarry Smith   }
5064b9ad928SBarry Smith   PetscFunctionReturn(0);
5074b9ad928SBarry Smith }
5084b9ad928SBarry Smith 
5094b9ad928SBarry Smith 
5104b9ad928SBarry Smith #undef __FUNCT__
5114b9ad928SBarry Smith #define __FUNCT__ "PCShellSetView"
5124b9ad928SBarry Smith /*@C
5134b9ad928SBarry Smith    PCShellSetView - Sets routine to use as viewer of shell preconditioner
5144b9ad928SBarry Smith 
5154b9ad928SBarry Smith    Collective on PC
5164b9ad928SBarry Smith 
5174b9ad928SBarry Smith    Input Parameters:
5184b9ad928SBarry Smith +  pc - the preconditioner context
5194b9ad928SBarry Smith -  view - the application-provided view routine
5204b9ad928SBarry Smith 
5214b9ad928SBarry Smith    Calling sequence of apply:
5224b9ad928SBarry Smith .vb
52313f74950SBarry Smith    PetscErrorCode view(void *ptr,PetscViewer v)
5244b9ad928SBarry Smith .ve
5254b9ad928SBarry Smith 
5264b9ad928SBarry Smith +  ptr - the application context
5274b9ad928SBarry Smith -  v   - viewer
5284b9ad928SBarry Smith 
5294b9ad928SBarry Smith    Level: developer
5304b9ad928SBarry Smith 
5314b9ad928SBarry Smith .keywords: PC, shell, set, apply, user-provided
5324b9ad928SBarry Smith 
5334b9ad928SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose()
5344b9ad928SBarry Smith @*/
535dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetView(PC pc,PetscErrorCode (*view)(void*,PetscViewer))
5364b9ad928SBarry Smith {
5376849ba73SBarry Smith   PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*,PetscViewer));
5384b9ad928SBarry Smith 
5394b9ad928SBarry Smith   PetscFunctionBegin;
5404482741eSBarry Smith   PetscValidHeaderSpecific(pc,PC_COOKIE,1);
5414b9ad928SBarry Smith   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetView_C",(void (**)(void))&f);CHKERRQ(ierr);
5424b9ad928SBarry Smith   if (f) {
5434b9ad928SBarry Smith     ierr = (*f)(pc,view);CHKERRQ(ierr);
5444b9ad928SBarry Smith   }
5454b9ad928SBarry Smith   PetscFunctionReturn(0);
5464b9ad928SBarry Smith }
5474b9ad928SBarry Smith 
5484b9ad928SBarry Smith #undef __FUNCT__
5494b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApply"
5504b9ad928SBarry Smith /*@C
5514b9ad928SBarry Smith    PCShellSetApply - Sets routine to use as preconditioner.
5524b9ad928SBarry Smith 
5534b9ad928SBarry Smith    Collective on PC
5544b9ad928SBarry Smith 
5554b9ad928SBarry Smith    Input Parameters:
5564b9ad928SBarry Smith +  pc - the preconditioner context
557be29d3c6SBarry Smith -  apply - the application-provided preconditioning routine
5584b9ad928SBarry Smith 
5594b9ad928SBarry Smith    Calling sequence of apply:
5604b9ad928SBarry Smith .vb
56113f74950SBarry Smith    PetscErrorCode apply (void *ptr,Vec xin,Vec xout)
5624b9ad928SBarry Smith .ve
5634b9ad928SBarry Smith 
5644b9ad928SBarry Smith +  ptr - the application context
5654b9ad928SBarry Smith .  xin - input vector
5664b9ad928SBarry Smith -  xout - output vector
5674b9ad928SBarry Smith 
5684b9ad928SBarry Smith    Level: developer
5694b9ad928SBarry Smith 
5704b9ad928SBarry Smith .keywords: PC, shell, set, apply, user-provided
5714b9ad928SBarry Smith 
5722bb17772SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose(), PCShellSetContext(), PCShellSetApplyBA()
5734b9ad928SBarry Smith @*/
574be29d3c6SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApply(PC pc,PetscErrorCode (*apply)(void*,Vec,Vec))
5754b9ad928SBarry Smith {
576be29d3c6SBarry Smith   PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*,Vec,Vec));
5774b9ad928SBarry Smith 
5784b9ad928SBarry Smith   PetscFunctionBegin;
5794482741eSBarry Smith   PetscValidHeaderSpecific(pc,PC_COOKIE,1);
5804b9ad928SBarry Smith   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetApply_C",(void (**)(void))&f);CHKERRQ(ierr);
5814b9ad928SBarry Smith   if (f) {
582be29d3c6SBarry Smith     ierr = (*f)(pc,apply);CHKERRQ(ierr);
5834b9ad928SBarry Smith   }
5844b9ad928SBarry Smith   PetscFunctionReturn(0);
5854b9ad928SBarry Smith }
5864b9ad928SBarry Smith 
5874b9ad928SBarry Smith #undef __FUNCT__
5882bb17772SBarry Smith #define __FUNCT__ "PCShellSetApplyBA"
5892bb17772SBarry Smith /*@C
5902bb17772SBarry Smith    PCShellSetApplyBA - Sets routine to use as preconditioner times operator.
5912bb17772SBarry Smith 
5922bb17772SBarry Smith    Collective on PC
5932bb17772SBarry Smith 
5942bb17772SBarry Smith    Input Parameters:
5952bb17772SBarry Smith +  pc - the preconditioner context
5962bb17772SBarry Smith -  applyBA - the application-provided BA routine
5972bb17772SBarry Smith 
5982bb17772SBarry Smith    Calling sequence of apply:
5992bb17772SBarry Smith .vb
6002bb17772SBarry Smith    PetscErrorCode applyBA (void *ptr,Vec xin,Vec xout)
6012bb17772SBarry Smith .ve
6022bb17772SBarry Smith 
6032bb17772SBarry Smith +  ptr - the application context
6042bb17772SBarry Smith .  xin - input vector
6052bb17772SBarry Smith -  xout - output vector
6062bb17772SBarry Smith 
6072bb17772SBarry Smith    Level: developer
6082bb17772SBarry Smith 
6092bb17772SBarry Smith .keywords: PC, shell, set, apply, user-provided
6102bb17772SBarry Smith 
6112bb17772SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose(), PCShellSetContext(), PCShellSetApply()
6122bb17772SBarry Smith @*/
6132bb17772SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApplyBA(PC pc,PetscErrorCode (*applyBA)(void*,PCSide,Vec,Vec,Vec))
6142bb17772SBarry Smith {
6152bb17772SBarry Smith   PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*,PCSide,Vec,Vec,Vec));
6162bb17772SBarry Smith 
6172bb17772SBarry Smith   PetscFunctionBegin;
6182bb17772SBarry Smith   PetscValidHeaderSpecific(pc,PC_COOKIE,1);
6192bb17772SBarry Smith   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetApplyBA_C",(void (**)(void))&f);CHKERRQ(ierr);
6202bb17772SBarry Smith   if (f) {
6212bb17772SBarry Smith     ierr = (*f)(pc,applyBA);CHKERRQ(ierr);
6222bb17772SBarry Smith   }
6232bb17772SBarry Smith   PetscFunctionReturn(0);
6242bb17772SBarry Smith }
6252bb17772SBarry Smith 
6262bb17772SBarry Smith #undef __FUNCT__
6274b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApplyTranspose"
6284b9ad928SBarry Smith /*@C
6294b9ad928SBarry Smith    PCShellSetApplyTranspose - Sets routine to use as preconditioner transpose.
6304b9ad928SBarry Smith 
6314b9ad928SBarry Smith    Collective on PC
6324b9ad928SBarry Smith 
6334b9ad928SBarry Smith    Input Parameters:
6344b9ad928SBarry Smith +  pc - the preconditioner context
6354b9ad928SBarry Smith -  apply - the application-provided preconditioning transpose routine
6364b9ad928SBarry Smith 
6374b9ad928SBarry Smith    Calling sequence of apply:
6384b9ad928SBarry Smith .vb
63913f74950SBarry Smith    PetscErrorCode applytranspose (void *ptr,Vec xin,Vec xout)
6404b9ad928SBarry Smith .ve
6414b9ad928SBarry Smith 
6424b9ad928SBarry Smith +  ptr - the application context
6434b9ad928SBarry Smith .  xin - input vector
6444b9ad928SBarry Smith -  xout - output vector
6454b9ad928SBarry Smith 
6464b9ad928SBarry Smith    Level: developer
6474b9ad928SBarry Smith 
6484b9ad928SBarry Smith    Notes:
6494b9ad928SBarry Smith    Uses the same context variable as PCShellSetApply().
6504b9ad928SBarry Smith 
6514b9ad928SBarry Smith .keywords: PC, shell, set, apply, user-provided
6524b9ad928SBarry Smith 
6532bb17772SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApply(), PCSetContext(), PCShellSetApplyBA()
6544b9ad928SBarry Smith @*/
655dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApplyTranspose(PC pc,PetscErrorCode (*applytranspose)(void*,Vec,Vec))
6564b9ad928SBarry Smith {
6576849ba73SBarry Smith   PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*,Vec,Vec));
6584b9ad928SBarry Smith 
6594b9ad928SBarry Smith   PetscFunctionBegin;
6604482741eSBarry Smith   PetscValidHeaderSpecific(pc,PC_COOKIE,1);
6614b9ad928SBarry Smith   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetApplyTranspose_C",(void (**)(void))&f);CHKERRQ(ierr);
6624b9ad928SBarry Smith   if (f) {
6634b9ad928SBarry Smith     ierr = (*f)(pc,applytranspose);CHKERRQ(ierr);
6644b9ad928SBarry Smith   }
6654b9ad928SBarry Smith   PetscFunctionReturn(0);
6664b9ad928SBarry Smith }
6674b9ad928SBarry Smith 
6684b9ad928SBarry Smith #undef __FUNCT__
6697cdd61b2SBarry Smith #define __FUNCT__ "PCShellSetPreSolve"
6707cdd61b2SBarry Smith /*@C
6717cdd61b2SBarry Smith    PCShellSetPreSolve - Sets routine to apply to the operators/vectors before a KSPSolve() is
6727cdd61b2SBarry Smith       applied. This usually does something like scale the linear system in some application
6737cdd61b2SBarry Smith       specific way.
6747cdd61b2SBarry Smith 
6757cdd61b2SBarry Smith    Collective on PC
6767cdd61b2SBarry Smith 
6777cdd61b2SBarry Smith    Input Parameters:
6787cdd61b2SBarry Smith +  pc - the preconditioner context
6797cdd61b2SBarry Smith -  presolve - the application-provided presolve routine
6807cdd61b2SBarry Smith 
6817cdd61b2SBarry Smith    Calling sequence of presolve:
6827cdd61b2SBarry Smith .vb
6837cdd61b2SBarry Smith    PetscErrorCode presolve (void *ptr,KSP ksp,Vec b,Vec x)
6847cdd61b2SBarry Smith .ve
6857cdd61b2SBarry Smith 
6867cdd61b2SBarry Smith +  ptr - the application context
6877cdd61b2SBarry Smith .  xin - input vector
6887cdd61b2SBarry Smith -  xout - output vector
6897cdd61b2SBarry Smith 
6907cdd61b2SBarry Smith    Level: developer
6917cdd61b2SBarry Smith 
6927cdd61b2SBarry Smith .keywords: PC, shell, set, apply, user-provided
6937cdd61b2SBarry Smith 
694be29d3c6SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose(), PCShellSetPostSolve(), PCShellSetContext()
6957cdd61b2SBarry Smith @*/
6967cdd61b2SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetPreSolve(PC pc,PetscErrorCode (*presolve)(void*,KSP,Vec,Vec))
6977cdd61b2SBarry Smith {
6987cdd61b2SBarry Smith   PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*,KSP,Vec,Vec));
6997cdd61b2SBarry Smith 
7007cdd61b2SBarry Smith   PetscFunctionBegin;
7017cdd61b2SBarry Smith   PetscValidHeaderSpecific(pc,PC_COOKIE,1);
7027cdd61b2SBarry Smith   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetPreSolve_C",(void (**)(void))&f);CHKERRQ(ierr);
7037cdd61b2SBarry Smith   if (f) {
7047cdd61b2SBarry Smith     ierr = (*f)(pc,presolve);CHKERRQ(ierr);
7057cdd61b2SBarry Smith   }
7067cdd61b2SBarry Smith   PetscFunctionReturn(0);
7077cdd61b2SBarry Smith }
7087cdd61b2SBarry Smith 
7097cdd61b2SBarry Smith #undef __FUNCT__
7107cdd61b2SBarry Smith #define __FUNCT__ "PCShellSetPostSolve"
7117cdd61b2SBarry Smith /*@C
7127cdd61b2SBarry Smith    PCShellSetPostSolve - Sets routine to apply to the operators/vectors before a KSPSolve() is
7137cdd61b2SBarry Smith       applied. This usually does something like scale the linear system in some application
7147cdd61b2SBarry Smith       specific way.
7157cdd61b2SBarry Smith 
7167cdd61b2SBarry Smith    Collective on PC
7177cdd61b2SBarry Smith 
7187cdd61b2SBarry Smith    Input Parameters:
7197cdd61b2SBarry Smith +  pc - the preconditioner context
7207cdd61b2SBarry Smith -  postsolve - the application-provided presolve routine
7217cdd61b2SBarry Smith 
7227cdd61b2SBarry Smith    Calling sequence of postsolve:
7237cdd61b2SBarry Smith .vb
7247cdd61b2SBarry Smith    PetscErrorCode postsolve(void *ptr,KSP ksp,Vec b,Vec x)
7257cdd61b2SBarry Smith .ve
7267cdd61b2SBarry Smith 
7277cdd61b2SBarry Smith +  ptr - the application context
7287cdd61b2SBarry Smith .  xin - input vector
7297cdd61b2SBarry Smith -  xout - output vector
7307cdd61b2SBarry Smith 
7317cdd61b2SBarry Smith    Level: developer
7327cdd61b2SBarry Smith 
7337cdd61b2SBarry Smith .keywords: PC, shell, set, apply, user-provided
7347cdd61b2SBarry Smith 
735be29d3c6SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose(), PCShellSetPreSolve(), PCShellSetContext()
7367cdd61b2SBarry Smith @*/
7377cdd61b2SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetPostSolve(PC pc,PetscErrorCode (*postsolve)(void*,KSP,Vec,Vec))
7387cdd61b2SBarry Smith {
7397cdd61b2SBarry Smith   PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*,KSP,Vec,Vec));
7407cdd61b2SBarry Smith 
7417cdd61b2SBarry Smith   PetscFunctionBegin;
7427cdd61b2SBarry Smith   PetscValidHeaderSpecific(pc,PC_COOKIE,1);
7437cdd61b2SBarry Smith   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetPostSolve_C",(void (**)(void))&f);CHKERRQ(ierr);
7447cdd61b2SBarry Smith   if (f) {
7457cdd61b2SBarry Smith     ierr = (*f)(pc,postsolve);CHKERRQ(ierr);
7467cdd61b2SBarry Smith   }
7477cdd61b2SBarry Smith   PetscFunctionReturn(0);
7487cdd61b2SBarry Smith }
7497cdd61b2SBarry Smith 
7507cdd61b2SBarry Smith #undef __FUNCT__
7514b9ad928SBarry Smith #define __FUNCT__ "PCShellSetName"
7524b9ad928SBarry Smith /*@C
7534b9ad928SBarry Smith    PCShellSetName - Sets an optional name to associate with a shell
7544b9ad928SBarry Smith    preconditioner.
7554b9ad928SBarry Smith 
7564b9ad928SBarry Smith    Not Collective
7574b9ad928SBarry Smith 
7584b9ad928SBarry Smith    Input Parameters:
7594b9ad928SBarry Smith +  pc - the preconditioner context
7604b9ad928SBarry Smith -  name - character string describing shell preconditioner
7614b9ad928SBarry Smith 
7624b9ad928SBarry Smith    Level: developer
7634b9ad928SBarry Smith 
7644b9ad928SBarry Smith .keywords: PC, shell, set, name, user-provided
7654b9ad928SBarry Smith 
7664b9ad928SBarry Smith .seealso: PCShellGetName()
7674b9ad928SBarry Smith @*/
768dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetName(PC pc,const char name[])
7694b9ad928SBarry Smith {
770dfbe8321SBarry Smith   PetscErrorCode ierr,(*f)(PC,const char []);
7714b9ad928SBarry Smith 
7724b9ad928SBarry Smith   PetscFunctionBegin;
7734482741eSBarry Smith   PetscValidHeaderSpecific(pc,PC_COOKIE,1);
7744b9ad928SBarry Smith   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetName_C",(void (**)(void))&f);CHKERRQ(ierr);
7754b9ad928SBarry Smith   if (f) {
7764b9ad928SBarry Smith     ierr = (*f)(pc,name);CHKERRQ(ierr);
7774b9ad928SBarry Smith   }
7784b9ad928SBarry Smith   PetscFunctionReturn(0);
7794b9ad928SBarry Smith }
7804b9ad928SBarry Smith 
7814b9ad928SBarry Smith #undef __FUNCT__
7824b9ad928SBarry Smith #define __FUNCT__ "PCShellGetName"
7834b9ad928SBarry Smith /*@C
7844b9ad928SBarry Smith    PCShellGetName - Gets an optional name that the user has set for a shell
7854b9ad928SBarry Smith    preconditioner.
7864b9ad928SBarry Smith 
7874b9ad928SBarry Smith    Not Collective
7884b9ad928SBarry Smith 
7894b9ad928SBarry Smith    Input Parameter:
7904b9ad928SBarry Smith .  pc - the preconditioner context
7914b9ad928SBarry Smith 
7924b9ad928SBarry Smith    Output Parameter:
7934b9ad928SBarry Smith .  name - character string describing shell preconditioner (you should not free this)
7944b9ad928SBarry Smith 
7954b9ad928SBarry Smith    Level: developer
7964b9ad928SBarry Smith 
7974b9ad928SBarry Smith .keywords: PC, shell, get, name, user-provided
7984b9ad928SBarry Smith 
7994b9ad928SBarry Smith .seealso: PCShellSetName()
8004b9ad928SBarry Smith @*/
801dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellGetName(PC pc,char *name[])
8024b9ad928SBarry Smith {
803dfbe8321SBarry Smith   PetscErrorCode ierr,(*f)(PC,char *[]);
8044b9ad928SBarry Smith 
8054b9ad928SBarry Smith   PetscFunctionBegin;
8064482741eSBarry Smith   PetscValidHeaderSpecific(pc,PC_COOKIE,1);
8074482741eSBarry Smith   PetscValidPointer(name,2);
8084b9ad928SBarry Smith   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellGetName_C",(void (**)(void))&f);CHKERRQ(ierr);
8094b9ad928SBarry Smith   if (f) {
8104b9ad928SBarry Smith     ierr = (*f)(pc,name);CHKERRQ(ierr);
8114b9ad928SBarry Smith   } else {
8121302d50aSBarry Smith     SETERRQ(PETSC_ERR_ARG_WRONG,"Not shell preconditioner, cannot get name");
8134b9ad928SBarry Smith   }
8144b9ad928SBarry Smith   PetscFunctionReturn(0);
8154b9ad928SBarry Smith }
8164b9ad928SBarry Smith 
8174b9ad928SBarry Smith #undef __FUNCT__
8184b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApplyRichardson"
8194b9ad928SBarry Smith /*@C
8204b9ad928SBarry Smith    PCShellSetApplyRichardson - Sets routine to use as preconditioner
8214b9ad928SBarry Smith    in Richardson iteration.
8224b9ad928SBarry Smith 
8234b9ad928SBarry Smith    Collective on PC
8244b9ad928SBarry Smith 
8254b9ad928SBarry Smith    Input Parameters:
8264b9ad928SBarry Smith +  pc - the preconditioner context
827be29d3c6SBarry Smith -  apply - the application-provided preconditioning routine
8284b9ad928SBarry Smith 
8294b9ad928SBarry Smith    Calling sequence of apply:
8304b9ad928SBarry Smith .vb
83113f74950SBarry Smith    PetscErrorCode apply (void *ptr,Vec b,Vec x,Vec r,PetscReal rtol,PetscReal abstol,PetscReal dtol,PetscInt maxits)
8324b9ad928SBarry Smith .ve
8334b9ad928SBarry Smith 
8344b9ad928SBarry Smith +  ptr - the application context
8354b9ad928SBarry Smith .  b - right-hand-side
8364b9ad928SBarry Smith .  x - current iterate
8374b9ad928SBarry Smith .  r - work space
8384b9ad928SBarry Smith .  rtol - relative tolerance of residual norm to stop at
83970441072SBarry Smith .  abstol - absolute tolerance of residual norm to stop at
8404b9ad928SBarry Smith .  dtol - if residual norm increases by this factor than return
8414b9ad928SBarry Smith -  maxits - number of iterations to run
8424b9ad928SBarry Smith 
8434b9ad928SBarry Smith    Level: developer
8444b9ad928SBarry Smith 
8454b9ad928SBarry Smith .keywords: PC, shell, set, apply, Richardson, user-provided
8464b9ad928SBarry Smith 
847be29d3c6SBarry Smith .seealso: PCShellSetApply(), PCShellSetContext()
8484b9ad928SBarry Smith @*/
849be29d3c6SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApplyRichardson(PC pc,PetscErrorCode (*apply)(void*,Vec,Vec,Vec,PetscReal,PetscReal,PetscReal,PetscInt))
8504b9ad928SBarry Smith {
851be29d3c6SBarry Smith   PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*,Vec,Vec,Vec,PetscReal,PetscReal,PetscReal,PetscInt));
8524b9ad928SBarry Smith 
8534b9ad928SBarry Smith   PetscFunctionBegin;
8544482741eSBarry Smith   PetscValidHeaderSpecific(pc,PC_COOKIE,1);
8554b9ad928SBarry Smith   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetApplyRichardson_C",(void (**)(void))&f);CHKERRQ(ierr);
8564b9ad928SBarry Smith   if (f) {
857be29d3c6SBarry Smith     ierr = (*f)(pc,apply);CHKERRQ(ierr);
8584b9ad928SBarry Smith   }
8594b9ad928SBarry Smith   PetscFunctionReturn(0);
8604b9ad928SBarry Smith }
8614b9ad928SBarry Smith 
8624b9ad928SBarry Smith /*MC
8634b9ad928SBarry Smith    PCSHELL - Creates a new preconditioner class for use with your
8644b9ad928SBarry Smith               own private data storage format.
8654b9ad928SBarry Smith 
8664b9ad928SBarry Smith    Level: advanced
86790198e61SBarry Smith >
8684b9ad928SBarry Smith    Concepts: providing your own preconditioner
8694b9ad928SBarry Smith 
8704b9ad928SBarry Smith   Usage:
8716849ba73SBarry Smith $             PetscErrorCode (*mult)(void*,Vec,Vec);
8726849ba73SBarry Smith $             PetscErrorCode (*setup)(void*);
8734b9ad928SBarry Smith $             PCCreate(comm,&pc);
8744b9ad928SBarry Smith $             PCSetType(pc,PCSHELL);
875d01c8aa3SLisandro Dalcin $             PCShellSetApply(pc,apply);
876d01c8aa3SLisandro Dalcin $             PCShellSetApplyBA(pc,apply); (optional)
877d01c8aa3SLisandro Dalcin $             PCShellSetApplyTranspose(pc,apply); (optional)
878be29d3c6SBarry Smith $             PCShellSetContext(pc,ctx)
8794b9ad928SBarry Smith $             PCShellSetSetUp(pc,setup); (optional)
880d01c8aa3SLisandro Dalcin $             PCShellSetDestroy(pc,destroy); (optional)
8814b9ad928SBarry Smith 
8824b9ad928SBarry Smith .seealso:  PCCreate(), PCSetType(), PCType (for list of available types), PC,
883fd2d0fe1Svictor            MATSHELL, PCShellSetSetUp(), PCShellSetApply(), PCShellSetView(),
884fd2d0fe1Svictor            PCShellSetApplyTranspose(), PCShellSetName(), PCShellSetApplyRichardson(),
8852bb17772SBarry Smith            PCShellGetName(), PCShellSetContext(), PCShellGetContext(), PCShellSetApplyBA()
8864b9ad928SBarry Smith M*/
8874b9ad928SBarry Smith 
8884b9ad928SBarry Smith EXTERN_C_BEGIN
8894b9ad928SBarry Smith #undef __FUNCT__
8904b9ad928SBarry Smith #define __FUNCT__ "PCCreate_Shell"
891dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCCreate_Shell(PC pc)
8924b9ad928SBarry Smith {
893dfbe8321SBarry Smith   PetscErrorCode ierr;
8944b9ad928SBarry Smith   PC_Shell       *shell;
8954b9ad928SBarry Smith 
8964b9ad928SBarry Smith   PetscFunctionBegin;
897*38f2d2fdSLisandro Dalcin   ierr = PetscNewLog(pc,PC_Shell,&shell);CHKERRQ(ierr);
8984b9ad928SBarry Smith   pc->data  = (void*)shell;
8994b9ad928SBarry Smith   pc->name  = 0;
9004b9ad928SBarry Smith 
901d01c8aa3SLisandro Dalcin   pc->ops->destroy         = PCDestroy_Shell;
9024b9ad928SBarry Smith   pc->ops->view            = PCView_Shell;
903d01c8aa3SLisandro Dalcin   pc->ops->apply           = PCApply_Shell;
904d01c8aa3SLisandro Dalcin   pc->ops->applytranspose  = 0;
9054b9ad928SBarry Smith   pc->ops->applyrichardson = 0;
906d01c8aa3SLisandro Dalcin   pc->ops->setup           = 0;
9079bbb2c88SBarry Smith   pc->ops->presolve        = 0;
9089bbb2c88SBarry Smith   pc->ops->postsolve       = 0;
9094b9ad928SBarry Smith 
9104b9ad928SBarry Smith   shell->apply          = 0;
9114b9ad928SBarry Smith   shell->applytranspose = 0;
9124b9ad928SBarry Smith   shell->name           = 0;
9134b9ad928SBarry Smith   shell->applyrich      = 0;
9147cdd61b2SBarry Smith   shell->presolve       = 0;
9157cdd61b2SBarry Smith   shell->postsolve      = 0;
9164b9ad928SBarry Smith   shell->ctx            = 0;
9174b9ad928SBarry Smith   shell->setup          = 0;
9184b9ad928SBarry Smith   shell->view           = 0;
91918be62a5SSatish Balay   shell->destroy        = 0;
9204b9ad928SBarry Smith 
92118be62a5SSatish Balay   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetDestroy_C","PCShellSetDestroy_Shell",
92218be62a5SSatish Balay                     PCShellSetDestroy_Shell);CHKERRQ(ierr);
9234b9ad928SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetSetUp_C","PCShellSetSetUp_Shell",
9244b9ad928SBarry Smith                     PCShellSetSetUp_Shell);CHKERRQ(ierr);
9254b9ad928SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetApply_C","PCShellSetApply_Shell",
9264b9ad928SBarry Smith                     PCShellSetApply_Shell);CHKERRQ(ierr);
9272bb17772SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetApplyBA_C","PCShellSetApplyBA_Shell",
9282bb17772SBarry Smith                     PCShellSetApplyBA_Shell);CHKERRQ(ierr);
9297cdd61b2SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetPreSolve_C","PCShellSetPreSolve_Shell",
9307cdd61b2SBarry Smith                     PCShellSetPreSolve_Shell);CHKERRQ(ierr);
9317cdd61b2SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetPostSolve_C","PCShellSetPostSolve_Shell",
9327cdd61b2SBarry Smith                     PCShellSetPostSolve_Shell);CHKERRQ(ierr);
9334b9ad928SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetView_C","PCShellSetView_Shell",
9344b9ad928SBarry Smith                     PCShellSetView_Shell);CHKERRQ(ierr);
935be29d3c6SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetApplyTranspose_C","PCShellSetApplyTranspose_Shell",
9364b9ad928SBarry Smith                     PCShellSetApplyTranspose_Shell);CHKERRQ(ierr);
9374b9ad928SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetName_C","PCShellSetName_Shell",
9384b9ad928SBarry Smith                     PCShellSetName_Shell);CHKERRQ(ierr);
9394b9ad928SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellGetName_C","PCShellGetName_Shell",
9404b9ad928SBarry Smith                     PCShellGetName_Shell);CHKERRQ(ierr);
941be29d3c6SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetApplyRichardson_C","PCShellSetApplyRichardson_Shell",
9424b9ad928SBarry Smith                     PCShellSetApplyRichardson_Shell);CHKERRQ(ierr);
9434b9ad928SBarry Smith   PetscFunctionReturn(0);
9444b9ad928SBarry Smith }
9454b9ad928SBarry Smith EXTERN_C_END
9464b9ad928SBarry Smith 
9474b9ad928SBarry Smith 
9484b9ad928SBarry Smith 
9494b9ad928SBarry Smith 
9504b9ad928SBarry Smith 
9514b9ad928SBarry Smith 
952