xref: /petsc/src/ksp/pc/impls/shell/shellpc.c (revision 3f9fe4453ac6fcef10788d326c676dfc3fb403b0)
1dba47a55SKris Buschelman #define PETSCKSP_DLL
2dba47a55SKris Buschelman 
34d0a8057SBarry Smith 
44b9ad928SBarry Smith /*
54b9ad928SBarry Smith    This provides a simple shell for Fortran (and C programmers) to
64b9ad928SBarry Smith   create their own preconditioner without writing much interface code.
74b9ad928SBarry Smith */
84b9ad928SBarry Smith 
96356e834SBarry Smith #include "private/pcimpl.h"        /*I "petscpc.h" I*/
101d8d5f9aSSatish Balay #include "private/vecimpl.h"
114b9ad928SBarry Smith 
12ac226902SBarry Smith EXTERN_C_BEGIN
134b9ad928SBarry Smith typedef struct {
14be29d3c6SBarry Smith   void           *ctx;                     /* user provided contexts for preconditioner */
156891c3e4SJed Brown   PetscErrorCode (*destroy)(PC);
166891c3e4SJed Brown   PetscErrorCode (*setup)(PC);
176891c3e4SJed Brown   PetscErrorCode (*apply)(PC,Vec,Vec);
186891c3e4SJed Brown   PetscErrorCode (*applyBA)(PC,PCSide,Vec,Vec,Vec);
196891c3e4SJed Brown   PetscErrorCode (*presolve)(PC,KSP,Vec,Vec);
206891c3e4SJed Brown   PetscErrorCode (*postsolve)(PC,KSP,Vec,Vec);
216891c3e4SJed Brown   PetscErrorCode (*view)(PC,PetscViewer);
226891c3e4SJed Brown   PetscErrorCode (*applytranspose)(PC,Vec,Vec);
237319c654SBarry Smith   PetscErrorCode (*applyrich)(PC,Vec,Vec,Vec,PetscReal,PetscReal,PetscReal,PetscInt,PetscTruth,PetscInt*,PCRichardsonConvergedReason*);
244b9ad928SBarry Smith   char           *name;
254b9ad928SBarry Smith } PC_Shell;
26ac226902SBarry Smith EXTERN_C_END
274b9ad928SBarry Smith 
284b9ad928SBarry Smith #undef __FUNCT__
29be29d3c6SBarry Smith #define __FUNCT__ "PCShellGetContext"
30b29801fcSSatish Balay /*@C
31be29d3c6SBarry Smith     PCShellGetContext - Returns the user-provided context associated with a shell PC
32be29d3c6SBarry Smith 
33be29d3c6SBarry Smith     Not Collective
34be29d3c6SBarry Smith 
35be29d3c6SBarry Smith     Input Parameter:
36be29d3c6SBarry Smith .   pc - should have been created with PCCreateShell()
37be29d3c6SBarry Smith 
38be29d3c6SBarry Smith     Output Parameter:
39be29d3c6SBarry Smith .   ctx - the user provided context
40be29d3c6SBarry Smith 
41be29d3c6SBarry Smith     Level: advanced
42be29d3c6SBarry Smith 
43be29d3c6SBarry Smith     Notes:
44be29d3c6SBarry Smith     This routine is intended for use within various shell routines
45be29d3c6SBarry Smith 
46be29d3c6SBarry Smith .keywords: PC, shell, get, context
47be29d3c6SBarry Smith 
48be29d3c6SBarry Smith .seealso: PCCreateShell(), PCShellSetContext()
49be29d3c6SBarry Smith @*/
50be29d3c6SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellGetContext(PC pc,void **ctx)
51be29d3c6SBarry Smith {
52be29d3c6SBarry Smith   PetscErrorCode ierr;
53be29d3c6SBarry Smith   PetscTruth     flg;
54be29d3c6SBarry Smith 
55be29d3c6SBarry Smith   PetscFunctionBegin;
560700a824SBarry Smith   PetscValidHeaderSpecific(pc,PC_CLASSID,1);
57be29d3c6SBarry Smith   PetscValidPointer(ctx,2);
58be29d3c6SBarry Smith   ierr = PetscTypeCompare((PetscObject)pc,PCSHELL,&flg);CHKERRQ(ierr);
59be29d3c6SBarry Smith   if (!flg) *ctx = 0;
60be29d3c6SBarry Smith   else      *ctx = ((PC_Shell*)(pc->data))->ctx;
61be29d3c6SBarry Smith   PetscFunctionReturn(0);
62be29d3c6SBarry Smith }
63be29d3c6SBarry Smith 
64be29d3c6SBarry Smith #undef __FUNCT__
65be29d3c6SBarry Smith #define __FUNCT__ "PCShellSetContext"
669dd1005fSJed Brown /*@
67be29d3c6SBarry Smith     PCShellSetContext - sets the context for a shell PC
68be29d3c6SBarry Smith 
69*3f9fe445SBarry Smith    Logically Collective on PC
70be29d3c6SBarry Smith 
71be29d3c6SBarry Smith     Input Parameters:
72be29d3c6SBarry Smith +   pc - the shell PC
73be29d3c6SBarry Smith -   ctx - the context
74be29d3c6SBarry Smith 
75be29d3c6SBarry Smith    Level: advanced
76be29d3c6SBarry Smith 
77be29d3c6SBarry Smith    Fortran Notes: The context can only be an integer or a PetscObject
78be29d3c6SBarry Smith       unfortunately it cannot be a Fortran array or derived type.
79be29d3c6SBarry Smith 
806895c445SBarry Smith 
81be29d3c6SBarry Smith .seealso: PCCreateShell(), PCShellGetContext()
82be29d3c6SBarry Smith @*/
83be29d3c6SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetContext(PC pc,void *ctx)
84be29d3c6SBarry Smith {
85d01c8aa3SLisandro Dalcin   PC_Shell      *shell;
86be29d3c6SBarry Smith   PetscErrorCode ierr;
87be29d3c6SBarry Smith   PetscTruth     flg;
88be29d3c6SBarry Smith 
89be29d3c6SBarry Smith   PetscFunctionBegin;
900700a824SBarry Smith   PetscValidHeaderSpecific(pc,PC_CLASSID,1);
91d01c8aa3SLisandro Dalcin   shell = (PC_Shell*)pc->data;
92be29d3c6SBarry Smith   ierr = PetscTypeCompare((PetscObject)pc,PCSHELL,&flg);CHKERRQ(ierr);
93be29d3c6SBarry Smith   if (flg) {
94be29d3c6SBarry Smith     shell->ctx = ctx;
95be29d3c6SBarry Smith   }
96be29d3c6SBarry Smith   PetscFunctionReturn(0);
97be29d3c6SBarry Smith }
98be29d3c6SBarry Smith 
99be29d3c6SBarry Smith #undef __FUNCT__
10018be62a5SSatish Balay #define __FUNCT__ "PCSetUp_Shell"
1016849ba73SBarry Smith static PetscErrorCode PCSetUp_Shell(PC pc)
1024b9ad928SBarry Smith {
1034b9ad928SBarry Smith   PC_Shell       *shell;
104dfbe8321SBarry Smith   PetscErrorCode ierr;
1054b9ad928SBarry Smith 
1064b9ad928SBarry Smith   PetscFunctionBegin;
1074b9ad928SBarry Smith   shell = (PC_Shell*)pc->data;
108e7e72b3dSBarry Smith   if (!shell->setup) SETERRQ(((PetscObject)pc)->comm,PETSC_ERR_USER,"No setup() routine provided to Shell PC");
109d01c8aa3SLisandro Dalcin   PetscStackPush("PCSHELL user function setup()");
110e9a2bbcdSBarry Smith   CHKMEMQ;
1116891c3e4SJed Brown   ierr  = (*shell->setup)(pc);CHKERRQ(ierr);
112e9a2bbcdSBarry Smith   CHKMEMQ;
113d01c8aa3SLisandro Dalcin   PetscStackPop;
1144b9ad928SBarry Smith   PetscFunctionReturn(0);
1154b9ad928SBarry Smith }
1164b9ad928SBarry Smith 
1174b9ad928SBarry Smith #undef __FUNCT__
1184b9ad928SBarry Smith #define __FUNCT__ "PCApply_Shell"
1196849ba73SBarry Smith static PetscErrorCode PCApply_Shell(PC pc,Vec x,Vec y)
1204b9ad928SBarry Smith {
1214b9ad928SBarry Smith   PC_Shell       *shell;
122dfbe8321SBarry Smith   PetscErrorCode ierr;
1234b9ad928SBarry Smith 
1244b9ad928SBarry Smith   PetscFunctionBegin;
1254b9ad928SBarry Smith   shell = (PC_Shell*)pc->data;
126e7e72b3dSBarry Smith   if (!shell->apply) SETERRQ(((PetscObject)pc)->comm,PETSC_ERR_USER,"No apply() routine provided to Shell PC");
127d01c8aa3SLisandro Dalcin   PetscStackPush("PCSHELL user function apply()");
128e9a2bbcdSBarry Smith   CHKMEMQ;
1296891c3e4SJed Brown   ierr  = (*shell->apply)(pc,x,y);CHKERRQ(ierr);
130e9a2bbcdSBarry Smith   CHKMEMQ;
131e9a2bbcdSBarry Smith   PetscStackPop;
1324b9ad928SBarry Smith   PetscFunctionReturn(0);
1334b9ad928SBarry Smith }
1344b9ad928SBarry Smith 
1354b9ad928SBarry Smith #undef __FUNCT__
1362bb17772SBarry Smith #define __FUNCT__ "PCApplyBA_Shell"
1372bb17772SBarry Smith static PetscErrorCode PCApplyBA_Shell(PC pc,PCSide side,Vec x,Vec y,Vec w)
1382bb17772SBarry Smith {
1392bb17772SBarry Smith   PC_Shell       *shell;
1402bb17772SBarry Smith   PetscErrorCode ierr;
1412bb17772SBarry Smith 
1422bb17772SBarry Smith   PetscFunctionBegin;
1432bb17772SBarry Smith   shell = (PC_Shell*)pc->data;
144e7e72b3dSBarry Smith   if (!shell->applyBA) SETERRQ(((PetscObject)pc)->comm,PETSC_ERR_USER,"No applyBA() routine provided to Shell PC");
145d01c8aa3SLisandro Dalcin   PetscStackPush("PCSHELL user function applyBA()");
1462bb17772SBarry Smith   CHKMEMQ;
1476891c3e4SJed Brown   ierr  = (*shell->applyBA)(pc,side,x,y,w);CHKERRQ(ierr);
1482bb17772SBarry Smith   CHKMEMQ;
1492bb17772SBarry Smith   PetscStackPop;
1502bb17772SBarry Smith   PetscFunctionReturn(0);
1512bb17772SBarry Smith }
1522bb17772SBarry Smith 
1532bb17772SBarry Smith #undef __FUNCT__
1547cdd61b2SBarry Smith #define __FUNCT__ "PCPreSolve_Shell"
1557cdd61b2SBarry Smith static PetscErrorCode PCPreSolve_Shell(PC pc,KSP ksp,Vec b,Vec x)
1567cdd61b2SBarry Smith {
1577cdd61b2SBarry Smith   PC_Shell       *shell;
1587cdd61b2SBarry Smith   PetscErrorCode ierr;
1597cdd61b2SBarry Smith 
1607cdd61b2SBarry Smith   PetscFunctionBegin;
1617cdd61b2SBarry Smith   shell = (PC_Shell*)pc->data;
162e7e72b3dSBarry Smith   if (!shell->presolve) SETERRQ(((PetscObject)pc)->comm,PETSC_ERR_USER,"No presolve() routine provided to Shell PC");
163d01c8aa3SLisandro Dalcin   PetscStackPush("PCSHELL user function presolve()");
164d01c8aa3SLisandro Dalcin   CHKMEMQ;
1656891c3e4SJed Brown   ierr  = (*shell->presolve)(pc,ksp,b,x);CHKERRQ(ierr);
166d01c8aa3SLisandro Dalcin   CHKMEMQ;
167d01c8aa3SLisandro Dalcin   PetscStackPop;
1687cdd61b2SBarry Smith   PetscFunctionReturn(0);
1697cdd61b2SBarry Smith }
1707cdd61b2SBarry Smith 
1717cdd61b2SBarry Smith #undef __FUNCT__
1727cdd61b2SBarry Smith #define __FUNCT__ "PCPostSolve_Shell"
1737cdd61b2SBarry Smith static PetscErrorCode PCPostSolve_Shell(PC pc,KSP ksp,Vec b,Vec x)
1747cdd61b2SBarry Smith {
1757cdd61b2SBarry Smith   PC_Shell       *shell;
1767cdd61b2SBarry Smith   PetscErrorCode ierr;
1777cdd61b2SBarry Smith 
1787cdd61b2SBarry Smith   PetscFunctionBegin;
1797cdd61b2SBarry Smith   shell = (PC_Shell*)pc->data;
180e7e72b3dSBarry Smith   if (!shell->postsolve) SETERRQ(((PetscObject)pc)->comm,PETSC_ERR_USER,"No postsolve() routine provided to Shell PC");
181d01c8aa3SLisandro Dalcin   PetscStackPush("PCSHELL user function postsolve()");
182d01c8aa3SLisandro Dalcin   CHKMEMQ;
1836891c3e4SJed Brown   ierr  = (*shell->postsolve)(pc,ksp,b,x);CHKERRQ(ierr);
184d01c8aa3SLisandro Dalcin   CHKMEMQ;
185d01c8aa3SLisandro Dalcin   PetscStackPop;
1867cdd61b2SBarry Smith   PetscFunctionReturn(0);
1877cdd61b2SBarry Smith }
1887cdd61b2SBarry Smith 
1897cdd61b2SBarry Smith #undef __FUNCT__
1904b9ad928SBarry Smith #define __FUNCT__ "PCApplyTranspose_Shell"
1916849ba73SBarry Smith static PetscErrorCode PCApplyTranspose_Shell(PC pc,Vec x,Vec y)
1924b9ad928SBarry Smith {
1934b9ad928SBarry Smith   PC_Shell       *shell;
194dfbe8321SBarry Smith   PetscErrorCode ierr;
1954b9ad928SBarry Smith 
1964b9ad928SBarry Smith   PetscFunctionBegin;
1974b9ad928SBarry Smith   shell = (PC_Shell*)pc->data;
198e7e72b3dSBarry Smith   if (!shell->applytranspose) SETERRQ(((PetscObject)pc)->comm,PETSC_ERR_USER,"No applytranspose() routine provided to Shell PC");
199d01c8aa3SLisandro Dalcin   PetscStackPush("PCSHELL user function applytranspose()");
200d01c8aa3SLisandro Dalcin   CHKMEMQ;
2016891c3e4SJed Brown   ierr  = (*shell->applytranspose)(pc,x,y);CHKERRQ(ierr);
202d01c8aa3SLisandro Dalcin   CHKMEMQ;
203d01c8aa3SLisandro Dalcin   PetscStackPop;
2044b9ad928SBarry Smith   PetscFunctionReturn(0);
2054b9ad928SBarry Smith }
2064b9ad928SBarry Smith 
2074b9ad928SBarry Smith #undef __FUNCT__
2084b9ad928SBarry Smith #define __FUNCT__ "PCApplyRichardson_Shell"
2097319c654SBarry Smith static PetscErrorCode PCApplyRichardson_Shell(PC pc,Vec x,Vec y,Vec w,PetscReal rtol,PetscReal abstol, PetscReal dtol,PetscInt it,PetscTruth guesszero,PetscInt *outits,PCRichardsonConvergedReason *reason)
2104b9ad928SBarry Smith {
211dfbe8321SBarry Smith   PetscErrorCode ierr;
2124b9ad928SBarry Smith   PC_Shell       *shell;
2134b9ad928SBarry Smith 
2144b9ad928SBarry Smith   PetscFunctionBegin;
2154b9ad928SBarry Smith   shell = (PC_Shell*)pc->data;
216e7e72b3dSBarry Smith   if (!shell->applyrich) SETERRQ(((PetscObject)pc)->comm,PETSC_ERR_USER,"No applyrichardson() routine provided to Shell PC");
217d01c8aa3SLisandro Dalcin   PetscStackPush("PCSHELL user function applyrichardson()");
218d01c8aa3SLisandro Dalcin   CHKMEMQ;
2197319c654SBarry Smith   ierr  = (*shell->applyrich)(pc,x,y,w,rtol,abstol,dtol,it,guesszero,outits,reason);CHKERRQ(ierr);
220d01c8aa3SLisandro Dalcin   CHKMEMQ;
221d01c8aa3SLisandro Dalcin   PetscStackPop;
2224b9ad928SBarry Smith   PetscFunctionReturn(0);
2234b9ad928SBarry Smith }
2244b9ad928SBarry Smith 
2254b9ad928SBarry Smith #undef __FUNCT__
2264b9ad928SBarry Smith #define __FUNCT__ "PCDestroy_Shell"
2276849ba73SBarry Smith static PetscErrorCode PCDestroy_Shell(PC pc)
2284b9ad928SBarry Smith {
2294b9ad928SBarry Smith   PC_Shell       *shell = (PC_Shell*)pc->data;
230dfbe8321SBarry Smith   PetscErrorCode ierr;
2314b9ad928SBarry Smith 
2324b9ad928SBarry Smith   PetscFunctionBegin;
233503cfb0cSBarry Smith   ierr = PetscFree(shell->name);CHKERRQ(ierr);
23418be62a5SSatish Balay   if (shell->destroy) {
2356891c3e4SJed Brown     ierr  = (*shell->destroy)(pc);CHKERRQ(ierr);
23618be62a5SSatish Balay   }
2374b9ad928SBarry Smith   ierr = PetscFree(shell);CHKERRQ(ierr);
2384b9ad928SBarry Smith   PetscFunctionReturn(0);
2394b9ad928SBarry Smith }
2404b9ad928SBarry Smith 
2414b9ad928SBarry Smith #undef __FUNCT__
2424b9ad928SBarry Smith #define __FUNCT__ "PCView_Shell"
2436849ba73SBarry Smith static PetscErrorCode PCView_Shell(PC pc,PetscViewer viewer)
2444b9ad928SBarry Smith {
2454b9ad928SBarry Smith   PC_Shell       *shell = (PC_Shell*)pc->data;
246dfbe8321SBarry Smith   PetscErrorCode ierr;
24732077d6dSBarry Smith   PetscTruth     iascii;
2484b9ad928SBarry Smith 
2494b9ad928SBarry Smith   PetscFunctionBegin;
2502692d6eeSBarry Smith   ierr = PetscTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
25132077d6dSBarry Smith   if (iascii) {
2524b9ad928SBarry Smith     if (shell->name) {ierr = PetscViewerASCIIPrintf(viewer,"  Shell: %s\n",shell->name);CHKERRQ(ierr);}
2534b9ad928SBarry Smith     else             {ierr = PetscViewerASCIIPrintf(viewer,"  Shell: no name\n");CHKERRQ(ierr);}
2544b9ad928SBarry Smith   }
2554b9ad928SBarry Smith   if (shell->view) {
2564b9ad928SBarry Smith     ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
2576891c3e4SJed Brown     ierr  = (*shell->view)(pc,viewer);CHKERRQ(ierr);
2584b9ad928SBarry Smith     ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
2594b9ad928SBarry Smith   }
2604b9ad928SBarry Smith   PetscFunctionReturn(0);
2614b9ad928SBarry Smith }
2624b9ad928SBarry Smith 
2634b9ad928SBarry Smith /* ------------------------------------------------------------------------------*/
2644b9ad928SBarry Smith EXTERN_C_BEGIN
2654b9ad928SBarry Smith #undef __FUNCT__
26618be62a5SSatish Balay #define __FUNCT__ "PCShellSetDestroy_Shell"
2676891c3e4SJed Brown PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetDestroy_Shell(PC pc, PetscErrorCode (*destroy)(PC))
26818be62a5SSatish Balay {
26918be62a5SSatish Balay   PC_Shell *shell;
27018be62a5SSatish Balay 
27118be62a5SSatish Balay   PetscFunctionBegin;
27218be62a5SSatish Balay   shell          = (PC_Shell*)pc->data;
27318be62a5SSatish Balay   shell->destroy = destroy;
27418be62a5SSatish Balay   PetscFunctionReturn(0);
27518be62a5SSatish Balay }
27618be62a5SSatish Balay EXTERN_C_END
27718be62a5SSatish Balay 
27818be62a5SSatish Balay EXTERN_C_BEGIN
27918be62a5SSatish Balay #undef __FUNCT__
2804b9ad928SBarry Smith #define __FUNCT__ "PCShellSetSetUp_Shell"
2816891c3e4SJed Brown PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetSetUp_Shell(PC pc, PetscErrorCode (*setup)(PC))
2824b9ad928SBarry Smith {
2834b9ad928SBarry Smith   PC_Shell *shell;
2844b9ad928SBarry Smith 
2854b9ad928SBarry Smith   PetscFunctionBegin;
2864b9ad928SBarry Smith   shell        = (PC_Shell*)pc->data;
2874b9ad928SBarry Smith   shell->setup = setup;
288d01c8aa3SLisandro Dalcin   if (setup) pc->ops->setup = PCSetUp_Shell;
289d01c8aa3SLisandro Dalcin   else       pc->ops->setup = 0;
2904b9ad928SBarry Smith   PetscFunctionReturn(0);
2914b9ad928SBarry Smith }
2924b9ad928SBarry Smith EXTERN_C_END
2934b9ad928SBarry Smith 
2944b9ad928SBarry Smith EXTERN_C_BEGIN
2954b9ad928SBarry Smith #undef __FUNCT__
2964b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApply_Shell"
2976891c3e4SJed Brown PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApply_Shell(PC pc,PetscErrorCode (*apply)(PC,Vec,Vec))
2984b9ad928SBarry Smith {
2994b9ad928SBarry Smith   PC_Shell *shell;
3004b9ad928SBarry Smith 
3014b9ad928SBarry Smith   PetscFunctionBegin;
3024b9ad928SBarry Smith   shell        = (PC_Shell*)pc->data;
3034b9ad928SBarry Smith   shell->apply = apply;
3044b9ad928SBarry Smith   PetscFunctionReturn(0);
3054b9ad928SBarry Smith }
3064b9ad928SBarry Smith EXTERN_C_END
3074b9ad928SBarry Smith 
3084b9ad928SBarry Smith EXTERN_C_BEGIN
3094b9ad928SBarry Smith #undef __FUNCT__
3102bb17772SBarry Smith #define __FUNCT__ "PCShellSetApplyBA_Shell"
3116891c3e4SJed Brown PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApplyBA_Shell(PC pc,PetscErrorCode (*applyBA)(PC,PCSide,Vec,Vec,Vec))
3122bb17772SBarry Smith {
3132bb17772SBarry Smith   PC_Shell *shell;
3142bb17772SBarry Smith 
3152bb17772SBarry Smith   PetscFunctionBegin;
3162bb17772SBarry Smith   shell          = (PC_Shell*)pc->data;
317d01c8aa3SLisandro Dalcin   shell->applyBA = applyBA;
318d01c8aa3SLisandro Dalcin   if (applyBA) pc->ops->applyBA  = PCApplyBA_Shell;
319aef0136fSBarry Smith   else         pc->ops->applyBA  = 0;
3202bb17772SBarry Smith   PetscFunctionReturn(0);
3212bb17772SBarry Smith }
3222bb17772SBarry Smith EXTERN_C_END
3232bb17772SBarry Smith 
3242bb17772SBarry Smith EXTERN_C_BEGIN
3252bb17772SBarry Smith #undef __FUNCT__
3267cdd61b2SBarry Smith #define __FUNCT__ "PCShellSetPreSolve_Shell"
3276891c3e4SJed Brown PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetPreSolve_Shell(PC pc,PetscErrorCode (*presolve)(PC,KSP,Vec,Vec))
3287cdd61b2SBarry Smith {
3297cdd61b2SBarry Smith   PC_Shell *shell;
3307cdd61b2SBarry Smith 
3317cdd61b2SBarry Smith   PetscFunctionBegin;
3327cdd61b2SBarry Smith   shell           = (PC_Shell*)pc->data;
3337cdd61b2SBarry Smith   shell->presolve = presolve;
334d01c8aa3SLisandro Dalcin   if (presolve) pc->ops->presolve = PCPreSolve_Shell;
335d01c8aa3SLisandro Dalcin   else          pc->ops->presolve = 0;
3367cdd61b2SBarry Smith   PetscFunctionReturn(0);
3377cdd61b2SBarry Smith }
3387cdd61b2SBarry Smith EXTERN_C_END
3397cdd61b2SBarry Smith 
3407cdd61b2SBarry Smith EXTERN_C_BEGIN
3417cdd61b2SBarry Smith #undef __FUNCT__
3427cdd61b2SBarry Smith #define __FUNCT__ "PCShellSetPostSolve_Shell"
3436891c3e4SJed Brown PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetPostSolve_Shell(PC pc,PetscErrorCode (*postsolve)(PC,KSP,Vec,Vec))
3447cdd61b2SBarry Smith {
3457cdd61b2SBarry Smith   PC_Shell *shell;
3467cdd61b2SBarry Smith 
3477cdd61b2SBarry Smith   PetscFunctionBegin;
3487cdd61b2SBarry Smith   shell            = (PC_Shell*)pc->data;
3497cdd61b2SBarry Smith   shell->postsolve = postsolve;
350d01c8aa3SLisandro Dalcin   if (postsolve) pc->ops->postsolve = PCPostSolve_Shell;
351d01c8aa3SLisandro Dalcin   else           pc->ops->postsolve = 0;
3527cdd61b2SBarry Smith   PetscFunctionReturn(0);
3537cdd61b2SBarry Smith }
3547cdd61b2SBarry Smith EXTERN_C_END
3557cdd61b2SBarry Smith 
3567cdd61b2SBarry Smith EXTERN_C_BEGIN
3577cdd61b2SBarry Smith #undef __FUNCT__
3584b9ad928SBarry Smith #define __FUNCT__ "PCShellSetView_Shell"
3596891c3e4SJed Brown PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetView_Shell(PC pc,PetscErrorCode (*view)(PC,PetscViewer))
3604b9ad928SBarry Smith {
3614b9ad928SBarry Smith   PC_Shell *shell;
3624b9ad928SBarry Smith 
3634b9ad928SBarry Smith   PetscFunctionBegin;
3644b9ad928SBarry Smith   shell        = (PC_Shell*)pc->data;
3654b9ad928SBarry Smith   shell->view = view;
3664b9ad928SBarry Smith   PetscFunctionReturn(0);
3674b9ad928SBarry Smith }
3684b9ad928SBarry Smith EXTERN_C_END
3694b9ad928SBarry Smith 
3704b9ad928SBarry Smith EXTERN_C_BEGIN
3714b9ad928SBarry Smith #undef __FUNCT__
3724b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApplyTranspose_Shell"
3736891c3e4SJed Brown PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApplyTranspose_Shell(PC pc,PetscErrorCode (*applytranspose)(PC,Vec,Vec))
3744b9ad928SBarry Smith {
3754b9ad928SBarry Smith   PC_Shell *shell;
3764b9ad928SBarry Smith 
3774b9ad928SBarry Smith   PetscFunctionBegin;
3784b9ad928SBarry Smith   shell                 = (PC_Shell*)pc->data;
3794b9ad928SBarry Smith   shell->applytranspose = applytranspose;
380d01c8aa3SLisandro Dalcin   if (applytranspose) pc->ops->applytranspose = PCApplyTranspose_Shell;
381d01c8aa3SLisandro Dalcin   else                pc->ops->applytranspose = 0;
382d01c8aa3SLisandro Dalcin   PetscFunctionReturn(0);
383d01c8aa3SLisandro Dalcin }
384d01c8aa3SLisandro Dalcin EXTERN_C_END
385d01c8aa3SLisandro Dalcin 
386d01c8aa3SLisandro Dalcin EXTERN_C_BEGIN
387d01c8aa3SLisandro Dalcin #undef __FUNCT__
388d01c8aa3SLisandro Dalcin #define __FUNCT__ "PCShellSetApplyRichardson_Shell"
3897319c654SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApplyRichardson_Shell(PC pc,PetscErrorCode (*applyrich)(PC,Vec,Vec,Vec,PetscReal,PetscReal,PetscReal,PetscInt,PetscTruth,PetscInt*,PCRichardsonConvergedReason*))
390d01c8aa3SLisandro Dalcin {
391d01c8aa3SLisandro Dalcin   PC_Shell *shell;
392d01c8aa3SLisandro Dalcin 
393d01c8aa3SLisandro Dalcin   PetscFunctionBegin;
394d01c8aa3SLisandro Dalcin   shell            = (PC_Shell*)pc->data;
395d01c8aa3SLisandro Dalcin   shell->applyrich = applyrich;
396d01c8aa3SLisandro Dalcin   if (applyrich) pc->ops->applyrichardson  = PCApplyRichardson_Shell;
397d01c8aa3SLisandro Dalcin   else           pc->ops->applyrichardson  = 0;
3984b9ad928SBarry Smith   PetscFunctionReturn(0);
3994b9ad928SBarry Smith }
4004b9ad928SBarry Smith EXTERN_C_END
4014b9ad928SBarry Smith 
4024b9ad928SBarry Smith EXTERN_C_BEGIN
4034b9ad928SBarry Smith #undef __FUNCT__
4044b9ad928SBarry Smith #define __FUNCT__ "PCShellSetName_Shell"
405dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetName_Shell(PC pc,const char name[])
4064b9ad928SBarry Smith {
4074b9ad928SBarry Smith   PC_Shell       *shell;
408dfbe8321SBarry Smith   PetscErrorCode ierr;
4094b9ad928SBarry Smith 
4104b9ad928SBarry Smith   PetscFunctionBegin;
4114b9ad928SBarry Smith   shell = (PC_Shell*)pc->data;
412503cfb0cSBarry Smith   ierr = PetscFree(shell->name);CHKERRQ(ierr);
4134b9ad928SBarry Smith   ierr = PetscStrallocpy(name,&shell->name);CHKERRQ(ierr);
4144b9ad928SBarry Smith   PetscFunctionReturn(0);
4154b9ad928SBarry Smith }
4164b9ad928SBarry Smith EXTERN_C_END
4174b9ad928SBarry Smith 
4184b9ad928SBarry Smith EXTERN_C_BEGIN
4194b9ad928SBarry Smith #undef __FUNCT__
4204b9ad928SBarry Smith #define __FUNCT__ "PCShellGetName_Shell"
421dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellGetName_Shell(PC pc,char *name[])
4224b9ad928SBarry Smith {
4234b9ad928SBarry Smith   PC_Shell *shell;
4244b9ad928SBarry Smith 
4254b9ad928SBarry Smith   PetscFunctionBegin;
4264b9ad928SBarry Smith   shell  = (PC_Shell*)pc->data;
4274b9ad928SBarry Smith   *name  = shell->name;
4284b9ad928SBarry Smith   PetscFunctionReturn(0);
4294b9ad928SBarry Smith }
4304b9ad928SBarry Smith EXTERN_C_END
4314b9ad928SBarry Smith 
4324b9ad928SBarry Smith /* -------------------------------------------------------------------------------*/
4334b9ad928SBarry Smith 
4344b9ad928SBarry Smith #undef __FUNCT__
43518be62a5SSatish Balay #define __FUNCT__ "PCShellSetDestroy"
43618be62a5SSatish Balay /*@C
43718be62a5SSatish Balay    PCShellSetDestroy - Sets routine to use to destroy the user-provided
43818be62a5SSatish Balay    application context.
43918be62a5SSatish Balay 
440*3f9fe445SBarry Smith    Logically Collective on PC
44118be62a5SSatish Balay 
44218be62a5SSatish Balay    Input Parameters:
44318be62a5SSatish Balay +  pc - the preconditioner context
44418be62a5SSatish Balay .  destroy - the application-provided destroy routine
44518be62a5SSatish Balay 
44618be62a5SSatish Balay    Calling sequence of destroy:
44718be62a5SSatish Balay .vb
4486891c3e4SJed Brown    PetscErrorCode destroy (PC)
44918be62a5SSatish Balay .ve
45018be62a5SSatish Balay 
45118be62a5SSatish Balay .  ptr - the application context
45218be62a5SSatish Balay 
4534aa34b0aSBarry Smith    Notes: the function MUST return an error code of 0 on success and nonzero on failure.
4544aa34b0aSBarry Smith 
45518be62a5SSatish Balay    Level: developer
45618be62a5SSatish Balay 
45718be62a5SSatish Balay .keywords: PC, shell, set, destroy, user-provided
45818be62a5SSatish Balay 
45918be62a5SSatish Balay .seealso: PCShellSetApply(), PCShellSetContext()
46018be62a5SSatish Balay @*/
4616891c3e4SJed Brown PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetDestroy(PC pc,PetscErrorCode (*destroy)(PC))
46218be62a5SSatish Balay {
4636891c3e4SJed Brown   PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(PC));
46418be62a5SSatish Balay 
46518be62a5SSatish Balay   PetscFunctionBegin;
4660700a824SBarry Smith   PetscValidHeaderSpecific(pc,PC_CLASSID,1);
46718be62a5SSatish Balay   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetDestroy_C",(void (**)(void))&f);CHKERRQ(ierr);
46818be62a5SSatish Balay   if (f) {
46918be62a5SSatish Balay     ierr = (*f)(pc,destroy);CHKERRQ(ierr);
47018be62a5SSatish Balay   }
47118be62a5SSatish Balay   PetscFunctionReturn(0);
47218be62a5SSatish Balay }
47318be62a5SSatish Balay 
47418be62a5SSatish Balay 
47518be62a5SSatish Balay #undef __FUNCT__
4764b9ad928SBarry Smith #define __FUNCT__ "PCShellSetSetUp"
4774b9ad928SBarry Smith /*@C
4784b9ad928SBarry Smith    PCShellSetSetUp - Sets routine to use to "setup" the preconditioner whenever the
4794b9ad928SBarry Smith    matrix operator is changed.
4804b9ad928SBarry Smith 
481*3f9fe445SBarry Smith    Logically Collective on PC
4824b9ad928SBarry Smith 
4834b9ad928SBarry Smith    Input Parameters:
4844b9ad928SBarry Smith +  pc - the preconditioner context
4854b9ad928SBarry Smith .  setup - the application-provided setup routine
4864b9ad928SBarry Smith 
4874b9ad928SBarry Smith    Calling sequence of setup:
4884b9ad928SBarry Smith .vb
4896891c3e4SJed Brown    PetscErrorCode setup (PC pc)
4904b9ad928SBarry Smith .ve
4914b9ad928SBarry Smith 
4926891c3e4SJed Brown .  pc - the preconditioner, get the application context with PCShellGetContext()
4934b9ad928SBarry Smith 
4944aa34b0aSBarry Smith    Notes: the function MUST return an error code of 0 on success and nonzero on failure.
4954aa34b0aSBarry Smith 
4964b9ad928SBarry Smith    Level: developer
4974b9ad928SBarry Smith 
4984b9ad928SBarry Smith .keywords: PC, shell, set, setup, user-provided
4994b9ad928SBarry Smith 
500be29d3c6SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetApply(), PCShellSetContext()
5014b9ad928SBarry Smith @*/
5026891c3e4SJed Brown PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetSetUp(PC pc,PetscErrorCode (*setup)(PC))
5034b9ad928SBarry Smith {
5046891c3e4SJed Brown   PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(PC));
5054b9ad928SBarry Smith 
5064b9ad928SBarry Smith   PetscFunctionBegin;
5070700a824SBarry Smith   PetscValidHeaderSpecific(pc,PC_CLASSID,1);
5084b9ad928SBarry Smith   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetSetUp_C",(void (**)(void))&f);CHKERRQ(ierr);
5094b9ad928SBarry Smith   if (f) {
5104b9ad928SBarry Smith     ierr = (*f)(pc,setup);CHKERRQ(ierr);
5114b9ad928SBarry Smith   }
5124b9ad928SBarry Smith   PetscFunctionReturn(0);
5134b9ad928SBarry Smith }
5144b9ad928SBarry Smith 
5154b9ad928SBarry Smith 
5164b9ad928SBarry Smith #undef __FUNCT__
5174b9ad928SBarry Smith #define __FUNCT__ "PCShellSetView"
5184b9ad928SBarry Smith /*@C
5194b9ad928SBarry Smith    PCShellSetView - Sets routine to use as viewer of shell preconditioner
5204b9ad928SBarry Smith 
521*3f9fe445SBarry Smith    Logically Collective on PC
5224b9ad928SBarry Smith 
5234b9ad928SBarry Smith    Input Parameters:
5244b9ad928SBarry Smith +  pc - the preconditioner context
5254b9ad928SBarry Smith -  view - the application-provided view routine
5264b9ad928SBarry Smith 
5274b9ad928SBarry Smith    Calling sequence of apply:
5284b9ad928SBarry Smith .vb
5296891c3e4SJed Brown    PetscErrorCode view(PC pc,PetscViewer v)
5304b9ad928SBarry Smith .ve
5314b9ad928SBarry Smith 
5326891c3e4SJed Brown +  pc - the preconditioner, get the application context with PCShellGetContext()
5334b9ad928SBarry Smith -  v   - viewer
5344b9ad928SBarry Smith 
5354aa34b0aSBarry Smith    Notes: the function MUST return an error code of 0 on success and nonzero on failure.
5364aa34b0aSBarry Smith 
5374b9ad928SBarry Smith    Level: developer
5384b9ad928SBarry Smith 
5394b9ad928SBarry Smith .keywords: PC, shell, set, apply, user-provided
5404b9ad928SBarry Smith 
5414b9ad928SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose()
5424b9ad928SBarry Smith @*/
5436891c3e4SJed Brown PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetView(PC pc,PetscErrorCode (*view)(PC,PetscViewer))
5444b9ad928SBarry Smith {
5456891c3e4SJed Brown   PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(PC,PetscViewer));
5464b9ad928SBarry Smith 
5474b9ad928SBarry Smith   PetscFunctionBegin;
5480700a824SBarry Smith   PetscValidHeaderSpecific(pc,PC_CLASSID,1);
5494b9ad928SBarry Smith   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetView_C",(void (**)(void))&f);CHKERRQ(ierr);
5504b9ad928SBarry Smith   if (f) {
5514b9ad928SBarry Smith     ierr = (*f)(pc,view);CHKERRQ(ierr);
5524b9ad928SBarry Smith   }
5534b9ad928SBarry Smith   PetscFunctionReturn(0);
5544b9ad928SBarry Smith }
5554b9ad928SBarry Smith 
5564b9ad928SBarry Smith #undef __FUNCT__
5574b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApply"
5584b9ad928SBarry Smith /*@C
5594b9ad928SBarry Smith    PCShellSetApply - Sets routine to use as preconditioner.
5604b9ad928SBarry Smith 
561*3f9fe445SBarry Smith    Logically Collective on PC
5624b9ad928SBarry Smith 
5634b9ad928SBarry Smith    Input Parameters:
5644b9ad928SBarry Smith +  pc - the preconditioner context
565be29d3c6SBarry Smith -  apply - the application-provided preconditioning routine
5664b9ad928SBarry Smith 
5674b9ad928SBarry Smith    Calling sequence of apply:
5684b9ad928SBarry Smith .vb
5696891c3e4SJed Brown    PetscErrorCode apply (PC pc,Vec xin,Vec xout)
5704b9ad928SBarry Smith .ve
5714b9ad928SBarry Smith 
5726891c3e4SJed Brown +  pc - the preconditioner, get the application context with PCShellGetContext()
5734b9ad928SBarry Smith .  xin - input vector
5744b9ad928SBarry Smith -  xout - output vector
5754b9ad928SBarry Smith 
5764aa34b0aSBarry Smith    Notes: the function MUST return an error code of 0 on success and nonzero on failure.
5774aa34b0aSBarry Smith 
5784b9ad928SBarry Smith    Level: developer
5794b9ad928SBarry Smith 
5804b9ad928SBarry Smith .keywords: PC, shell, set, apply, user-provided
5814b9ad928SBarry Smith 
5822bb17772SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose(), PCShellSetContext(), PCShellSetApplyBA()
5834b9ad928SBarry Smith @*/
5846891c3e4SJed Brown PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApply(PC pc,PetscErrorCode (*apply)(PC,Vec,Vec))
5854b9ad928SBarry Smith {
5866891c3e4SJed Brown   PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(PC,Vec,Vec));
5874b9ad928SBarry Smith 
5884b9ad928SBarry Smith   PetscFunctionBegin;
5890700a824SBarry Smith   PetscValidHeaderSpecific(pc,PC_CLASSID,1);
5904b9ad928SBarry Smith   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetApply_C",(void (**)(void))&f);CHKERRQ(ierr);
5914b9ad928SBarry Smith   if (f) {
592be29d3c6SBarry Smith     ierr = (*f)(pc,apply);CHKERRQ(ierr);
5934b9ad928SBarry Smith   }
5944b9ad928SBarry Smith   PetscFunctionReturn(0);
5954b9ad928SBarry Smith }
5964b9ad928SBarry Smith 
5974b9ad928SBarry Smith #undef __FUNCT__
5982bb17772SBarry Smith #define __FUNCT__ "PCShellSetApplyBA"
5992bb17772SBarry Smith /*@C
6002bb17772SBarry Smith    PCShellSetApplyBA - Sets routine to use as preconditioner times operator.
6012bb17772SBarry Smith 
602*3f9fe445SBarry Smith    Logically Collective on PC
6032bb17772SBarry Smith 
6042bb17772SBarry Smith    Input Parameters:
6052bb17772SBarry Smith +  pc - the preconditioner context
6062bb17772SBarry Smith -  applyBA - the application-provided BA routine
6072bb17772SBarry Smith 
6082bb17772SBarry Smith    Calling sequence of apply:
6092bb17772SBarry Smith .vb
6106891c3e4SJed Brown    PetscErrorCode applyBA (PC pc,Vec xin,Vec xout)
6112bb17772SBarry Smith .ve
6122bb17772SBarry Smith 
6136891c3e4SJed Brown +  pc - the preconditioner, get the application context with PCShellGetContext()
6142bb17772SBarry Smith .  xin - input vector
6152bb17772SBarry Smith -  xout - output vector
6162bb17772SBarry Smith 
6174aa34b0aSBarry Smith    Notes: the function MUST return an error code of 0 on success and nonzero on failure.
6184aa34b0aSBarry Smith 
6192bb17772SBarry Smith    Level: developer
6202bb17772SBarry Smith 
6212bb17772SBarry Smith .keywords: PC, shell, set, apply, user-provided
6222bb17772SBarry Smith 
6232bb17772SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose(), PCShellSetContext(), PCShellSetApply()
6242bb17772SBarry Smith @*/
6256891c3e4SJed Brown PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApplyBA(PC pc,PetscErrorCode (*applyBA)(PC,PCSide,Vec,Vec,Vec))
6262bb17772SBarry Smith {
6276891c3e4SJed Brown   PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(PC,PCSide,Vec,Vec,Vec));
6282bb17772SBarry Smith 
6292bb17772SBarry Smith   PetscFunctionBegin;
6300700a824SBarry Smith   PetscValidHeaderSpecific(pc,PC_CLASSID,1);
6312bb17772SBarry Smith   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetApplyBA_C",(void (**)(void))&f);CHKERRQ(ierr);
6322bb17772SBarry Smith   if (f) {
6332bb17772SBarry Smith     ierr = (*f)(pc,applyBA);CHKERRQ(ierr);
6342bb17772SBarry Smith   }
6352bb17772SBarry Smith   PetscFunctionReturn(0);
6362bb17772SBarry Smith }
6372bb17772SBarry Smith 
6382bb17772SBarry Smith #undef __FUNCT__
6394b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApplyTranspose"
6404b9ad928SBarry Smith /*@C
6414b9ad928SBarry Smith    PCShellSetApplyTranspose - Sets routine to use as preconditioner transpose.
6424b9ad928SBarry Smith 
643*3f9fe445SBarry Smith    Logically Collective on PC
6444b9ad928SBarry Smith 
6454b9ad928SBarry Smith    Input Parameters:
6464b9ad928SBarry Smith +  pc - the preconditioner context
6474b9ad928SBarry Smith -  apply - the application-provided preconditioning transpose routine
6484b9ad928SBarry Smith 
6494b9ad928SBarry Smith    Calling sequence of apply:
6504b9ad928SBarry Smith .vb
6516891c3e4SJed Brown    PetscErrorCode applytranspose (PC pc,Vec xin,Vec xout)
6524b9ad928SBarry Smith .ve
6534b9ad928SBarry Smith 
6546891c3e4SJed Brown +  pc - the preconditioner, get the application context with PCShellGetContext()
6554b9ad928SBarry Smith .  xin - input vector
6564b9ad928SBarry Smith -  xout - output vector
6574b9ad928SBarry Smith 
6584aa34b0aSBarry Smith    Notes: the function MUST return an error code of 0 on success and nonzero on failure.
6594aa34b0aSBarry Smith 
6604b9ad928SBarry Smith    Level: developer
6614b9ad928SBarry Smith 
6624b9ad928SBarry Smith    Notes:
6634b9ad928SBarry Smith    Uses the same context variable as PCShellSetApply().
6644b9ad928SBarry Smith 
6654b9ad928SBarry Smith .keywords: PC, shell, set, apply, user-provided
6664b9ad928SBarry Smith 
6672bb17772SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApply(), PCSetContext(), PCShellSetApplyBA()
6684b9ad928SBarry Smith @*/
6696891c3e4SJed Brown PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApplyTranspose(PC pc,PetscErrorCode (*applytranspose)(PC,Vec,Vec))
6704b9ad928SBarry Smith {
6716891c3e4SJed Brown   PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(PC,Vec,Vec));
6724b9ad928SBarry Smith 
6734b9ad928SBarry Smith   PetscFunctionBegin;
6740700a824SBarry Smith   PetscValidHeaderSpecific(pc,PC_CLASSID,1);
6754b9ad928SBarry Smith   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetApplyTranspose_C",(void (**)(void))&f);CHKERRQ(ierr);
6764b9ad928SBarry Smith   if (f) {
6774b9ad928SBarry Smith     ierr = (*f)(pc,applytranspose);CHKERRQ(ierr);
6784b9ad928SBarry Smith   }
6794b9ad928SBarry Smith   PetscFunctionReturn(0);
6804b9ad928SBarry Smith }
6814b9ad928SBarry Smith 
6824b9ad928SBarry Smith #undef __FUNCT__
6837cdd61b2SBarry Smith #define __FUNCT__ "PCShellSetPreSolve"
6847cdd61b2SBarry Smith /*@C
6857cdd61b2SBarry Smith    PCShellSetPreSolve - Sets routine to apply to the operators/vectors before a KSPSolve() is
6867cdd61b2SBarry Smith       applied. This usually does something like scale the linear system in some application
6877cdd61b2SBarry Smith       specific way.
6887cdd61b2SBarry Smith 
689*3f9fe445SBarry Smith    Logically Collective on PC
6907cdd61b2SBarry Smith 
6917cdd61b2SBarry Smith    Input Parameters:
6927cdd61b2SBarry Smith +  pc - the preconditioner context
6937cdd61b2SBarry Smith -  presolve - the application-provided presolve routine
6947cdd61b2SBarry Smith 
6957cdd61b2SBarry Smith    Calling sequence of presolve:
6967cdd61b2SBarry Smith .vb
6976891c3e4SJed Brown    PetscErrorCode presolve (PC,KSP ksp,Vec b,Vec x)
6987cdd61b2SBarry Smith .ve
6997cdd61b2SBarry Smith 
7006891c3e4SJed Brown +  pc - the preconditioner, get the application context with PCShellGetContext()
7017cdd61b2SBarry Smith .  xin - input vector
7027cdd61b2SBarry Smith -  xout - output vector
7037cdd61b2SBarry Smith 
7044aa34b0aSBarry Smith    Notes: the function MUST return an error code of 0 on success and nonzero on failure.
7054aa34b0aSBarry Smith 
7067cdd61b2SBarry Smith    Level: developer
7077cdd61b2SBarry Smith 
7087cdd61b2SBarry Smith .keywords: PC, shell, set, apply, user-provided
7097cdd61b2SBarry Smith 
710be29d3c6SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose(), PCShellSetPostSolve(), PCShellSetContext()
7117cdd61b2SBarry Smith @*/
7126891c3e4SJed Brown PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetPreSolve(PC pc,PetscErrorCode (*presolve)(PC,KSP,Vec,Vec))
7137cdd61b2SBarry Smith {
7146891c3e4SJed Brown   PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(PC,KSP,Vec,Vec));
7157cdd61b2SBarry Smith 
7167cdd61b2SBarry Smith   PetscFunctionBegin;
7170700a824SBarry Smith   PetscValidHeaderSpecific(pc,PC_CLASSID,1);
7187cdd61b2SBarry Smith   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetPreSolve_C",(void (**)(void))&f);CHKERRQ(ierr);
7197cdd61b2SBarry Smith   if (f) {
7207cdd61b2SBarry Smith     ierr = (*f)(pc,presolve);CHKERRQ(ierr);
7217cdd61b2SBarry Smith   }
7227cdd61b2SBarry Smith   PetscFunctionReturn(0);
7237cdd61b2SBarry Smith }
7247cdd61b2SBarry Smith 
7257cdd61b2SBarry Smith #undef __FUNCT__
7267cdd61b2SBarry Smith #define __FUNCT__ "PCShellSetPostSolve"
7277cdd61b2SBarry Smith /*@C
7287cdd61b2SBarry Smith    PCShellSetPostSolve - Sets routine to apply to the operators/vectors before a KSPSolve() is
7297cdd61b2SBarry Smith       applied. This usually does something like scale the linear system in some application
7307cdd61b2SBarry Smith       specific way.
7317cdd61b2SBarry Smith 
732*3f9fe445SBarry Smith    Logically Collective on PC
7337cdd61b2SBarry Smith 
7347cdd61b2SBarry Smith    Input Parameters:
7357cdd61b2SBarry Smith +  pc - the preconditioner context
7367cdd61b2SBarry Smith -  postsolve - the application-provided presolve routine
7377cdd61b2SBarry Smith 
7387cdd61b2SBarry Smith    Calling sequence of postsolve:
7397cdd61b2SBarry Smith .vb
7406891c3e4SJed Brown    PetscErrorCode postsolve(PC,KSP ksp,Vec b,Vec x)
7417cdd61b2SBarry Smith .ve
7427cdd61b2SBarry Smith 
7436891c3e4SJed Brown +  pc - the preconditioner, get the application context with PCShellGetContext()
7447cdd61b2SBarry Smith .  xin - input vector
7457cdd61b2SBarry Smith -  xout - output vector
7467cdd61b2SBarry Smith 
7474aa34b0aSBarry Smith    Notes: the function MUST return an error code of 0 on success and nonzero on failure.
7484aa34b0aSBarry Smith 
7497cdd61b2SBarry Smith    Level: developer
7507cdd61b2SBarry Smith 
7517cdd61b2SBarry Smith .keywords: PC, shell, set, apply, user-provided
7527cdd61b2SBarry Smith 
753be29d3c6SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose(), PCShellSetPreSolve(), PCShellSetContext()
7547cdd61b2SBarry Smith @*/
7556891c3e4SJed Brown PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetPostSolve(PC pc,PetscErrorCode (*postsolve)(PC,KSP,Vec,Vec))
7567cdd61b2SBarry Smith {
7576891c3e4SJed Brown   PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(PC,KSP,Vec,Vec));
7587cdd61b2SBarry Smith 
7597cdd61b2SBarry Smith   PetscFunctionBegin;
7600700a824SBarry Smith   PetscValidHeaderSpecific(pc,PC_CLASSID,1);
7617cdd61b2SBarry Smith   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetPostSolve_C",(void (**)(void))&f);CHKERRQ(ierr);
7627cdd61b2SBarry Smith   if (f) {
7637cdd61b2SBarry Smith     ierr = (*f)(pc,postsolve);CHKERRQ(ierr);
7647cdd61b2SBarry Smith   }
7657cdd61b2SBarry Smith   PetscFunctionReturn(0);
7667cdd61b2SBarry Smith }
7677cdd61b2SBarry Smith 
7687cdd61b2SBarry Smith #undef __FUNCT__
7694b9ad928SBarry Smith #define __FUNCT__ "PCShellSetName"
7704b9ad928SBarry Smith /*@C
7714b9ad928SBarry Smith    PCShellSetName - Sets an optional name to associate with a shell
7724b9ad928SBarry Smith    preconditioner.
7734b9ad928SBarry Smith 
7744b9ad928SBarry Smith    Not Collective
7754b9ad928SBarry Smith 
7764b9ad928SBarry Smith    Input Parameters:
7774b9ad928SBarry Smith +  pc - the preconditioner context
7784b9ad928SBarry Smith -  name - character string describing shell preconditioner
7794b9ad928SBarry Smith 
7804b9ad928SBarry Smith    Level: developer
7814b9ad928SBarry Smith 
7824b9ad928SBarry Smith .keywords: PC, shell, set, name, user-provided
7834b9ad928SBarry Smith 
7844b9ad928SBarry Smith .seealso: PCShellGetName()
7854b9ad928SBarry Smith @*/
786dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetName(PC pc,const char name[])
7874b9ad928SBarry Smith {
788dfbe8321SBarry Smith   PetscErrorCode ierr,(*f)(PC,const char []);
7894b9ad928SBarry Smith 
7904b9ad928SBarry Smith   PetscFunctionBegin;
7910700a824SBarry Smith   PetscValidHeaderSpecific(pc,PC_CLASSID,1);
7924b9ad928SBarry Smith   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetName_C",(void (**)(void))&f);CHKERRQ(ierr);
7934b9ad928SBarry Smith   if (f) {
7944b9ad928SBarry Smith     ierr = (*f)(pc,name);CHKERRQ(ierr);
7954b9ad928SBarry Smith   }
7964b9ad928SBarry Smith   PetscFunctionReturn(0);
7974b9ad928SBarry Smith }
7984b9ad928SBarry Smith 
7994b9ad928SBarry Smith #undef __FUNCT__
8004b9ad928SBarry Smith #define __FUNCT__ "PCShellGetName"
8014b9ad928SBarry Smith /*@C
8024b9ad928SBarry Smith    PCShellGetName - Gets an optional name that the user has set for a shell
8034b9ad928SBarry Smith    preconditioner.
8044b9ad928SBarry Smith 
8054b9ad928SBarry Smith    Not Collective
8064b9ad928SBarry Smith 
8074b9ad928SBarry Smith    Input Parameter:
8084b9ad928SBarry Smith .  pc - the preconditioner context
8094b9ad928SBarry Smith 
8104b9ad928SBarry Smith    Output Parameter:
8114b9ad928SBarry Smith .  name - character string describing shell preconditioner (you should not free this)
8124b9ad928SBarry Smith 
8134b9ad928SBarry Smith    Level: developer
8144b9ad928SBarry Smith 
8154b9ad928SBarry Smith .keywords: PC, shell, get, name, user-provided
8164b9ad928SBarry Smith 
8174b9ad928SBarry Smith .seealso: PCShellSetName()
8184b9ad928SBarry Smith @*/
819dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellGetName(PC pc,char *name[])
8204b9ad928SBarry Smith {
821dfbe8321SBarry Smith   PetscErrorCode ierr,(*f)(PC,char *[]);
8224b9ad928SBarry Smith 
8234b9ad928SBarry Smith   PetscFunctionBegin;
8240700a824SBarry Smith   PetscValidHeaderSpecific(pc,PC_CLASSID,1);
8254482741eSBarry Smith   PetscValidPointer(name,2);
8264b9ad928SBarry Smith   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellGetName_C",(void (**)(void))&f);CHKERRQ(ierr);
8274b9ad928SBarry Smith   if (f) {
8284b9ad928SBarry Smith     ierr = (*f)(pc,name);CHKERRQ(ierr);
829e7e72b3dSBarry Smith   } else  SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Not shell preconditioner, cannot get name");
8304b9ad928SBarry Smith   PetscFunctionReturn(0);
8314b9ad928SBarry Smith }
8324b9ad928SBarry Smith 
8334b9ad928SBarry Smith #undef __FUNCT__
8344b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApplyRichardson"
8354b9ad928SBarry Smith /*@C
8364b9ad928SBarry Smith    PCShellSetApplyRichardson - Sets routine to use as preconditioner
8374b9ad928SBarry Smith    in Richardson iteration.
8384b9ad928SBarry Smith 
839*3f9fe445SBarry Smith    Logically Collective on PC
8404b9ad928SBarry Smith 
8414b9ad928SBarry Smith    Input Parameters:
8424b9ad928SBarry Smith +  pc - the preconditioner context
843be29d3c6SBarry Smith -  apply - the application-provided preconditioning routine
8444b9ad928SBarry Smith 
8454b9ad928SBarry Smith    Calling sequence of apply:
8464b9ad928SBarry Smith .vb
8476891c3e4SJed Brown    PetscErrorCode apply (PC pc,Vec b,Vec x,Vec r,PetscReal rtol,PetscReal abstol,PetscReal dtol,PetscInt maxits)
8484b9ad928SBarry Smith .ve
8494b9ad928SBarry Smith 
8506891c3e4SJed Brown +  pc - the preconditioner, get the application context with PCShellGetContext()
8514b9ad928SBarry Smith .  b - right-hand-side
8524b9ad928SBarry Smith .  x - current iterate
8534b9ad928SBarry Smith .  r - work space
8544b9ad928SBarry Smith .  rtol - relative tolerance of residual norm to stop at
85570441072SBarry Smith .  abstol - absolute tolerance of residual norm to stop at
8564b9ad928SBarry Smith .  dtol - if residual norm increases by this factor than return
8574b9ad928SBarry Smith -  maxits - number of iterations to run
8584b9ad928SBarry Smith 
8594aa34b0aSBarry Smith    Notes: the function MUST return an error code of 0 on success and nonzero on failure.
8604aa34b0aSBarry Smith 
8614b9ad928SBarry Smith    Level: developer
8624b9ad928SBarry Smith 
8634b9ad928SBarry Smith .keywords: PC, shell, set, apply, Richardson, user-provided
8644b9ad928SBarry Smith 
865be29d3c6SBarry Smith .seealso: PCShellSetApply(), PCShellSetContext()
8664b9ad928SBarry Smith @*/
8677319c654SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApplyRichardson(PC pc,PetscErrorCode (*apply)(PC,Vec,Vec,Vec,PetscReal,PetscReal,PetscReal,PetscInt,PetscTruth,PetscInt*,PCRichardsonConvergedReason*))
8684b9ad928SBarry Smith {
8697319c654SBarry Smith   PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(PC,Vec,Vec,Vec,PetscReal,PetscReal,PetscReal,PetscInt,PetscTruth,PetscInt*,PCRichardsonConvergedReason*));
8704b9ad928SBarry Smith 
8714b9ad928SBarry Smith   PetscFunctionBegin;
8720700a824SBarry Smith   PetscValidHeaderSpecific(pc,PC_CLASSID,1);
8734b9ad928SBarry Smith   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetApplyRichardson_C",(void (**)(void))&f);CHKERRQ(ierr);
8744b9ad928SBarry Smith   if (f) {
875be29d3c6SBarry Smith     ierr = (*f)(pc,apply);CHKERRQ(ierr);
8764b9ad928SBarry Smith   }
8774b9ad928SBarry Smith   PetscFunctionReturn(0);
8784b9ad928SBarry Smith }
8794b9ad928SBarry Smith 
8804b9ad928SBarry Smith /*MC
8814b9ad928SBarry Smith    PCSHELL - Creates a new preconditioner class for use with your
8824b9ad928SBarry Smith               own private data storage format.
8834b9ad928SBarry Smith 
8844b9ad928SBarry Smith    Level: advanced
88590198e61SBarry Smith >
8864b9ad928SBarry Smith    Concepts: providing your own preconditioner
8874b9ad928SBarry Smith 
8884b9ad928SBarry Smith   Usage:
8896891c3e4SJed Brown $             extern PetscErrorCode apply(PC,Vec,Vec);
8906891c3e4SJed Brown $             extern PetscErrorCode applyba(PC,PCSide,Vec,Vec,Vec);
8916891c3e4SJed Brown $             extern PetscErrorCode applytranspose(PC,Vec,Vec);
8926891c3e4SJed Brown $             extern PetscErrorCode setup(PC);
8936891c3e4SJed Brown $             extern PetscErrorCode destroy(PC);
8946891c3e4SJed Brown $
8954b9ad928SBarry Smith $             PCCreate(comm,&pc);
8964b9ad928SBarry Smith $             PCSetType(pc,PCSHELL);
897be29d3c6SBarry Smith $             PCShellSetContext(pc,ctx)
8986891c3e4SJed Brown $             PCShellSetApply(pc,apply);
8996891c3e4SJed Brown $             PCShellSetApplyBA(pc,applyba);               (optional)
9006891c3e4SJed Brown $             PCShellSetApplyTranspose(pc,applytranspose); (optional)
9014b9ad928SBarry Smith $             PCShellSetSetUp(pc,setup);                   (optional)
902d01c8aa3SLisandro Dalcin $             PCShellSetDestroy(pc,destroy);               (optional)
9034b9ad928SBarry Smith 
9044b9ad928SBarry Smith .seealso:  PCCreate(), PCSetType(), PCType (for list of available types), PC,
905fd2d0fe1Svictor            MATSHELL, PCShellSetSetUp(), PCShellSetApply(), PCShellSetView(),
906fd2d0fe1Svictor            PCShellSetApplyTranspose(), PCShellSetName(), PCShellSetApplyRichardson(),
9072bb17772SBarry Smith            PCShellGetName(), PCShellSetContext(), PCShellGetContext(), PCShellSetApplyBA()
9084b9ad928SBarry Smith M*/
9094b9ad928SBarry Smith 
9104b9ad928SBarry Smith EXTERN_C_BEGIN
9114b9ad928SBarry Smith #undef __FUNCT__
9124b9ad928SBarry Smith #define __FUNCT__ "PCCreate_Shell"
913dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCCreate_Shell(PC pc)
9144b9ad928SBarry Smith {
915dfbe8321SBarry Smith   PetscErrorCode ierr;
9164b9ad928SBarry Smith   PC_Shell       *shell;
9174b9ad928SBarry Smith 
9184b9ad928SBarry Smith   PetscFunctionBegin;
91938f2d2fdSLisandro Dalcin   ierr = PetscNewLog(pc,PC_Shell,&shell);CHKERRQ(ierr);
9204b9ad928SBarry Smith   pc->data  = (void*)shell;
9214b9ad928SBarry Smith 
922d01c8aa3SLisandro Dalcin   pc->ops->destroy         = PCDestroy_Shell;
9234b9ad928SBarry Smith   pc->ops->view            = PCView_Shell;
924d01c8aa3SLisandro Dalcin   pc->ops->apply           = PCApply_Shell;
925d01c8aa3SLisandro Dalcin   pc->ops->applytranspose  = 0;
9264b9ad928SBarry Smith   pc->ops->applyrichardson = 0;
927d01c8aa3SLisandro Dalcin   pc->ops->setup           = 0;
9289bbb2c88SBarry Smith   pc->ops->presolve        = 0;
9299bbb2c88SBarry Smith   pc->ops->postsolve       = 0;
9304b9ad928SBarry Smith 
9314b9ad928SBarry Smith   shell->apply          = 0;
9324b9ad928SBarry Smith   shell->applytranspose = 0;
9334b9ad928SBarry Smith   shell->name           = 0;
9344b9ad928SBarry Smith   shell->applyrich      = 0;
9357cdd61b2SBarry Smith   shell->presolve       = 0;
9367cdd61b2SBarry Smith   shell->postsolve      = 0;
9374b9ad928SBarry Smith   shell->ctx            = 0;
9384b9ad928SBarry Smith   shell->setup          = 0;
9394b9ad928SBarry Smith   shell->view           = 0;
94018be62a5SSatish Balay   shell->destroy        = 0;
9414b9ad928SBarry Smith 
94218be62a5SSatish Balay   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetDestroy_C","PCShellSetDestroy_Shell",
94318be62a5SSatish Balay                     PCShellSetDestroy_Shell);CHKERRQ(ierr);
9444b9ad928SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetSetUp_C","PCShellSetSetUp_Shell",
9454b9ad928SBarry Smith                     PCShellSetSetUp_Shell);CHKERRQ(ierr);
9464b9ad928SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetApply_C","PCShellSetApply_Shell",
9474b9ad928SBarry Smith                     PCShellSetApply_Shell);CHKERRQ(ierr);
9482bb17772SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetApplyBA_C","PCShellSetApplyBA_Shell",
9492bb17772SBarry Smith                     PCShellSetApplyBA_Shell);CHKERRQ(ierr);
9507cdd61b2SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetPreSolve_C","PCShellSetPreSolve_Shell",
9517cdd61b2SBarry Smith                     PCShellSetPreSolve_Shell);CHKERRQ(ierr);
9527cdd61b2SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetPostSolve_C","PCShellSetPostSolve_Shell",
9537cdd61b2SBarry Smith                     PCShellSetPostSolve_Shell);CHKERRQ(ierr);
9544b9ad928SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetView_C","PCShellSetView_Shell",
9554b9ad928SBarry Smith                     PCShellSetView_Shell);CHKERRQ(ierr);
956be29d3c6SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetApplyTranspose_C","PCShellSetApplyTranspose_Shell",
9574b9ad928SBarry Smith                     PCShellSetApplyTranspose_Shell);CHKERRQ(ierr);
9584b9ad928SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetName_C","PCShellSetName_Shell",
9594b9ad928SBarry Smith                     PCShellSetName_Shell);CHKERRQ(ierr);
9604b9ad928SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellGetName_C","PCShellGetName_Shell",
9614b9ad928SBarry Smith                     PCShellGetName_Shell);CHKERRQ(ierr);
962be29d3c6SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetApplyRichardson_C","PCShellSetApplyRichardson_Shell",
9634b9ad928SBarry Smith                     PCShellSetApplyRichardson_Shell);CHKERRQ(ierr);
9644b9ad928SBarry Smith   PetscFunctionReturn(0);
9654b9ad928SBarry Smith }
9664b9ad928SBarry Smith EXTERN_C_END
9674b9ad928SBarry Smith 
9684b9ad928SBarry Smith 
9694b9ad928SBarry Smith 
9704b9ad928SBarry Smith 
9714b9ad928SBarry Smith 
9724b9ad928SBarry Smith 
973