xref: /petsc/src/ksp/pc/impls/shell/shellpc.c (revision 9dd1005fdbfb5127c228357ce7ef53133f694424)
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);
236891c3e4SJed Brown   PetscErrorCode (*applyrich)(PC,Vec,Vec,Vec,PetscReal,PetscReal,PetscReal,PetscInt,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;
56be29d3c6SBarry Smith   PetscValidHeaderSpecific(pc,PC_COOKIE,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"
66*9dd1005fSJed Brown /*@
67be29d3c6SBarry Smith     PCShellSetContext - sets the context for a shell PC
68be29d3c6SBarry Smith 
69be29d3c6SBarry Smith    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;
90be29d3c6SBarry Smith   PetscValidHeaderSpecific(pc,PC_COOKIE,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;
108d01c8aa3SLisandro Dalcin   if (!shell->setup) SETERRQ(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;
1261302d50aSBarry Smith   if (!shell->apply) SETERRQ(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;
1442bb17772SBarry Smith   if (!shell->applyBA) SETERRQ(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;
16291ad8336SSatish Balay   if (!shell->presolve) SETERRQ(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;
18091ad8336SSatish Balay   if (!shell->postsolve) SETERRQ(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;
1981302d50aSBarry Smith   if (!shell->applytranspose) SETERRQ(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"
2094d0a8057SBarry Smith static PetscErrorCode PCApplyRichardson_Shell(PC pc,Vec x,Vec y,Vec w,PetscReal rtol,PetscReal abstol, PetscReal dtol,PetscInt it,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;
216d01c8aa3SLisandro Dalcin   if (!shell->applyrich) SETERRQ(PETSC_ERR_USER,"No applyrichardson() routine provided to Shell PC");
217d01c8aa3SLisandro Dalcin   PetscStackPush("PCSHELL user function applyrichardson()");
218d01c8aa3SLisandro Dalcin   CHKMEMQ;
2196891c3e4SJed Brown   ierr  = (*shell->applyrich)(pc,x,y,w,rtol,abstol,dtol,it,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;
23305b42c5fSBarry Smith   ierr = PetscStrfree(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;
25032077d6dSBarry Smith   ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_ASCII,&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"
3896891c3e4SJed Brown PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApplyRichardson_Shell(PC pc,PetscErrorCode (*applyrich)(PC,Vec,Vec,Vec,PetscReal,PetscReal,PetscReal,PetscInt,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;
412f259bd47SBarry Smith   ierr = PetscStrfree(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 
44018be62a5SSatish Balay    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;
46618be62a5SSatish Balay   PetscValidHeaderSpecific(pc,PC_COOKIE,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 
4814b9ad928SBarry Smith    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;
5074482741eSBarry Smith   PetscValidHeaderSpecific(pc,PC_COOKIE,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 
5214b9ad928SBarry Smith    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;
5484482741eSBarry Smith   PetscValidHeaderSpecific(pc,PC_COOKIE,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 
5614b9ad928SBarry Smith    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;
5894482741eSBarry Smith   PetscValidHeaderSpecific(pc,PC_COOKIE,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 
6022bb17772SBarry Smith    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;
6302bb17772SBarry Smith   PetscValidHeaderSpecific(pc,PC_COOKIE,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 
6434b9ad928SBarry Smith    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;
6744482741eSBarry Smith   PetscValidHeaderSpecific(pc,PC_COOKIE,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 
6897cdd61b2SBarry Smith    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;
7177cdd61b2SBarry Smith   PetscValidHeaderSpecific(pc,PC_COOKIE,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 
7327cdd61b2SBarry Smith    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;
7607cdd61b2SBarry Smith   PetscValidHeaderSpecific(pc,PC_COOKIE,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;
7914482741eSBarry Smith   PetscValidHeaderSpecific(pc,PC_COOKIE,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;
8244482741eSBarry Smith   PetscValidHeaderSpecific(pc,PC_COOKIE,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);
8294b9ad928SBarry Smith   } else {
8301302d50aSBarry Smith     SETERRQ(PETSC_ERR_ARG_WRONG,"Not shell preconditioner, cannot get name");
8314b9ad928SBarry Smith   }
8324b9ad928SBarry Smith   PetscFunctionReturn(0);
8334b9ad928SBarry Smith }
8344b9ad928SBarry Smith 
8354b9ad928SBarry Smith #undef __FUNCT__
8364b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApplyRichardson"
8374b9ad928SBarry Smith /*@C
8384b9ad928SBarry Smith    PCShellSetApplyRichardson - Sets routine to use as preconditioner
8394b9ad928SBarry Smith    in Richardson iteration.
8404b9ad928SBarry Smith 
8414b9ad928SBarry Smith    Collective on PC
8424b9ad928SBarry Smith 
8434b9ad928SBarry Smith    Input Parameters:
8444b9ad928SBarry Smith +  pc - the preconditioner context
845be29d3c6SBarry Smith -  apply - the application-provided preconditioning routine
8464b9ad928SBarry Smith 
8474b9ad928SBarry Smith    Calling sequence of apply:
8484b9ad928SBarry Smith .vb
8496891c3e4SJed Brown    PetscErrorCode apply (PC pc,Vec b,Vec x,Vec r,PetscReal rtol,PetscReal abstol,PetscReal dtol,PetscInt maxits)
8504b9ad928SBarry Smith .ve
8514b9ad928SBarry Smith 
8526891c3e4SJed Brown +  pc - the preconditioner, get the application context with PCShellGetContext()
8534b9ad928SBarry Smith .  b - right-hand-side
8544b9ad928SBarry Smith .  x - current iterate
8554b9ad928SBarry Smith .  r - work space
8564b9ad928SBarry Smith .  rtol - relative tolerance of residual norm to stop at
85770441072SBarry Smith .  abstol - absolute tolerance of residual norm to stop at
8584b9ad928SBarry Smith .  dtol - if residual norm increases by this factor than return
8594b9ad928SBarry Smith -  maxits - number of iterations to run
8604b9ad928SBarry Smith 
8614aa34b0aSBarry Smith    Notes: the function MUST return an error code of 0 on success and nonzero on failure.
8624aa34b0aSBarry Smith 
8634b9ad928SBarry Smith    Level: developer
8644b9ad928SBarry Smith 
8654b9ad928SBarry Smith .keywords: PC, shell, set, apply, Richardson, user-provided
8664b9ad928SBarry Smith 
867be29d3c6SBarry Smith .seealso: PCShellSetApply(), PCShellSetContext()
8684b9ad928SBarry Smith @*/
8696891c3e4SJed Brown PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApplyRichardson(PC pc,PetscErrorCode (*apply)(PC,Vec,Vec,Vec,PetscReal,PetscReal,PetscReal,PetscInt,PetscInt*,PCRichardsonConvergedReason*))
8704b9ad928SBarry Smith {
8716891c3e4SJed Brown   PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(PC,Vec,Vec,Vec,PetscReal,PetscReal,PetscReal,PetscInt,PetscInt*,PCRichardsonConvergedReason*));
8724b9ad928SBarry Smith 
8734b9ad928SBarry Smith   PetscFunctionBegin;
8744482741eSBarry Smith   PetscValidHeaderSpecific(pc,PC_COOKIE,1);
8754b9ad928SBarry Smith   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetApplyRichardson_C",(void (**)(void))&f);CHKERRQ(ierr);
8764b9ad928SBarry Smith   if (f) {
877be29d3c6SBarry Smith     ierr = (*f)(pc,apply);CHKERRQ(ierr);
8784b9ad928SBarry Smith   }
8794b9ad928SBarry Smith   PetscFunctionReturn(0);
8804b9ad928SBarry Smith }
8814b9ad928SBarry Smith 
8824b9ad928SBarry Smith /*MC
8834b9ad928SBarry Smith    PCSHELL - Creates a new preconditioner class for use with your
8844b9ad928SBarry Smith               own private data storage format.
8854b9ad928SBarry Smith 
8864b9ad928SBarry Smith    Level: advanced
88790198e61SBarry Smith >
8884b9ad928SBarry Smith    Concepts: providing your own preconditioner
8894b9ad928SBarry Smith 
8904b9ad928SBarry Smith   Usage:
8916891c3e4SJed Brown $             extern PetscErrorCode apply(PC,Vec,Vec);
8926891c3e4SJed Brown $             extern PetscErrorCode applyba(PC,PCSide,Vec,Vec,Vec);
8936891c3e4SJed Brown $             extern PetscErrorCode applytranspose(PC,Vec,Vec);
8946891c3e4SJed Brown $             extern PetscErrorCode setup(PC);
8956891c3e4SJed Brown $             extern PetscErrorCode destroy(PC);
8966891c3e4SJed Brown $
8974b9ad928SBarry Smith $             PCCreate(comm,&pc);
8984b9ad928SBarry Smith $             PCSetType(pc,PCSHELL);
899be29d3c6SBarry Smith $             PCShellSetContext(pc,ctx)
9006891c3e4SJed Brown $             PCShellSetApply(pc,apply);
9016891c3e4SJed Brown $             PCShellSetApplyBA(pc,applyba);               (optional)
9026891c3e4SJed Brown $             PCShellSetApplyTranspose(pc,applytranspose); (optional)
9034b9ad928SBarry Smith $             PCShellSetSetUp(pc,setup);                   (optional)
904d01c8aa3SLisandro Dalcin $             PCShellSetDestroy(pc,destroy);               (optional)
9054b9ad928SBarry Smith 
9064b9ad928SBarry Smith .seealso:  PCCreate(), PCSetType(), PCType (for list of available types), PC,
907fd2d0fe1Svictor            MATSHELL, PCShellSetSetUp(), PCShellSetApply(), PCShellSetView(),
908fd2d0fe1Svictor            PCShellSetApplyTranspose(), PCShellSetName(), PCShellSetApplyRichardson(),
9092bb17772SBarry Smith            PCShellGetName(), PCShellSetContext(), PCShellGetContext(), PCShellSetApplyBA()
9104b9ad928SBarry Smith M*/
9114b9ad928SBarry Smith 
9124b9ad928SBarry Smith EXTERN_C_BEGIN
9134b9ad928SBarry Smith #undef __FUNCT__
9144b9ad928SBarry Smith #define __FUNCT__ "PCCreate_Shell"
915dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCCreate_Shell(PC pc)
9164b9ad928SBarry Smith {
917dfbe8321SBarry Smith   PetscErrorCode ierr;
9184b9ad928SBarry Smith   PC_Shell       *shell;
9194b9ad928SBarry Smith 
9204b9ad928SBarry Smith   PetscFunctionBegin;
92138f2d2fdSLisandro Dalcin   ierr = PetscNewLog(pc,PC_Shell,&shell);CHKERRQ(ierr);
9224b9ad928SBarry Smith   pc->data  = (void*)shell;
9234b9ad928SBarry Smith 
924d01c8aa3SLisandro Dalcin   pc->ops->destroy         = PCDestroy_Shell;
9254b9ad928SBarry Smith   pc->ops->view            = PCView_Shell;
926d01c8aa3SLisandro Dalcin   pc->ops->apply           = PCApply_Shell;
927d01c8aa3SLisandro Dalcin   pc->ops->applytranspose  = 0;
9284b9ad928SBarry Smith   pc->ops->applyrichardson = 0;
929d01c8aa3SLisandro Dalcin   pc->ops->setup           = 0;
9309bbb2c88SBarry Smith   pc->ops->presolve        = 0;
9319bbb2c88SBarry Smith   pc->ops->postsolve       = 0;
9324b9ad928SBarry Smith 
9334b9ad928SBarry Smith   shell->apply          = 0;
9344b9ad928SBarry Smith   shell->applytranspose = 0;
9354b9ad928SBarry Smith   shell->name           = 0;
9364b9ad928SBarry Smith   shell->applyrich      = 0;
9377cdd61b2SBarry Smith   shell->presolve       = 0;
9387cdd61b2SBarry Smith   shell->postsolve      = 0;
9394b9ad928SBarry Smith   shell->ctx            = 0;
9404b9ad928SBarry Smith   shell->setup          = 0;
9414b9ad928SBarry Smith   shell->view           = 0;
94218be62a5SSatish Balay   shell->destroy        = 0;
9434b9ad928SBarry Smith 
94418be62a5SSatish Balay   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetDestroy_C","PCShellSetDestroy_Shell",
94518be62a5SSatish Balay                     PCShellSetDestroy_Shell);CHKERRQ(ierr);
9464b9ad928SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetSetUp_C","PCShellSetSetUp_Shell",
9474b9ad928SBarry Smith                     PCShellSetSetUp_Shell);CHKERRQ(ierr);
9484b9ad928SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetApply_C","PCShellSetApply_Shell",
9494b9ad928SBarry Smith                     PCShellSetApply_Shell);CHKERRQ(ierr);
9502bb17772SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetApplyBA_C","PCShellSetApplyBA_Shell",
9512bb17772SBarry Smith                     PCShellSetApplyBA_Shell);CHKERRQ(ierr);
9527cdd61b2SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetPreSolve_C","PCShellSetPreSolve_Shell",
9537cdd61b2SBarry Smith                     PCShellSetPreSolve_Shell);CHKERRQ(ierr);
9547cdd61b2SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetPostSolve_C","PCShellSetPostSolve_Shell",
9557cdd61b2SBarry Smith                     PCShellSetPostSolve_Shell);CHKERRQ(ierr);
9564b9ad928SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetView_C","PCShellSetView_Shell",
9574b9ad928SBarry Smith                     PCShellSetView_Shell);CHKERRQ(ierr);
958be29d3c6SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetApplyTranspose_C","PCShellSetApplyTranspose_Shell",
9594b9ad928SBarry Smith                     PCShellSetApplyTranspose_Shell);CHKERRQ(ierr);
9604b9ad928SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetName_C","PCShellSetName_Shell",
9614b9ad928SBarry Smith                     PCShellSetName_Shell);CHKERRQ(ierr);
9624b9ad928SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellGetName_C","PCShellGetName_Shell",
9634b9ad928SBarry Smith                     PCShellGetName_Shell);CHKERRQ(ierr);
964be29d3c6SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetApplyRichardson_C","PCShellSetApplyRichardson_Shell",
9654b9ad928SBarry Smith                     PCShellSetApplyRichardson_Shell);CHKERRQ(ierr);
9664b9ad928SBarry Smith   PetscFunctionReturn(0);
9674b9ad928SBarry Smith }
9684b9ad928SBarry Smith EXTERN_C_END
9694b9ad928SBarry Smith 
9704b9ad928SBarry Smith 
9714b9ad928SBarry Smith 
9724b9ad928SBarry Smith 
9734b9ad928SBarry Smith 
9744b9ad928SBarry Smith 
975