xref: /petsc/src/ksp/pc/impls/shell/shellpc.c (revision 2bb1777294df05c81b0dfc1449968414e0209f1a)
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);
17*2bb17772SBarry 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"
29be29d3c6SBarry Smith /*@
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"
65be29d3c6SBarry Smith /*@C
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 {
83be29d3c6SBarry Smith   PC_Shell      *shell = (PC_Shell*)pc->data;
84be29d3c6SBarry Smith   PetscErrorCode ierr;
85be29d3c6SBarry Smith   PetscTruth     flg;
86be29d3c6SBarry Smith 
87be29d3c6SBarry Smith   PetscFunctionBegin;
88be29d3c6SBarry Smith   PetscValidHeaderSpecific(pc,PC_COOKIE,1);
89be29d3c6SBarry Smith   ierr = PetscTypeCompare((PetscObject)pc,PCSHELL,&flg);CHKERRQ(ierr);
90be29d3c6SBarry Smith   if (flg) {
91be29d3c6SBarry Smith     shell->ctx = ctx;
92be29d3c6SBarry Smith   }
93be29d3c6SBarry Smith   PetscFunctionReturn(0);
94be29d3c6SBarry Smith }
95be29d3c6SBarry Smith 
96be29d3c6SBarry Smith #undef __FUNCT__
9718be62a5SSatish Balay #define __FUNCT__ "PCSetUp_Shell"
986849ba73SBarry Smith static PetscErrorCode PCSetUp_Shell(PC pc)
994b9ad928SBarry Smith {
1004b9ad928SBarry Smith   PC_Shell       *shell;
101dfbe8321SBarry Smith   PetscErrorCode ierr;
1024b9ad928SBarry Smith 
1034b9ad928SBarry Smith   PetscFunctionBegin;
1044b9ad928SBarry Smith   shell = (PC_Shell*)pc->data;
1054b9ad928SBarry Smith   if (shell->setup) {
106e9a2bbcdSBarry Smith     CHKMEMQ;
1074b9ad928SBarry Smith     ierr  = (*shell->setup)(shell->ctx);CHKERRQ(ierr);
108e9a2bbcdSBarry Smith     CHKMEMQ;
1094b9ad928SBarry Smith   }
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;
1221302d50aSBarry Smith   if (!shell->apply) SETERRQ(PETSC_ERR_USER,"No apply() routine provided to Shell PC");
123e9a2bbcdSBarry Smith   PetscStackPush("PCSHELL user function");
124e9a2bbcdSBarry Smith   CHKMEMQ;
1254b9ad928SBarry Smith   ierr  = (*shell->apply)(shell->ctx,x,y);CHKERRQ(ierr);
126e9a2bbcdSBarry Smith   CHKMEMQ;
127e9a2bbcdSBarry Smith   PetscStackPop;
1284b9ad928SBarry Smith   PetscFunctionReturn(0);
1294b9ad928SBarry Smith }
1304b9ad928SBarry Smith 
1314b9ad928SBarry Smith #undef __FUNCT__
132*2bb17772SBarry Smith #define __FUNCT__ "PCApplyBA_Shell"
133*2bb17772SBarry Smith static PetscErrorCode PCApplyBA_Shell(PC pc,PCSide side,Vec x,Vec y,Vec w)
134*2bb17772SBarry Smith {
135*2bb17772SBarry Smith   PC_Shell       *shell;
136*2bb17772SBarry Smith   PetscErrorCode ierr;
137*2bb17772SBarry Smith 
138*2bb17772SBarry Smith   PetscFunctionBegin;
139*2bb17772SBarry Smith   shell = (PC_Shell*)pc->data;
140*2bb17772SBarry Smith   if (!shell->applyBA) SETERRQ(PETSC_ERR_USER,"No applyBA() routine provided to Shell PC");
141*2bb17772SBarry Smith   PetscStackPush("PCSHELL user function BA");
142*2bb17772SBarry Smith   CHKMEMQ;
143*2bb17772SBarry Smith   ierr  = (*shell->applyBA)(shell->ctx,side,x,y,w);CHKERRQ(ierr);
144*2bb17772SBarry Smith   CHKMEMQ;
145*2bb17772SBarry Smith   PetscStackPop;
146*2bb17772SBarry Smith   PetscFunctionReturn(0);
147*2bb17772SBarry Smith }
148*2bb17772SBarry Smith 
149*2bb17772SBarry Smith #undef __FUNCT__
1507cdd61b2SBarry Smith #define __FUNCT__ "PCPreSolve_Shell"
1517cdd61b2SBarry Smith static PetscErrorCode PCPreSolve_Shell(PC pc,KSP ksp,Vec b,Vec x)
1527cdd61b2SBarry Smith {
1537cdd61b2SBarry Smith   PC_Shell       *shell;
1547cdd61b2SBarry Smith   PetscErrorCode ierr;
1557cdd61b2SBarry Smith 
1567cdd61b2SBarry Smith   PetscFunctionBegin;
1577cdd61b2SBarry Smith   shell = (PC_Shell*)pc->data;
15891ad8336SSatish Balay   if (!shell->presolve) SETERRQ(PETSC_ERR_USER,"No presolve() routine provided to Shell PC");
1597cdd61b2SBarry Smith   ierr  = (*shell->presolve)(shell->ctx,ksp,b,x);CHKERRQ(ierr);
1607cdd61b2SBarry Smith   PetscFunctionReturn(0);
1617cdd61b2SBarry Smith }
1627cdd61b2SBarry Smith 
1637cdd61b2SBarry Smith #undef __FUNCT__
1647cdd61b2SBarry Smith #define __FUNCT__ "PCPostSolve_Shell"
1657cdd61b2SBarry Smith static PetscErrorCode PCPostSolve_Shell(PC pc,KSP ksp,Vec b,Vec x)
1667cdd61b2SBarry Smith {
1677cdd61b2SBarry Smith   PC_Shell       *shell;
1687cdd61b2SBarry Smith   PetscErrorCode ierr;
1697cdd61b2SBarry Smith 
1707cdd61b2SBarry Smith   PetscFunctionBegin;
1717cdd61b2SBarry Smith   shell = (PC_Shell*)pc->data;
17291ad8336SSatish Balay   if (!shell->postsolve) SETERRQ(PETSC_ERR_USER,"No postsolve() routine provided to Shell PC");
17391ad8336SSatish Balay   ierr  = (*shell->postsolve)(shell->ctx,ksp,b,x);CHKERRQ(ierr);
1747cdd61b2SBarry Smith   PetscFunctionReturn(0);
1757cdd61b2SBarry Smith }
1767cdd61b2SBarry Smith 
1777cdd61b2SBarry Smith #undef __FUNCT__
1784b9ad928SBarry Smith #define __FUNCT__ "PCApplyTranspose_Shell"
1796849ba73SBarry Smith static PetscErrorCode PCApplyTranspose_Shell(PC pc,Vec x,Vec y)
1804b9ad928SBarry Smith {
1814b9ad928SBarry Smith   PC_Shell       *shell;
182dfbe8321SBarry Smith   PetscErrorCode ierr;
1834b9ad928SBarry Smith 
1844b9ad928SBarry Smith   PetscFunctionBegin;
1854b9ad928SBarry Smith   shell = (PC_Shell*)pc->data;
1861302d50aSBarry Smith   if (!shell->applytranspose) SETERRQ(PETSC_ERR_USER,"No applytranspose() routine provided to Shell PC");
1874b9ad928SBarry Smith   ierr  = (*shell->applytranspose)(shell->ctx,x,y);CHKERRQ(ierr);
1884b9ad928SBarry Smith   PetscFunctionReturn(0);
1894b9ad928SBarry Smith }
1904b9ad928SBarry Smith 
1914b9ad928SBarry Smith #undef __FUNCT__
1924b9ad928SBarry Smith #define __FUNCT__ "PCApplyRichardson_Shell"
19313f74950SBarry Smith static PetscErrorCode PCApplyRichardson_Shell(PC pc,Vec x,Vec y,Vec w,PetscReal rtol,PetscReal abstol, PetscReal dtol,PetscInt it)
1944b9ad928SBarry Smith {
195dfbe8321SBarry Smith   PetscErrorCode ierr;
1964b9ad928SBarry Smith   PC_Shell       *shell;
1974b9ad928SBarry Smith 
1984b9ad928SBarry Smith   PetscFunctionBegin;
1994b9ad928SBarry Smith   shell = (PC_Shell*)pc->data;
200be29d3c6SBarry Smith   ierr  = (*shell->applyrich)(shell->ctx,x,y,w,rtol,abstol,dtol,it);CHKERRQ(ierr);
2014b9ad928SBarry Smith   PetscFunctionReturn(0);
2024b9ad928SBarry Smith }
2034b9ad928SBarry Smith 
2044b9ad928SBarry Smith #undef __FUNCT__
2054b9ad928SBarry Smith #define __FUNCT__ "PCDestroy_Shell"
2066849ba73SBarry Smith static PetscErrorCode PCDestroy_Shell(PC pc)
2074b9ad928SBarry Smith {
2084b9ad928SBarry Smith   PC_Shell       *shell = (PC_Shell*)pc->data;
209dfbe8321SBarry Smith   PetscErrorCode ierr;
2104b9ad928SBarry Smith 
2114b9ad928SBarry Smith   PetscFunctionBegin;
21205b42c5fSBarry Smith   ierr = PetscStrfree(shell->name);CHKERRQ(ierr);
21318be62a5SSatish Balay   if (shell->destroy) {
21418be62a5SSatish Balay     ierr  = (*shell->destroy)(shell->ctx);CHKERRQ(ierr);
21518be62a5SSatish Balay   }
2164b9ad928SBarry Smith   ierr = PetscFree(shell);CHKERRQ(ierr);
2174b9ad928SBarry Smith   PetscFunctionReturn(0);
2184b9ad928SBarry Smith }
2194b9ad928SBarry Smith 
2204b9ad928SBarry Smith #undef __FUNCT__
2214b9ad928SBarry Smith #define __FUNCT__ "PCView_Shell"
2226849ba73SBarry Smith static PetscErrorCode PCView_Shell(PC pc,PetscViewer viewer)
2234b9ad928SBarry Smith {
2244b9ad928SBarry Smith   PC_Shell       *shell = (PC_Shell*)pc->data;
225dfbe8321SBarry Smith   PetscErrorCode ierr;
22632077d6dSBarry Smith   PetscTruth     iascii;
2274b9ad928SBarry Smith 
2284b9ad928SBarry Smith   PetscFunctionBegin;
22932077d6dSBarry Smith   ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_ASCII,&iascii);CHKERRQ(ierr);
23032077d6dSBarry Smith   if (iascii) {
2314b9ad928SBarry Smith     if (shell->name) {ierr = PetscViewerASCIIPrintf(viewer,"  Shell: %s\n",shell->name);CHKERRQ(ierr);}
2324b9ad928SBarry Smith     else             {ierr = PetscViewerASCIIPrintf(viewer,"  Shell: no name\n");CHKERRQ(ierr);}
2334b9ad928SBarry Smith   }
2344b9ad928SBarry Smith   if (shell->view) {
2354b9ad928SBarry Smith     ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
2364b9ad928SBarry Smith     ierr  = (*shell->view)(shell->ctx,viewer);CHKERRQ(ierr);
2374b9ad928SBarry Smith     ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
2384b9ad928SBarry Smith   }
2394b9ad928SBarry Smith   PetscFunctionReturn(0);
2404b9ad928SBarry Smith }
2414b9ad928SBarry Smith 
2424b9ad928SBarry Smith /* ------------------------------------------------------------------------------*/
2434b9ad928SBarry Smith EXTERN_C_BEGIN
2444b9ad928SBarry Smith #undef __FUNCT__
24518be62a5SSatish Balay #define __FUNCT__ "PCShellSetDestroy_Shell"
24618be62a5SSatish Balay PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetDestroy_Shell(PC pc, PetscErrorCode (*destroy)(void*))
24718be62a5SSatish Balay {
24818be62a5SSatish Balay   PC_Shell *shell;
24918be62a5SSatish Balay 
25018be62a5SSatish Balay   PetscFunctionBegin;
25118be62a5SSatish Balay   shell          = (PC_Shell*)pc->data;
25218be62a5SSatish Balay   shell->destroy = destroy;
25318be62a5SSatish Balay   PetscFunctionReturn(0);
25418be62a5SSatish Balay }
25518be62a5SSatish Balay EXTERN_C_END
25618be62a5SSatish Balay 
25718be62a5SSatish Balay EXTERN_C_BEGIN
25818be62a5SSatish Balay #undef __FUNCT__
2594b9ad928SBarry Smith #define __FUNCT__ "PCShellSetSetUp_Shell"
260dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetSetUp_Shell(PC pc, PetscErrorCode (*setup)(void*))
2614b9ad928SBarry Smith {
2624b9ad928SBarry Smith   PC_Shell *shell;
2634b9ad928SBarry Smith 
2644b9ad928SBarry Smith   PetscFunctionBegin;
2654b9ad928SBarry Smith   shell        = (PC_Shell*)pc->data;
2664b9ad928SBarry Smith   shell->setup = setup;
2674b9ad928SBarry Smith   PetscFunctionReturn(0);
2684b9ad928SBarry Smith }
2694b9ad928SBarry Smith EXTERN_C_END
2704b9ad928SBarry Smith 
2714b9ad928SBarry Smith EXTERN_C_BEGIN
2724b9ad928SBarry Smith #undef __FUNCT__
2734b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApply_Shell"
274be29d3c6SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApply_Shell(PC pc,PetscErrorCode (*apply)(void*,Vec,Vec))
2754b9ad928SBarry Smith {
2764b9ad928SBarry Smith   PC_Shell *shell;
2774b9ad928SBarry Smith 
2784b9ad928SBarry Smith   PetscFunctionBegin;
2794b9ad928SBarry Smith   shell        = (PC_Shell*)pc->data;
2804b9ad928SBarry Smith   shell->apply = apply;
2814b9ad928SBarry Smith   PetscFunctionReturn(0);
2824b9ad928SBarry Smith }
2834b9ad928SBarry Smith EXTERN_C_END
2844b9ad928SBarry Smith 
2854b9ad928SBarry Smith EXTERN_C_BEGIN
2864b9ad928SBarry Smith #undef __FUNCT__
287*2bb17772SBarry Smith #define __FUNCT__ "PCShellSetApplyBA_Shell"
288*2bb17772SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApplyBA_Shell(PC pc,PetscErrorCode (*apply)(void*,PCSide,Vec,Vec,Vec))
289*2bb17772SBarry Smith {
290*2bb17772SBarry Smith   PC_Shell *shell;
291*2bb17772SBarry Smith 
292*2bb17772SBarry Smith   PetscFunctionBegin;
293*2bb17772SBarry Smith   shell          = (PC_Shell*)pc->data;
294*2bb17772SBarry Smith   shell->applyBA = apply;
295*2bb17772SBarry Smith   PetscFunctionReturn(0);
296*2bb17772SBarry Smith }
297*2bb17772SBarry Smith EXTERN_C_END
298*2bb17772SBarry Smith 
299*2bb17772SBarry Smith EXTERN_C_BEGIN
300*2bb17772SBarry Smith #undef __FUNCT__
3017cdd61b2SBarry Smith #define __FUNCT__ "PCShellSetPreSolve_Shell"
302be29d3c6SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetPreSolve_Shell(PC pc,PetscErrorCode (*presolve)(void*,KSP,Vec,Vec))
3037cdd61b2SBarry Smith {
3047cdd61b2SBarry Smith   PC_Shell *shell;
3057cdd61b2SBarry Smith 
3067cdd61b2SBarry Smith   PetscFunctionBegin;
3077cdd61b2SBarry Smith   shell             = (PC_Shell*)pc->data;
3087cdd61b2SBarry Smith   shell->presolve   = presolve;
3099bbb2c88SBarry Smith   if (presolve) {
3109bbb2c88SBarry Smith     pc->ops->presolve = PCPreSolve_Shell;
3119bbb2c88SBarry Smith   } else {
3129bbb2c88SBarry Smith     pc->ops->presolve = 0;
3139bbb2c88SBarry Smith   }
3147cdd61b2SBarry Smith   PetscFunctionReturn(0);
3157cdd61b2SBarry Smith }
3167cdd61b2SBarry Smith EXTERN_C_END
3177cdd61b2SBarry Smith 
3187cdd61b2SBarry Smith EXTERN_C_BEGIN
3197cdd61b2SBarry Smith #undef __FUNCT__
3207cdd61b2SBarry Smith #define __FUNCT__ "PCShellSetPostSolve_Shell"
321be29d3c6SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetPostSolve_Shell(PC pc,PetscErrorCode (*postsolve)(void*,KSP,Vec,Vec))
3227cdd61b2SBarry Smith {
3237cdd61b2SBarry Smith   PC_Shell *shell;
3247cdd61b2SBarry Smith 
3257cdd61b2SBarry Smith   PetscFunctionBegin;
3267cdd61b2SBarry Smith   shell           = (PC_Shell*)pc->data;
3277cdd61b2SBarry Smith   shell->postsolve = postsolve;
3289bbb2c88SBarry Smith   if (postsolve) {
3299bbb2c88SBarry Smith     pc->ops->postsolve = PCPostSolve_Shell;
3309bbb2c88SBarry Smith   } else {
3319bbb2c88SBarry Smith     pc->ops->postsolve = 0;
3329bbb2c88SBarry Smith   }
3337cdd61b2SBarry Smith   PetscFunctionReturn(0);
3347cdd61b2SBarry Smith }
3357cdd61b2SBarry Smith EXTERN_C_END
3367cdd61b2SBarry Smith 
3377cdd61b2SBarry Smith EXTERN_C_BEGIN
3387cdd61b2SBarry Smith #undef __FUNCT__
3394b9ad928SBarry Smith #define __FUNCT__ "PCShellSetView_Shell"
340dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetView_Shell(PC pc,PetscErrorCode (*view)(void*,PetscViewer))
3414b9ad928SBarry Smith {
3424b9ad928SBarry Smith   PC_Shell *shell;
3434b9ad928SBarry Smith 
3444b9ad928SBarry Smith   PetscFunctionBegin;
3454b9ad928SBarry Smith   shell        = (PC_Shell*)pc->data;
3464b9ad928SBarry Smith   shell->view = view;
3474b9ad928SBarry Smith   PetscFunctionReturn(0);
3484b9ad928SBarry Smith }
3494b9ad928SBarry Smith EXTERN_C_END
3504b9ad928SBarry Smith 
3514b9ad928SBarry Smith EXTERN_C_BEGIN
3524b9ad928SBarry Smith #undef __FUNCT__
3534b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApplyTranspose_Shell"
354dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApplyTranspose_Shell(PC pc,PetscErrorCode (*applytranspose)(void*,Vec,Vec))
3554b9ad928SBarry Smith {
3564b9ad928SBarry Smith   PC_Shell *shell;
3574b9ad928SBarry Smith 
3584b9ad928SBarry Smith   PetscFunctionBegin;
3594b9ad928SBarry Smith   shell                 = (PC_Shell*)pc->data;
3604b9ad928SBarry Smith   shell->applytranspose = applytranspose;
3614b9ad928SBarry Smith   PetscFunctionReturn(0);
3624b9ad928SBarry Smith }
3634b9ad928SBarry Smith EXTERN_C_END
3644b9ad928SBarry Smith 
3654b9ad928SBarry Smith EXTERN_C_BEGIN
3664b9ad928SBarry Smith #undef __FUNCT__
3674b9ad928SBarry Smith #define __FUNCT__ "PCShellSetName_Shell"
368dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetName_Shell(PC pc,const char name[])
3694b9ad928SBarry Smith {
3704b9ad928SBarry Smith   PC_Shell       *shell;
371dfbe8321SBarry Smith   PetscErrorCode ierr;
3724b9ad928SBarry Smith 
3734b9ad928SBarry Smith   PetscFunctionBegin;
3744b9ad928SBarry Smith   shell = (PC_Shell*)pc->data;
375f259bd47SBarry Smith   ierr = PetscStrfree(shell->name);CHKERRQ(ierr);
3764b9ad928SBarry Smith   ierr = PetscStrallocpy(name,&shell->name);CHKERRQ(ierr);
3774b9ad928SBarry Smith   PetscFunctionReturn(0);
3784b9ad928SBarry Smith }
3794b9ad928SBarry Smith EXTERN_C_END
3804b9ad928SBarry Smith 
3814b9ad928SBarry Smith EXTERN_C_BEGIN
3824b9ad928SBarry Smith #undef __FUNCT__
3834b9ad928SBarry Smith #define __FUNCT__ "PCShellGetName_Shell"
384dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellGetName_Shell(PC pc,char *name[])
3854b9ad928SBarry Smith {
3864b9ad928SBarry Smith   PC_Shell *shell;
3874b9ad928SBarry Smith 
3884b9ad928SBarry Smith   PetscFunctionBegin;
3894b9ad928SBarry Smith   shell  = (PC_Shell*)pc->data;
3904b9ad928SBarry Smith   *name  = shell->name;
3914b9ad928SBarry Smith   PetscFunctionReturn(0);
3924b9ad928SBarry Smith }
3934b9ad928SBarry Smith EXTERN_C_END
3944b9ad928SBarry Smith 
3954b9ad928SBarry Smith EXTERN_C_BEGIN
3964b9ad928SBarry Smith #undef __FUNCT__
3974b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApplyRichardson_Shell"
398be29d3c6SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApplyRichardson_Shell(PC pc,PetscErrorCode (*apply)(void*,Vec,Vec,Vec,PetscReal,PetscReal,PetscReal,PetscInt))
3994b9ad928SBarry Smith {
4004b9ad928SBarry Smith   PC_Shell *shell;
4014b9ad928SBarry Smith 
4024b9ad928SBarry Smith   PetscFunctionBegin;
4034b9ad928SBarry Smith   shell                     = (PC_Shell*)pc->data;
4044b9ad928SBarry Smith   pc->ops->applyrichardson  = PCApplyRichardson_Shell;
4054b9ad928SBarry Smith   shell->applyrich          = apply;
4064b9ad928SBarry Smith   PetscFunctionReturn(0);
4074b9ad928SBarry Smith }
4084b9ad928SBarry Smith EXTERN_C_END
4094b9ad928SBarry Smith 
4104b9ad928SBarry Smith /* -------------------------------------------------------------------------------*/
4114b9ad928SBarry Smith 
4124b9ad928SBarry Smith #undef __FUNCT__
41318be62a5SSatish Balay #define __FUNCT__ "PCShellSetDestroy"
41418be62a5SSatish Balay /*@C
41518be62a5SSatish Balay    PCShellSetDestroy - Sets routine to use to destroy the user-provided
41618be62a5SSatish Balay    application context.
41718be62a5SSatish Balay 
41818be62a5SSatish Balay    Collective on PC
41918be62a5SSatish Balay 
42018be62a5SSatish Balay    Input Parameters:
42118be62a5SSatish Balay +  pc - the preconditioner context
42218be62a5SSatish Balay .  destroy - the application-provided destroy routine
42318be62a5SSatish Balay 
42418be62a5SSatish Balay    Calling sequence of destroy:
42518be62a5SSatish Balay .vb
42618be62a5SSatish Balay    PetscErrorCode destroy (void *ptr)
42718be62a5SSatish Balay .ve
42818be62a5SSatish Balay 
42918be62a5SSatish Balay .  ptr - the application context
43018be62a5SSatish Balay 
43118be62a5SSatish Balay    Level: developer
43218be62a5SSatish Balay 
43318be62a5SSatish Balay .keywords: PC, shell, set, destroy, user-provided
43418be62a5SSatish Balay 
43518be62a5SSatish Balay .seealso: PCShellSetApply(), PCShellSetContext()
43618be62a5SSatish Balay @*/
43718be62a5SSatish Balay PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetDestroy(PC pc,PetscErrorCode (*destroy)(void*))
43818be62a5SSatish Balay {
43918be62a5SSatish Balay   PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*));
44018be62a5SSatish Balay 
44118be62a5SSatish Balay   PetscFunctionBegin;
44218be62a5SSatish Balay   PetscValidHeaderSpecific(pc,PC_COOKIE,1);
44318be62a5SSatish Balay   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetDestroy_C",(void (**)(void))&f);CHKERRQ(ierr);
44418be62a5SSatish Balay   if (f) {
44518be62a5SSatish Balay     ierr = (*f)(pc,destroy);CHKERRQ(ierr);
44618be62a5SSatish Balay   }
44718be62a5SSatish Balay   PetscFunctionReturn(0);
44818be62a5SSatish Balay }
44918be62a5SSatish Balay 
45018be62a5SSatish Balay 
45118be62a5SSatish Balay #undef __FUNCT__
4524b9ad928SBarry Smith #define __FUNCT__ "PCShellSetSetUp"
4534b9ad928SBarry Smith /*@C
4544b9ad928SBarry Smith    PCShellSetSetUp - Sets routine to use to "setup" the preconditioner whenever the
4554b9ad928SBarry Smith    matrix operator is changed.
4564b9ad928SBarry Smith 
4574b9ad928SBarry Smith    Collective on PC
4584b9ad928SBarry Smith 
4594b9ad928SBarry Smith    Input Parameters:
4604b9ad928SBarry Smith +  pc - the preconditioner context
4614b9ad928SBarry Smith .  setup - the application-provided setup routine
4624b9ad928SBarry Smith 
4634b9ad928SBarry Smith    Calling sequence of setup:
4644b9ad928SBarry Smith .vb
46513f74950SBarry Smith    PetscErrorCode setup (void *ptr)
4664b9ad928SBarry Smith .ve
4674b9ad928SBarry Smith 
4684b9ad928SBarry Smith .  ptr - the application context
4694b9ad928SBarry Smith 
4704b9ad928SBarry Smith    Level: developer
4714b9ad928SBarry Smith 
4724b9ad928SBarry Smith .keywords: PC, shell, set, setup, user-provided
4734b9ad928SBarry Smith 
474be29d3c6SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetApply(), PCShellSetContext()
4754b9ad928SBarry Smith @*/
476dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetSetUp(PC pc,PetscErrorCode (*setup)(void*))
4774b9ad928SBarry Smith {
4786849ba73SBarry Smith   PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*));
4794b9ad928SBarry Smith 
4804b9ad928SBarry Smith   PetscFunctionBegin;
4814482741eSBarry Smith   PetscValidHeaderSpecific(pc,PC_COOKIE,1);
4824b9ad928SBarry Smith   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetSetUp_C",(void (**)(void))&f);CHKERRQ(ierr);
4834b9ad928SBarry Smith   if (f) {
4844b9ad928SBarry Smith     ierr = (*f)(pc,setup);CHKERRQ(ierr);
4854b9ad928SBarry Smith   }
4864b9ad928SBarry Smith   PetscFunctionReturn(0);
4874b9ad928SBarry Smith }
4884b9ad928SBarry Smith 
4894b9ad928SBarry Smith 
4904b9ad928SBarry Smith #undef __FUNCT__
4914b9ad928SBarry Smith #define __FUNCT__ "PCShellSetView"
4924b9ad928SBarry Smith /*@C
4934b9ad928SBarry Smith    PCShellSetView - Sets routine to use as viewer of shell preconditioner
4944b9ad928SBarry Smith 
4954b9ad928SBarry Smith    Collective on PC
4964b9ad928SBarry Smith 
4974b9ad928SBarry Smith    Input Parameters:
4984b9ad928SBarry Smith +  pc - the preconditioner context
4994b9ad928SBarry Smith -  view - the application-provided view routine
5004b9ad928SBarry Smith 
5014b9ad928SBarry Smith    Calling sequence of apply:
5024b9ad928SBarry Smith .vb
50313f74950SBarry Smith    PetscErrorCode view(void *ptr,PetscViewer v)
5044b9ad928SBarry Smith .ve
5054b9ad928SBarry Smith 
5064b9ad928SBarry Smith +  ptr - the application context
5074b9ad928SBarry Smith -  v   - viewer
5084b9ad928SBarry 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 @*/
515dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetView(PC pc,PetscErrorCode (*view)(void*,PetscViewer))
5164b9ad928SBarry Smith {
5176849ba73SBarry Smith   PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*,PetscViewer));
5184b9ad928SBarry Smith 
5194b9ad928SBarry Smith   PetscFunctionBegin;
5204482741eSBarry Smith   PetscValidHeaderSpecific(pc,PC_COOKIE,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 
5334b9ad928SBarry Smith    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
54113f74950SBarry Smith    PetscErrorCode apply (void *ptr,Vec xin,Vec xout)
5424b9ad928SBarry Smith .ve
5434b9ad928SBarry Smith 
5444b9ad928SBarry Smith +  ptr - the application context
5454b9ad928SBarry Smith .  xin - input vector
5464b9ad928SBarry Smith -  xout - output vector
5474b9ad928SBarry Smith 
5484b9ad928SBarry Smith    Level: developer
5494b9ad928SBarry Smith 
5504b9ad928SBarry Smith .keywords: PC, shell, set, apply, user-provided
5514b9ad928SBarry Smith 
552*2bb17772SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose(), PCShellSetContext(), PCShellSetApplyBA()
5534b9ad928SBarry Smith @*/
554be29d3c6SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApply(PC pc,PetscErrorCode (*apply)(void*,Vec,Vec))
5554b9ad928SBarry Smith {
556be29d3c6SBarry Smith   PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*,Vec,Vec));
5574b9ad928SBarry Smith 
5584b9ad928SBarry Smith   PetscFunctionBegin;
5594482741eSBarry Smith   PetscValidHeaderSpecific(pc,PC_COOKIE,1);
5604b9ad928SBarry Smith   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetApply_C",(void (**)(void))&f);CHKERRQ(ierr);
5614b9ad928SBarry Smith   if (f) {
562be29d3c6SBarry Smith     ierr = (*f)(pc,apply);CHKERRQ(ierr);
5634b9ad928SBarry Smith   }
5644b9ad928SBarry Smith   PetscFunctionReturn(0);
5654b9ad928SBarry Smith }
5664b9ad928SBarry Smith 
5674b9ad928SBarry Smith #undef __FUNCT__
568*2bb17772SBarry Smith #define __FUNCT__ "PCShellSetApplyBA"
569*2bb17772SBarry Smith /*@C
570*2bb17772SBarry Smith    PCShellSetApplyBA - Sets routine to use as preconditioner times operator.
571*2bb17772SBarry Smith 
572*2bb17772SBarry Smith    Collective on PC
573*2bb17772SBarry Smith 
574*2bb17772SBarry Smith    Input Parameters:
575*2bb17772SBarry Smith +  pc - the preconditioner context
576*2bb17772SBarry Smith -  applyBA - the application-provided BA routine
577*2bb17772SBarry Smith 
578*2bb17772SBarry Smith    Calling sequence of apply:
579*2bb17772SBarry Smith .vb
580*2bb17772SBarry Smith    PetscErrorCode applyBA (void *ptr,Vec xin,Vec xout)
581*2bb17772SBarry Smith .ve
582*2bb17772SBarry Smith 
583*2bb17772SBarry Smith +  ptr - the application context
584*2bb17772SBarry Smith .  xin - input vector
585*2bb17772SBarry Smith -  xout - output vector
586*2bb17772SBarry Smith 
587*2bb17772SBarry Smith    Level: developer
588*2bb17772SBarry Smith 
589*2bb17772SBarry Smith .keywords: PC, shell, set, apply, user-provided
590*2bb17772SBarry Smith 
591*2bb17772SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose(), PCShellSetContext(), PCShellSetApply()
592*2bb17772SBarry Smith @*/
593*2bb17772SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApplyBA(PC pc,PetscErrorCode (*applyBA)(void*,PCSide,Vec,Vec,Vec))
594*2bb17772SBarry Smith {
595*2bb17772SBarry Smith   PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*,PCSide,Vec,Vec,Vec));
596*2bb17772SBarry Smith 
597*2bb17772SBarry Smith   PetscFunctionBegin;
598*2bb17772SBarry Smith   PetscValidHeaderSpecific(pc,PC_COOKIE,1);
599*2bb17772SBarry Smith   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetApplyBA_C",(void (**)(void))&f);CHKERRQ(ierr);
600*2bb17772SBarry Smith   if (f) {
601*2bb17772SBarry Smith     ierr = (*f)(pc,applyBA);CHKERRQ(ierr);
602*2bb17772SBarry Smith   }
603*2bb17772SBarry Smith   PetscFunctionReturn(0);
604*2bb17772SBarry Smith }
605*2bb17772SBarry Smith 
606*2bb17772SBarry Smith #undef __FUNCT__
6074b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApplyTranspose"
6084b9ad928SBarry Smith /*@C
6094b9ad928SBarry Smith    PCShellSetApplyTranspose - Sets routine to use as preconditioner transpose.
6104b9ad928SBarry Smith 
6114b9ad928SBarry Smith    Collective on PC
6124b9ad928SBarry Smith 
6134b9ad928SBarry Smith    Input Parameters:
6144b9ad928SBarry Smith +  pc - the preconditioner context
6154b9ad928SBarry Smith -  apply - the application-provided preconditioning transpose routine
6164b9ad928SBarry Smith 
6174b9ad928SBarry Smith    Calling sequence of apply:
6184b9ad928SBarry Smith .vb
61913f74950SBarry Smith    PetscErrorCode applytranspose (void *ptr,Vec xin,Vec xout)
6204b9ad928SBarry Smith .ve
6214b9ad928SBarry Smith 
6224b9ad928SBarry Smith +  ptr - the application context
6234b9ad928SBarry Smith .  xin - input vector
6244b9ad928SBarry Smith -  xout - output vector
6254b9ad928SBarry Smith 
6264b9ad928SBarry Smith    Level: developer
6274b9ad928SBarry Smith 
6284b9ad928SBarry Smith    Notes:
6294b9ad928SBarry Smith    Uses the same context variable as PCShellSetApply().
6304b9ad928SBarry Smith 
6314b9ad928SBarry Smith .keywords: PC, shell, set, apply, user-provided
6324b9ad928SBarry Smith 
633*2bb17772SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApply(), PCSetContext(), PCShellSetApplyBA()
6344b9ad928SBarry Smith @*/
635dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApplyTranspose(PC pc,PetscErrorCode (*applytranspose)(void*,Vec,Vec))
6364b9ad928SBarry Smith {
6376849ba73SBarry Smith   PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*,Vec,Vec));
6384b9ad928SBarry Smith 
6394b9ad928SBarry Smith   PetscFunctionBegin;
6404482741eSBarry Smith   PetscValidHeaderSpecific(pc,PC_COOKIE,1);
6414b9ad928SBarry Smith   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetApplyTranspose_C",(void (**)(void))&f);CHKERRQ(ierr);
6424b9ad928SBarry Smith   if (f) {
6434b9ad928SBarry Smith     ierr = (*f)(pc,applytranspose);CHKERRQ(ierr);
6444b9ad928SBarry Smith   }
6454b9ad928SBarry Smith   PetscFunctionReturn(0);
6464b9ad928SBarry Smith }
6474b9ad928SBarry Smith 
6484b9ad928SBarry Smith #undef __FUNCT__
6497cdd61b2SBarry Smith #define __FUNCT__ "PCShellSetPreSolve"
6507cdd61b2SBarry Smith /*@C
6517cdd61b2SBarry Smith    PCShellSetPreSolve - Sets routine to apply to the operators/vectors before a KSPSolve() is
6527cdd61b2SBarry Smith       applied. This usually does something like scale the linear system in some application
6537cdd61b2SBarry Smith       specific way.
6547cdd61b2SBarry Smith 
6557cdd61b2SBarry Smith    Collective on PC
6567cdd61b2SBarry Smith 
6577cdd61b2SBarry Smith    Input Parameters:
6587cdd61b2SBarry Smith +  pc - the preconditioner context
6597cdd61b2SBarry Smith -  presolve - the application-provided presolve routine
6607cdd61b2SBarry Smith 
6617cdd61b2SBarry Smith    Calling sequence of presolve:
6627cdd61b2SBarry Smith .vb
6637cdd61b2SBarry Smith    PetscErrorCode presolve (void *ptr,KSP ksp,Vec b,Vec x)
6647cdd61b2SBarry Smith .ve
6657cdd61b2SBarry Smith 
6667cdd61b2SBarry Smith +  ptr - the application context
6677cdd61b2SBarry Smith .  xin - input vector
6687cdd61b2SBarry Smith -  xout - output vector
6697cdd61b2SBarry Smith 
6707cdd61b2SBarry Smith    Level: developer
6717cdd61b2SBarry Smith 
6727cdd61b2SBarry Smith .keywords: PC, shell, set, apply, user-provided
6737cdd61b2SBarry Smith 
674be29d3c6SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose(), PCShellSetPostSolve(), PCShellSetContext()
6757cdd61b2SBarry Smith @*/
6767cdd61b2SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetPreSolve(PC pc,PetscErrorCode (*presolve)(void*,KSP,Vec,Vec))
6777cdd61b2SBarry Smith {
6787cdd61b2SBarry Smith   PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*,KSP,Vec,Vec));
6797cdd61b2SBarry Smith 
6807cdd61b2SBarry Smith   PetscFunctionBegin;
6817cdd61b2SBarry Smith   PetscValidHeaderSpecific(pc,PC_COOKIE,1);
6827cdd61b2SBarry Smith   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetPreSolve_C",(void (**)(void))&f);CHKERRQ(ierr);
6837cdd61b2SBarry Smith   if (f) {
6847cdd61b2SBarry Smith     ierr = (*f)(pc,presolve);CHKERRQ(ierr);
6857cdd61b2SBarry Smith   }
6867cdd61b2SBarry Smith   PetscFunctionReturn(0);
6877cdd61b2SBarry Smith }
6887cdd61b2SBarry Smith 
6897cdd61b2SBarry Smith #undef __FUNCT__
6907cdd61b2SBarry Smith #define __FUNCT__ "PCShellSetPostSolve"
6917cdd61b2SBarry Smith /*@C
6927cdd61b2SBarry Smith    PCShellSetPostSolve - Sets routine to apply to the operators/vectors before a KSPSolve() is
6937cdd61b2SBarry Smith       applied. This usually does something like scale the linear system in some application
6947cdd61b2SBarry Smith       specific way.
6957cdd61b2SBarry Smith 
6967cdd61b2SBarry Smith    Collective on PC
6977cdd61b2SBarry Smith 
6987cdd61b2SBarry Smith    Input Parameters:
6997cdd61b2SBarry Smith +  pc - the preconditioner context
7007cdd61b2SBarry Smith -  postsolve - the application-provided presolve routine
7017cdd61b2SBarry Smith 
7027cdd61b2SBarry Smith    Calling sequence of postsolve:
7037cdd61b2SBarry Smith .vb
7047cdd61b2SBarry Smith    PetscErrorCode postsolve(void *ptr,KSP ksp,Vec b,Vec x)
7057cdd61b2SBarry Smith .ve
7067cdd61b2SBarry Smith 
7077cdd61b2SBarry Smith +  ptr - the application context
7087cdd61b2SBarry Smith .  xin - input vector
7097cdd61b2SBarry Smith -  xout - output vector
7107cdd61b2SBarry Smith 
7117cdd61b2SBarry Smith    Level: developer
7127cdd61b2SBarry Smith 
7137cdd61b2SBarry Smith .keywords: PC, shell, set, apply, user-provided
7147cdd61b2SBarry Smith 
715be29d3c6SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose(), PCShellSetPreSolve(), PCShellSetContext()
7167cdd61b2SBarry Smith @*/
7177cdd61b2SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetPostSolve(PC pc,PetscErrorCode (*postsolve)(void*,KSP,Vec,Vec))
7187cdd61b2SBarry Smith {
7197cdd61b2SBarry Smith   PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*,KSP,Vec,Vec));
7207cdd61b2SBarry Smith 
7217cdd61b2SBarry Smith   PetscFunctionBegin;
7227cdd61b2SBarry Smith   PetscValidHeaderSpecific(pc,PC_COOKIE,1);
7237cdd61b2SBarry Smith   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetPostSolve_C",(void (**)(void))&f);CHKERRQ(ierr);
7247cdd61b2SBarry Smith   if (f) {
7257cdd61b2SBarry Smith     ierr = (*f)(pc,postsolve);CHKERRQ(ierr);
7267cdd61b2SBarry Smith   }
7277cdd61b2SBarry Smith   PetscFunctionReturn(0);
7287cdd61b2SBarry Smith }
7297cdd61b2SBarry Smith 
7307cdd61b2SBarry Smith #undef __FUNCT__
7314b9ad928SBarry Smith #define __FUNCT__ "PCShellSetName"
7324b9ad928SBarry Smith /*@C
7334b9ad928SBarry Smith    PCShellSetName - Sets an optional name to associate with a shell
7344b9ad928SBarry Smith    preconditioner.
7354b9ad928SBarry Smith 
7364b9ad928SBarry Smith    Not Collective
7374b9ad928SBarry Smith 
7384b9ad928SBarry Smith    Input Parameters:
7394b9ad928SBarry Smith +  pc - the preconditioner context
7404b9ad928SBarry Smith -  name - character string describing shell preconditioner
7414b9ad928SBarry Smith 
7424b9ad928SBarry Smith    Level: developer
7434b9ad928SBarry Smith 
7444b9ad928SBarry Smith .keywords: PC, shell, set, name, user-provided
7454b9ad928SBarry Smith 
7464b9ad928SBarry Smith .seealso: PCShellGetName()
7474b9ad928SBarry Smith @*/
748dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetName(PC pc,const char name[])
7494b9ad928SBarry Smith {
750dfbe8321SBarry Smith   PetscErrorCode ierr,(*f)(PC,const char []);
7514b9ad928SBarry Smith 
7524b9ad928SBarry Smith   PetscFunctionBegin;
7534482741eSBarry Smith   PetscValidHeaderSpecific(pc,PC_COOKIE,1);
7544b9ad928SBarry Smith   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetName_C",(void (**)(void))&f);CHKERRQ(ierr);
7554b9ad928SBarry Smith   if (f) {
7564b9ad928SBarry Smith     ierr = (*f)(pc,name);CHKERRQ(ierr);
7574b9ad928SBarry Smith   }
7584b9ad928SBarry Smith   PetscFunctionReturn(0);
7594b9ad928SBarry Smith }
7604b9ad928SBarry Smith 
7614b9ad928SBarry Smith #undef __FUNCT__
7624b9ad928SBarry Smith #define __FUNCT__ "PCShellGetName"
7634b9ad928SBarry Smith /*@C
7644b9ad928SBarry Smith    PCShellGetName - Gets an optional name that the user has set for a shell
7654b9ad928SBarry Smith    preconditioner.
7664b9ad928SBarry Smith 
7674b9ad928SBarry Smith    Not Collective
7684b9ad928SBarry Smith 
7694b9ad928SBarry Smith    Input Parameter:
7704b9ad928SBarry Smith .  pc - the preconditioner context
7714b9ad928SBarry Smith 
7724b9ad928SBarry Smith    Output Parameter:
7734b9ad928SBarry Smith .  name - character string describing shell preconditioner (you should not free this)
7744b9ad928SBarry Smith 
7754b9ad928SBarry Smith    Level: developer
7764b9ad928SBarry Smith 
7774b9ad928SBarry Smith .keywords: PC, shell, get, name, user-provided
7784b9ad928SBarry Smith 
7794b9ad928SBarry Smith .seealso: PCShellSetName()
7804b9ad928SBarry Smith @*/
781dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellGetName(PC pc,char *name[])
7824b9ad928SBarry Smith {
783dfbe8321SBarry Smith   PetscErrorCode ierr,(*f)(PC,char *[]);
7844b9ad928SBarry Smith 
7854b9ad928SBarry Smith   PetscFunctionBegin;
7864482741eSBarry Smith   PetscValidHeaderSpecific(pc,PC_COOKIE,1);
7874482741eSBarry Smith   PetscValidPointer(name,2);
7884b9ad928SBarry Smith   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellGetName_C",(void (**)(void))&f);CHKERRQ(ierr);
7894b9ad928SBarry Smith   if (f) {
7904b9ad928SBarry Smith     ierr = (*f)(pc,name);CHKERRQ(ierr);
7914b9ad928SBarry Smith   } else {
7921302d50aSBarry Smith     SETERRQ(PETSC_ERR_ARG_WRONG,"Not shell preconditioner, cannot get name");
7934b9ad928SBarry Smith   }
7944b9ad928SBarry Smith   PetscFunctionReturn(0);
7954b9ad928SBarry Smith }
7964b9ad928SBarry Smith 
7974b9ad928SBarry Smith #undef __FUNCT__
7984b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApplyRichardson"
7994b9ad928SBarry Smith /*@C
8004b9ad928SBarry Smith    PCShellSetApplyRichardson - Sets routine to use as preconditioner
8014b9ad928SBarry Smith    in Richardson iteration.
8024b9ad928SBarry Smith 
8034b9ad928SBarry Smith    Collective on PC
8044b9ad928SBarry Smith 
8054b9ad928SBarry Smith    Input Parameters:
8064b9ad928SBarry Smith +  pc - the preconditioner context
807be29d3c6SBarry Smith -  apply - the application-provided preconditioning routine
8084b9ad928SBarry Smith 
8094b9ad928SBarry Smith    Calling sequence of apply:
8104b9ad928SBarry Smith .vb
81113f74950SBarry Smith    PetscErrorCode apply (void *ptr,Vec b,Vec x,Vec r,PetscReal rtol,PetscReal abstol,PetscReal dtol,PetscInt maxits)
8124b9ad928SBarry Smith .ve
8134b9ad928SBarry Smith 
8144b9ad928SBarry Smith +  ptr - the application context
8154b9ad928SBarry Smith .  b - right-hand-side
8164b9ad928SBarry Smith .  x - current iterate
8174b9ad928SBarry Smith .  r - work space
8184b9ad928SBarry Smith .  rtol - relative tolerance of residual norm to stop at
81970441072SBarry Smith .  abstol - absolute tolerance of residual norm to stop at
8204b9ad928SBarry Smith .  dtol - if residual norm increases by this factor than return
8214b9ad928SBarry Smith -  maxits - number of iterations to run
8224b9ad928SBarry Smith 
8234b9ad928SBarry Smith    Level: developer
8244b9ad928SBarry Smith 
8254b9ad928SBarry Smith .keywords: PC, shell, set, apply, Richardson, user-provided
8264b9ad928SBarry Smith 
827be29d3c6SBarry Smith .seealso: PCShellSetApply(), PCShellSetContext()
8284b9ad928SBarry Smith @*/
829be29d3c6SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApplyRichardson(PC pc,PetscErrorCode (*apply)(void*,Vec,Vec,Vec,PetscReal,PetscReal,PetscReal,PetscInt))
8304b9ad928SBarry Smith {
831be29d3c6SBarry Smith   PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*,Vec,Vec,Vec,PetscReal,PetscReal,PetscReal,PetscInt));
8324b9ad928SBarry Smith 
8334b9ad928SBarry Smith   PetscFunctionBegin;
8344482741eSBarry Smith   PetscValidHeaderSpecific(pc,PC_COOKIE,1);
8354b9ad928SBarry Smith   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetApplyRichardson_C",(void (**)(void))&f);CHKERRQ(ierr);
8364b9ad928SBarry Smith   if (f) {
837be29d3c6SBarry Smith     ierr = (*f)(pc,apply);CHKERRQ(ierr);
8384b9ad928SBarry Smith   }
8394b9ad928SBarry Smith   PetscFunctionReturn(0);
8404b9ad928SBarry Smith }
8414b9ad928SBarry Smith 
8424b9ad928SBarry Smith /*MC
8434b9ad928SBarry Smith    PCSHELL - Creates a new preconditioner class for use with your
8444b9ad928SBarry Smith               own private data storage format.
8454b9ad928SBarry Smith 
8464b9ad928SBarry Smith    Level: advanced
8474b9ad928SBarry Smith 
8484b9ad928SBarry Smith    Concepts: providing your own preconditioner
8494b9ad928SBarry Smith 
8504b9ad928SBarry Smith   Usage:
8516849ba73SBarry Smith $             PetscErrorCode (*mult)(void*,Vec,Vec);
8526849ba73SBarry Smith $             PetscErrorCode (*setup)(void*);
8534b9ad928SBarry Smith $             PCCreate(comm,&pc);
8544b9ad928SBarry Smith $             PCSetType(pc,PCSHELL);
855be29d3c6SBarry Smith $             PCShellSetApply(pc,mult);
856*2bb17772SBarry Smith $             PCShellSetApplyBA(pc,mult);      (optional)
857*2bb17772SBarry Smith $             PCShellSetApplyTranspose(pc,mult); (optional)
858be29d3c6SBarry Smith $             PCShellSetContext(pc,ctx)
8594b9ad928SBarry Smith $             PCShellSetSetUp(pc,setup);       (optional)
8604b9ad928SBarry Smith 
8614b9ad928SBarry Smith .seealso:  PCCreate(), PCSetType(), PCType (for list of available types), PC,
862fd2d0fe1Svictor            MATSHELL, PCShellSetSetUp(), PCShellSetApply(), PCShellSetView(),
863fd2d0fe1Svictor            PCShellSetApplyTranspose(), PCShellSetName(), PCShellSetApplyRichardson(),
864*2bb17772SBarry Smith            PCShellGetName(), PCShellSetContext(), PCShellGetContext(), PCShellSetApplyBA()
8654b9ad928SBarry Smith M*/
8664b9ad928SBarry Smith 
8674b9ad928SBarry Smith EXTERN_C_BEGIN
8684b9ad928SBarry Smith #undef __FUNCT__
8694b9ad928SBarry Smith #define __FUNCT__ "PCCreate_Shell"
870dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCCreate_Shell(PC pc)
8714b9ad928SBarry Smith {
872dfbe8321SBarry Smith   PetscErrorCode ierr;
8734b9ad928SBarry Smith   PC_Shell       *shell;
8744b9ad928SBarry Smith 
8754b9ad928SBarry Smith   PetscFunctionBegin;
8764b9ad928SBarry Smith   pc->ops->destroy    = PCDestroy_Shell;
8774b9ad928SBarry Smith   ierr                = PetscNew(PC_Shell,&shell);CHKERRQ(ierr);
87852e6d16bSBarry Smith   ierr = PetscLogObjectMemory(pc,sizeof(PC_Shell));CHKERRQ(ierr);
8794b9ad928SBarry Smith   pc->data         = (void*)shell;
8804b9ad928SBarry Smith   pc->name         = 0;
8814b9ad928SBarry Smith 
8824b9ad928SBarry Smith   pc->ops->apply           = PCApply_Shell;
883*2bb17772SBarry Smith   pc->ops->applyBA         = PCApplyBA_Shell;
8844b9ad928SBarry Smith   pc->ops->view            = PCView_Shell;
8854b9ad928SBarry Smith   pc->ops->applytranspose  = PCApplyTranspose_Shell;
8864b9ad928SBarry Smith   pc->ops->applyrichardson = 0;
8874b9ad928SBarry Smith   pc->ops->setup           = PCSetUp_Shell;
8889bbb2c88SBarry Smith   pc->ops->presolve        = 0;
8899bbb2c88SBarry Smith   pc->ops->postsolve       = 0;
8904b9ad928SBarry Smith   pc->ops->view            = PCView_Shell;
8914b9ad928SBarry Smith 
8924b9ad928SBarry Smith   shell->apply          = 0;
8934b9ad928SBarry Smith   shell->applytranspose = 0;
8944b9ad928SBarry Smith   shell->name           = 0;
8954b9ad928SBarry Smith   shell->applyrich      = 0;
8967cdd61b2SBarry Smith   shell->presolve       = 0;
8977cdd61b2SBarry Smith   shell->postsolve      = 0;
8984b9ad928SBarry Smith   shell->ctx            = 0;
8994b9ad928SBarry Smith   shell->setup          = 0;
9004b9ad928SBarry Smith   shell->view           = 0;
90118be62a5SSatish Balay   shell->destroy        = 0;
9024b9ad928SBarry Smith 
90318be62a5SSatish Balay   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetDestroy_C","PCShellSetDestroy_Shell",
90418be62a5SSatish Balay                     PCShellSetDestroy_Shell);CHKERRQ(ierr);
9054b9ad928SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetSetUp_C","PCShellSetSetUp_Shell",
9064b9ad928SBarry Smith                     PCShellSetSetUp_Shell);CHKERRQ(ierr);
9074b9ad928SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetApply_C","PCShellSetApply_Shell",
9084b9ad928SBarry Smith                     PCShellSetApply_Shell);CHKERRQ(ierr);
909*2bb17772SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetApplyBA_C","PCShellSetApplyBA_Shell",
910*2bb17772SBarry Smith                     PCShellSetApplyBA_Shell);CHKERRQ(ierr);
9117cdd61b2SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetPreSolve_C","PCShellSetPreSolve_Shell",
9127cdd61b2SBarry Smith                     PCShellSetPreSolve_Shell);CHKERRQ(ierr);
9137cdd61b2SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetPostSolve_C","PCShellSetPostSolve_Shell",
9147cdd61b2SBarry Smith                     PCShellSetPostSolve_Shell);CHKERRQ(ierr);
9154b9ad928SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetView_C","PCShellSetView_Shell",
9164b9ad928SBarry Smith                     PCShellSetView_Shell);CHKERRQ(ierr);
917be29d3c6SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetApplyTranspose_C","PCShellSetApplyTranspose_Shell",
9184b9ad928SBarry Smith                     PCShellSetApplyTranspose_Shell);CHKERRQ(ierr);
9194b9ad928SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetName_C","PCShellSetName_Shell",
9204b9ad928SBarry Smith                     PCShellSetName_Shell);CHKERRQ(ierr);
9214b9ad928SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellGetName_C","PCShellGetName_Shell",
9224b9ad928SBarry Smith                     PCShellGetName_Shell);CHKERRQ(ierr);
923be29d3c6SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetApplyRichardson_C","PCShellSetApplyRichardson_Shell",
9244b9ad928SBarry Smith                     PCShellSetApplyRichardson_Shell);CHKERRQ(ierr);
9254b9ad928SBarry Smith   PetscFunctionReturn(0);
9264b9ad928SBarry Smith }
9274b9ad928SBarry Smith EXTERN_C_END
9284b9ad928SBarry Smith 
9294b9ad928SBarry Smith 
9304b9ad928SBarry Smith 
9314b9ad928SBarry Smith 
9324b9ad928SBarry Smith 
9334b9ad928SBarry Smith 
934