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); 23ace3abfcSBarry Smith PetscErrorCode (*applyrich)(PC,Vec,Vec,Vec,PetscReal,PetscReal,PetscReal,PetscInt,PetscBool ,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 @*/ 507087cfbeSBarry Smith PetscErrorCode PCShellGetContext(PC pc,void **ctx) 51be29d3c6SBarry Smith { 52be29d3c6SBarry Smith PetscErrorCode ierr; 53ace3abfcSBarry Smith PetscBool flg; 54be29d3c6SBarry Smith 55be29d3c6SBarry Smith PetscFunctionBegin; 560700a824SBarry Smith PetscValidHeaderSpecific(pc,PC_CLASSID,1); 57be29d3c6SBarry Smith PetscValidPointer(ctx,2); 58be29d3c6SBarry Smith ierr = PetscTypeCompare((PetscObject)pc,PCSHELL,&flg);CHKERRQ(ierr); 59be29d3c6SBarry Smith if (!flg) *ctx = 0; 60be29d3c6SBarry Smith else *ctx = ((PC_Shell*)(pc->data))->ctx; 61be29d3c6SBarry Smith PetscFunctionReturn(0); 62be29d3c6SBarry Smith } 63be29d3c6SBarry Smith 64be29d3c6SBarry Smith #undef __FUNCT__ 65be29d3c6SBarry Smith #define __FUNCT__ "PCShellSetContext" 669dd1005fSJed Brown /*@ 67be29d3c6SBarry Smith PCShellSetContext - sets the context for a shell PC 68be29d3c6SBarry Smith 693f9fe445SBarry Smith Logically Collective on PC 70be29d3c6SBarry Smith 71be29d3c6SBarry Smith Input Parameters: 72be29d3c6SBarry Smith + pc - the shell PC 73be29d3c6SBarry Smith - ctx - the context 74be29d3c6SBarry Smith 75be29d3c6SBarry Smith Level: advanced 76be29d3c6SBarry Smith 77be29d3c6SBarry Smith Fortran Notes: The context can only be an integer or a PetscObject 78be29d3c6SBarry Smith unfortunately it cannot be a Fortran array or derived type. 79be29d3c6SBarry Smith 806895c445SBarry Smith 81be29d3c6SBarry Smith .seealso: PCCreateShell(), PCShellGetContext() 82be29d3c6SBarry Smith @*/ 837087cfbeSBarry Smith PetscErrorCode PCShellSetContext(PC pc,void *ctx) 84be29d3c6SBarry Smith { 85d01c8aa3SLisandro Dalcin PC_Shell *shell; 86be29d3c6SBarry Smith PetscErrorCode ierr; 87ace3abfcSBarry Smith PetscBool 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"); 109eb6b5d47SBarry Smith PetscStackCall("PCSHELL user function setup()",ierr = (*shell->setup)(pc);CHKERRQ(ierr)); 1104b9ad928SBarry Smith PetscFunctionReturn(0); 1114b9ad928SBarry Smith } 1124b9ad928SBarry Smith 1134b9ad928SBarry Smith #undef __FUNCT__ 1144b9ad928SBarry Smith #define __FUNCT__ "PCApply_Shell" 1156849ba73SBarry Smith static PetscErrorCode PCApply_Shell(PC pc,Vec x,Vec y) 1164b9ad928SBarry Smith { 1174b9ad928SBarry Smith PC_Shell *shell; 118dfbe8321SBarry Smith PetscErrorCode ierr; 1194b9ad928SBarry Smith 1204b9ad928SBarry Smith PetscFunctionBegin; 1214b9ad928SBarry Smith shell = (PC_Shell*)pc->data; 122e7e72b3dSBarry Smith if (!shell->apply) SETERRQ(((PetscObject)pc)->comm,PETSC_ERR_USER,"No apply() routine provided to Shell PC"); 123eb6b5d47SBarry Smith PetscStackCall("PCSHELL user function apply()",ierr = (*shell->apply)(pc,x,y);CHKERRQ(ierr)); 1244b9ad928SBarry Smith PetscFunctionReturn(0); 1254b9ad928SBarry Smith } 1264b9ad928SBarry Smith 1274b9ad928SBarry Smith #undef __FUNCT__ 1282bb17772SBarry Smith #define __FUNCT__ "PCApplyBA_Shell" 1292bb17772SBarry Smith static PetscErrorCode PCApplyBA_Shell(PC pc,PCSide side,Vec x,Vec y,Vec w) 1302bb17772SBarry Smith { 1312bb17772SBarry Smith PC_Shell *shell; 1322bb17772SBarry Smith PetscErrorCode ierr; 1332bb17772SBarry Smith 1342bb17772SBarry Smith PetscFunctionBegin; 1352bb17772SBarry Smith shell = (PC_Shell*)pc->data; 136e7e72b3dSBarry Smith if (!shell->applyBA) SETERRQ(((PetscObject)pc)->comm,PETSC_ERR_USER,"No applyBA() routine provided to Shell PC"); 137eb6b5d47SBarry Smith PetscStackCall("PCSHELL user function applyBA()",ierr = (*shell->applyBA)(pc,side,x,y,w);CHKERRQ(ierr)); 1382bb17772SBarry Smith PetscFunctionReturn(0); 1392bb17772SBarry Smith } 1402bb17772SBarry Smith 1412bb17772SBarry Smith #undef __FUNCT__ 1427cdd61b2SBarry Smith #define __FUNCT__ "PCPreSolve_Shell" 1437cdd61b2SBarry Smith static PetscErrorCode PCPreSolve_Shell(PC pc,KSP ksp,Vec b,Vec x) 1447cdd61b2SBarry Smith { 1457cdd61b2SBarry Smith PC_Shell *shell; 1467cdd61b2SBarry Smith PetscErrorCode ierr; 1477cdd61b2SBarry Smith 1487cdd61b2SBarry Smith PetscFunctionBegin; 1497cdd61b2SBarry Smith shell = (PC_Shell*)pc->data; 150e7e72b3dSBarry Smith if (!shell->presolve) SETERRQ(((PetscObject)pc)->comm,PETSC_ERR_USER,"No presolve() routine provided to Shell PC"); 151eb6b5d47SBarry Smith PetscStackCall("PCSHELL user function presolve()",ierr = (*shell->presolve)(pc,ksp,b,x);CHKERRQ(ierr)); 1527cdd61b2SBarry Smith PetscFunctionReturn(0); 1537cdd61b2SBarry Smith } 1547cdd61b2SBarry Smith 1557cdd61b2SBarry Smith #undef __FUNCT__ 1567cdd61b2SBarry Smith #define __FUNCT__ "PCPostSolve_Shell" 1577cdd61b2SBarry Smith static PetscErrorCode PCPostSolve_Shell(PC pc,KSP ksp,Vec b,Vec x) 1587cdd61b2SBarry Smith { 1597cdd61b2SBarry Smith PC_Shell *shell; 1607cdd61b2SBarry Smith PetscErrorCode ierr; 1617cdd61b2SBarry Smith 1627cdd61b2SBarry Smith PetscFunctionBegin; 1637cdd61b2SBarry Smith shell = (PC_Shell*)pc->data; 164e7e72b3dSBarry Smith if (!shell->postsolve) SETERRQ(((PetscObject)pc)->comm,PETSC_ERR_USER,"No postsolve() routine provided to Shell PC"); 165eb6b5d47SBarry Smith PetscStackCall("PCSHELL user function postsolve()",ierr = (*shell->postsolve)(pc,ksp,b,x);CHKERRQ(ierr)); 1667cdd61b2SBarry Smith PetscFunctionReturn(0); 1677cdd61b2SBarry Smith } 1687cdd61b2SBarry Smith 1697cdd61b2SBarry Smith #undef __FUNCT__ 1704b9ad928SBarry Smith #define __FUNCT__ "PCApplyTranspose_Shell" 1716849ba73SBarry Smith static PetscErrorCode PCApplyTranspose_Shell(PC pc,Vec x,Vec y) 1724b9ad928SBarry Smith { 1734b9ad928SBarry Smith PC_Shell *shell; 174dfbe8321SBarry Smith PetscErrorCode ierr; 1754b9ad928SBarry Smith 1764b9ad928SBarry Smith PetscFunctionBegin; 1774b9ad928SBarry Smith shell = (PC_Shell*)pc->data; 178e7e72b3dSBarry Smith if (!shell->applytranspose) SETERRQ(((PetscObject)pc)->comm,PETSC_ERR_USER,"No applytranspose() routine provided to Shell PC"); 179eb6b5d47SBarry Smith PetscStackCall("PCSHELL user function applytranspose()",ierr = (*shell->applytranspose)(pc,x,y);CHKERRQ(ierr)); 1804b9ad928SBarry Smith PetscFunctionReturn(0); 1814b9ad928SBarry Smith } 1824b9ad928SBarry Smith 1834b9ad928SBarry Smith #undef __FUNCT__ 1844b9ad928SBarry Smith #define __FUNCT__ "PCApplyRichardson_Shell" 185ace3abfcSBarry Smith static PetscErrorCode PCApplyRichardson_Shell(PC pc,Vec x,Vec y,Vec w,PetscReal rtol,PetscReal abstol, PetscReal dtol,PetscInt it,PetscBool guesszero,PetscInt *outits,PCRichardsonConvergedReason *reason) 1864b9ad928SBarry Smith { 187dfbe8321SBarry Smith PetscErrorCode ierr; 1884b9ad928SBarry Smith PC_Shell *shell; 1894b9ad928SBarry Smith 1904b9ad928SBarry Smith PetscFunctionBegin; 1914b9ad928SBarry Smith shell = (PC_Shell*)pc->data; 192e7e72b3dSBarry Smith if (!shell->applyrich) SETERRQ(((PetscObject)pc)->comm,PETSC_ERR_USER,"No applyrichardson() routine provided to Shell PC"); 193eb6b5d47SBarry Smith PetscStackCall("PCSHELL user function applyrichardson()",ierr = (*shell->applyrich)(pc,x,y,w,rtol,abstol,dtol,it,guesszero,outits,reason);CHKERRQ(ierr)); 1944b9ad928SBarry Smith PetscFunctionReturn(0); 1954b9ad928SBarry Smith } 1964b9ad928SBarry Smith 1974b9ad928SBarry Smith #undef __FUNCT__ 1984b9ad928SBarry Smith #define __FUNCT__ "PCDestroy_Shell" 1996849ba73SBarry Smith static PetscErrorCode PCDestroy_Shell(PC pc) 2004b9ad928SBarry Smith { 2014b9ad928SBarry Smith PC_Shell *shell = (PC_Shell*)pc->data; 202dfbe8321SBarry Smith PetscErrorCode ierr; 2034b9ad928SBarry Smith 2044b9ad928SBarry Smith PetscFunctionBegin; 205503cfb0cSBarry Smith ierr = PetscFree(shell->name);CHKERRQ(ierr); 20618be62a5SSatish Balay if (shell->destroy) { 207eb6b5d47SBarry Smith PetscStackCall("PCSHELL user function destroy()",ierr = (*shell->destroy)(pc);CHKERRQ(ierr)); 20818be62a5SSatish Balay } 209*c31cb41cSBarry Smith ierr = PetscFree(pc->data);CHKERRQ(ierr); 2104b9ad928SBarry Smith PetscFunctionReturn(0); 2114b9ad928SBarry Smith } 2124b9ad928SBarry Smith 2134b9ad928SBarry Smith #undef __FUNCT__ 2144b9ad928SBarry Smith #define __FUNCT__ "PCView_Shell" 2156849ba73SBarry Smith static PetscErrorCode PCView_Shell(PC pc,PetscViewer viewer) 2164b9ad928SBarry Smith { 2174b9ad928SBarry Smith PC_Shell *shell = (PC_Shell*)pc->data; 218dfbe8321SBarry Smith PetscErrorCode ierr; 219ace3abfcSBarry Smith PetscBool iascii; 2204b9ad928SBarry Smith 2214b9ad928SBarry Smith PetscFunctionBegin; 2222692d6eeSBarry Smith ierr = PetscTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 22332077d6dSBarry Smith if (iascii) { 2244b9ad928SBarry Smith if (shell->name) {ierr = PetscViewerASCIIPrintf(viewer," Shell: %s\n",shell->name);CHKERRQ(ierr);} 2254b9ad928SBarry Smith else {ierr = PetscViewerASCIIPrintf(viewer," Shell: no name\n");CHKERRQ(ierr);} 2264b9ad928SBarry Smith } 2274b9ad928SBarry Smith if (shell->view) { 2284b9ad928SBarry Smith ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 2296891c3e4SJed Brown ierr = (*shell->view)(pc,viewer);CHKERRQ(ierr); 2304b9ad928SBarry Smith ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 2314b9ad928SBarry Smith } 2324b9ad928SBarry Smith PetscFunctionReturn(0); 2334b9ad928SBarry Smith } 2344b9ad928SBarry Smith 2354b9ad928SBarry Smith /* ------------------------------------------------------------------------------*/ 2364b9ad928SBarry Smith EXTERN_C_BEGIN 2374b9ad928SBarry Smith #undef __FUNCT__ 23818be62a5SSatish Balay #define __FUNCT__ "PCShellSetDestroy_Shell" 2397087cfbeSBarry Smith PetscErrorCode PCShellSetDestroy_Shell(PC pc, PetscErrorCode (*destroy)(PC)) 24018be62a5SSatish Balay { 24118be62a5SSatish Balay PC_Shell *shell; 24218be62a5SSatish Balay 24318be62a5SSatish Balay PetscFunctionBegin; 24418be62a5SSatish Balay shell = (PC_Shell*)pc->data; 24518be62a5SSatish Balay shell->destroy = destroy; 24618be62a5SSatish Balay PetscFunctionReturn(0); 24718be62a5SSatish Balay } 24818be62a5SSatish Balay EXTERN_C_END 24918be62a5SSatish Balay 25018be62a5SSatish Balay EXTERN_C_BEGIN 25118be62a5SSatish Balay #undef __FUNCT__ 2524b9ad928SBarry Smith #define __FUNCT__ "PCShellSetSetUp_Shell" 2537087cfbeSBarry Smith PetscErrorCode PCShellSetSetUp_Shell(PC pc, PetscErrorCode (*setup)(PC)) 2544b9ad928SBarry Smith { 2554b9ad928SBarry Smith PC_Shell *shell; 2564b9ad928SBarry Smith 2574b9ad928SBarry Smith PetscFunctionBegin; 2584b9ad928SBarry Smith shell = (PC_Shell*)pc->data; 2594b9ad928SBarry Smith shell->setup = setup; 260d01c8aa3SLisandro Dalcin if (setup) pc->ops->setup = PCSetUp_Shell; 261d01c8aa3SLisandro Dalcin else pc->ops->setup = 0; 2624b9ad928SBarry Smith PetscFunctionReturn(0); 2634b9ad928SBarry Smith } 2644b9ad928SBarry Smith EXTERN_C_END 2654b9ad928SBarry Smith 2664b9ad928SBarry Smith EXTERN_C_BEGIN 2674b9ad928SBarry Smith #undef __FUNCT__ 2684b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApply_Shell" 2697087cfbeSBarry Smith PetscErrorCode PCShellSetApply_Shell(PC pc,PetscErrorCode (*apply)(PC,Vec,Vec)) 2704b9ad928SBarry Smith { 2714b9ad928SBarry Smith PC_Shell *shell; 2724b9ad928SBarry Smith 2734b9ad928SBarry Smith PetscFunctionBegin; 2744b9ad928SBarry Smith shell = (PC_Shell*)pc->data; 2754b9ad928SBarry Smith shell->apply = apply; 2764b9ad928SBarry Smith PetscFunctionReturn(0); 2774b9ad928SBarry Smith } 2784b9ad928SBarry Smith EXTERN_C_END 2794b9ad928SBarry Smith 2804b9ad928SBarry Smith EXTERN_C_BEGIN 2814b9ad928SBarry Smith #undef __FUNCT__ 2822bb17772SBarry Smith #define __FUNCT__ "PCShellSetApplyBA_Shell" 2837087cfbeSBarry Smith PetscErrorCode PCShellSetApplyBA_Shell(PC pc,PetscErrorCode (*applyBA)(PC,PCSide,Vec,Vec,Vec)) 2842bb17772SBarry Smith { 2852bb17772SBarry Smith PC_Shell *shell; 2862bb17772SBarry Smith 2872bb17772SBarry Smith PetscFunctionBegin; 2882bb17772SBarry Smith shell = (PC_Shell*)pc->data; 289d01c8aa3SLisandro Dalcin shell->applyBA = applyBA; 290d01c8aa3SLisandro Dalcin if (applyBA) pc->ops->applyBA = PCApplyBA_Shell; 291aef0136fSBarry Smith else pc->ops->applyBA = 0; 2922bb17772SBarry Smith PetscFunctionReturn(0); 2932bb17772SBarry Smith } 2942bb17772SBarry Smith EXTERN_C_END 2952bb17772SBarry Smith 2962bb17772SBarry Smith EXTERN_C_BEGIN 2972bb17772SBarry Smith #undef __FUNCT__ 2987cdd61b2SBarry Smith #define __FUNCT__ "PCShellSetPreSolve_Shell" 2997087cfbeSBarry Smith PetscErrorCode PCShellSetPreSolve_Shell(PC pc,PetscErrorCode (*presolve)(PC,KSP,Vec,Vec)) 3007cdd61b2SBarry Smith { 3017cdd61b2SBarry Smith PC_Shell *shell; 3027cdd61b2SBarry Smith 3037cdd61b2SBarry Smith PetscFunctionBegin; 3047cdd61b2SBarry Smith shell = (PC_Shell*)pc->data; 3057cdd61b2SBarry Smith shell->presolve = presolve; 306d01c8aa3SLisandro Dalcin if (presolve) pc->ops->presolve = PCPreSolve_Shell; 307d01c8aa3SLisandro Dalcin else pc->ops->presolve = 0; 3087cdd61b2SBarry Smith PetscFunctionReturn(0); 3097cdd61b2SBarry Smith } 3107cdd61b2SBarry Smith EXTERN_C_END 3117cdd61b2SBarry Smith 3127cdd61b2SBarry Smith EXTERN_C_BEGIN 3137cdd61b2SBarry Smith #undef __FUNCT__ 3147cdd61b2SBarry Smith #define __FUNCT__ "PCShellSetPostSolve_Shell" 3157087cfbeSBarry Smith PetscErrorCode PCShellSetPostSolve_Shell(PC pc,PetscErrorCode (*postsolve)(PC,KSP,Vec,Vec)) 3167cdd61b2SBarry Smith { 3177cdd61b2SBarry Smith PC_Shell *shell; 3187cdd61b2SBarry Smith 3197cdd61b2SBarry Smith PetscFunctionBegin; 3207cdd61b2SBarry Smith shell = (PC_Shell*)pc->data; 3217cdd61b2SBarry Smith shell->postsolve = postsolve; 322d01c8aa3SLisandro Dalcin if (postsolve) pc->ops->postsolve = PCPostSolve_Shell; 323d01c8aa3SLisandro Dalcin else pc->ops->postsolve = 0; 3247cdd61b2SBarry Smith PetscFunctionReturn(0); 3257cdd61b2SBarry Smith } 3267cdd61b2SBarry Smith EXTERN_C_END 3277cdd61b2SBarry Smith 3287cdd61b2SBarry Smith EXTERN_C_BEGIN 3297cdd61b2SBarry Smith #undef __FUNCT__ 3304b9ad928SBarry Smith #define __FUNCT__ "PCShellSetView_Shell" 3317087cfbeSBarry Smith PetscErrorCode PCShellSetView_Shell(PC pc,PetscErrorCode (*view)(PC,PetscViewer)) 3324b9ad928SBarry Smith { 3334b9ad928SBarry Smith PC_Shell *shell; 3344b9ad928SBarry Smith 3354b9ad928SBarry Smith PetscFunctionBegin; 3364b9ad928SBarry Smith shell = (PC_Shell*)pc->data; 3374b9ad928SBarry Smith shell->view = view; 3384b9ad928SBarry Smith PetscFunctionReturn(0); 3394b9ad928SBarry Smith } 3404b9ad928SBarry Smith EXTERN_C_END 3414b9ad928SBarry Smith 3424b9ad928SBarry Smith EXTERN_C_BEGIN 3434b9ad928SBarry Smith #undef __FUNCT__ 3444b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApplyTranspose_Shell" 3457087cfbeSBarry Smith PetscErrorCode PCShellSetApplyTranspose_Shell(PC pc,PetscErrorCode (*applytranspose)(PC,Vec,Vec)) 3464b9ad928SBarry Smith { 3474b9ad928SBarry Smith PC_Shell *shell; 3484b9ad928SBarry Smith 3494b9ad928SBarry Smith PetscFunctionBegin; 3504b9ad928SBarry Smith shell = (PC_Shell*)pc->data; 3514b9ad928SBarry Smith shell->applytranspose = applytranspose; 352d01c8aa3SLisandro Dalcin if (applytranspose) pc->ops->applytranspose = PCApplyTranspose_Shell; 353d01c8aa3SLisandro Dalcin else pc->ops->applytranspose = 0; 354d01c8aa3SLisandro Dalcin PetscFunctionReturn(0); 355d01c8aa3SLisandro Dalcin } 356d01c8aa3SLisandro Dalcin EXTERN_C_END 357d01c8aa3SLisandro Dalcin 358d01c8aa3SLisandro Dalcin EXTERN_C_BEGIN 359d01c8aa3SLisandro Dalcin #undef __FUNCT__ 360d01c8aa3SLisandro Dalcin #define __FUNCT__ "PCShellSetApplyRichardson_Shell" 3617087cfbeSBarry Smith PetscErrorCode PCShellSetApplyRichardson_Shell(PC pc,PetscErrorCode (*applyrich)(PC,Vec,Vec,Vec,PetscReal,PetscReal,PetscReal,PetscInt,PetscBool ,PetscInt*,PCRichardsonConvergedReason*)) 362d01c8aa3SLisandro Dalcin { 363d01c8aa3SLisandro Dalcin PC_Shell *shell; 364d01c8aa3SLisandro Dalcin 365d01c8aa3SLisandro Dalcin PetscFunctionBegin; 366d01c8aa3SLisandro Dalcin shell = (PC_Shell*)pc->data; 367d01c8aa3SLisandro Dalcin shell->applyrich = applyrich; 368d01c8aa3SLisandro Dalcin if (applyrich) pc->ops->applyrichardson = PCApplyRichardson_Shell; 369d01c8aa3SLisandro Dalcin else pc->ops->applyrichardson = 0; 3704b9ad928SBarry Smith PetscFunctionReturn(0); 3714b9ad928SBarry Smith } 3724b9ad928SBarry Smith EXTERN_C_END 3734b9ad928SBarry Smith 3744b9ad928SBarry Smith EXTERN_C_BEGIN 3754b9ad928SBarry Smith #undef __FUNCT__ 3764b9ad928SBarry Smith #define __FUNCT__ "PCShellSetName_Shell" 3777087cfbeSBarry Smith PetscErrorCode PCShellSetName_Shell(PC pc,const char name[]) 3784b9ad928SBarry Smith { 3794b9ad928SBarry Smith PC_Shell *shell; 380dfbe8321SBarry Smith PetscErrorCode ierr; 3814b9ad928SBarry Smith 3824b9ad928SBarry Smith PetscFunctionBegin; 3834b9ad928SBarry Smith shell = (PC_Shell*)pc->data; 384503cfb0cSBarry Smith ierr = PetscFree(shell->name);CHKERRQ(ierr); 3854b9ad928SBarry Smith ierr = PetscStrallocpy(name,&shell->name);CHKERRQ(ierr); 3864b9ad928SBarry Smith PetscFunctionReturn(0); 3874b9ad928SBarry Smith } 3884b9ad928SBarry Smith EXTERN_C_END 3894b9ad928SBarry Smith 3904b9ad928SBarry Smith EXTERN_C_BEGIN 3914b9ad928SBarry Smith #undef __FUNCT__ 3924b9ad928SBarry Smith #define __FUNCT__ "PCShellGetName_Shell" 3937087cfbeSBarry Smith PetscErrorCode PCShellGetName_Shell(PC pc,char *name[]) 3944b9ad928SBarry Smith { 3954b9ad928SBarry Smith PC_Shell *shell; 3964b9ad928SBarry Smith 3974b9ad928SBarry Smith PetscFunctionBegin; 3984b9ad928SBarry Smith shell = (PC_Shell*)pc->data; 3994b9ad928SBarry Smith *name = shell->name; 4004b9ad928SBarry Smith PetscFunctionReturn(0); 4014b9ad928SBarry Smith } 4024b9ad928SBarry Smith EXTERN_C_END 4034b9ad928SBarry Smith 4044b9ad928SBarry Smith /* -------------------------------------------------------------------------------*/ 4054b9ad928SBarry Smith 4064b9ad928SBarry Smith #undef __FUNCT__ 40718be62a5SSatish Balay #define __FUNCT__ "PCShellSetDestroy" 40818be62a5SSatish Balay /*@C 40918be62a5SSatish Balay PCShellSetDestroy - Sets routine to use to destroy the user-provided 41018be62a5SSatish Balay application context. 41118be62a5SSatish Balay 4123f9fe445SBarry Smith Logically Collective on PC 41318be62a5SSatish Balay 41418be62a5SSatish Balay Input Parameters: 41518be62a5SSatish Balay + pc - the preconditioner context 41618be62a5SSatish Balay . destroy - the application-provided destroy routine 41718be62a5SSatish Balay 41818be62a5SSatish Balay Calling sequence of destroy: 41918be62a5SSatish Balay .vb 4206891c3e4SJed Brown PetscErrorCode destroy (PC) 42118be62a5SSatish Balay .ve 42218be62a5SSatish Balay 42318be62a5SSatish Balay . ptr - the application context 42418be62a5SSatish Balay 4254aa34b0aSBarry Smith Notes: the function MUST return an error code of 0 on success and nonzero on failure. 4264aa34b0aSBarry Smith 42718be62a5SSatish Balay Level: developer 42818be62a5SSatish Balay 42918be62a5SSatish Balay .keywords: PC, shell, set, destroy, user-provided 43018be62a5SSatish Balay 43118be62a5SSatish Balay .seealso: PCShellSetApply(), PCShellSetContext() 43218be62a5SSatish Balay @*/ 4337087cfbeSBarry Smith PetscErrorCode PCShellSetDestroy(PC pc,PetscErrorCode (*destroy)(PC)) 43418be62a5SSatish Balay { 4354ac538c5SBarry Smith PetscErrorCode ierr; 43618be62a5SSatish Balay 43718be62a5SSatish Balay PetscFunctionBegin; 4380700a824SBarry Smith PetscValidHeaderSpecific(pc,PC_CLASSID,1); 4394ac538c5SBarry Smith ierr = PetscTryMethod(pc,"PCShellSetDestroy_C",(PC,PetscErrorCode (*)(PC)),(pc,destroy));CHKERRQ(ierr); 44018be62a5SSatish Balay PetscFunctionReturn(0); 44118be62a5SSatish Balay } 44218be62a5SSatish Balay 44318be62a5SSatish Balay 44418be62a5SSatish Balay #undef __FUNCT__ 4454b9ad928SBarry Smith #define __FUNCT__ "PCShellSetSetUp" 4464b9ad928SBarry Smith /*@C 4474b9ad928SBarry Smith PCShellSetSetUp - Sets routine to use to "setup" the preconditioner whenever the 4484b9ad928SBarry Smith matrix operator is changed. 4494b9ad928SBarry Smith 4503f9fe445SBarry Smith Logically Collective on PC 4514b9ad928SBarry Smith 4524b9ad928SBarry Smith Input Parameters: 4534b9ad928SBarry Smith + pc - the preconditioner context 4544b9ad928SBarry Smith . setup - the application-provided setup routine 4554b9ad928SBarry Smith 4564b9ad928SBarry Smith Calling sequence of setup: 4574b9ad928SBarry Smith .vb 4586891c3e4SJed Brown PetscErrorCode setup (PC pc) 4594b9ad928SBarry Smith .ve 4604b9ad928SBarry Smith 4616891c3e4SJed Brown . pc - the preconditioner, get the application context with PCShellGetContext() 4624b9ad928SBarry Smith 4634aa34b0aSBarry Smith Notes: the function MUST return an error code of 0 on success and nonzero on failure. 4644aa34b0aSBarry Smith 4654b9ad928SBarry Smith Level: developer 4664b9ad928SBarry Smith 4674b9ad928SBarry Smith .keywords: PC, shell, set, setup, user-provided 4684b9ad928SBarry Smith 469be29d3c6SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetApply(), PCShellSetContext() 4704b9ad928SBarry Smith @*/ 4717087cfbeSBarry Smith PetscErrorCode PCShellSetSetUp(PC pc,PetscErrorCode (*setup)(PC)) 4724b9ad928SBarry Smith { 4734ac538c5SBarry Smith PetscErrorCode ierr; 4744b9ad928SBarry Smith 4754b9ad928SBarry Smith PetscFunctionBegin; 4760700a824SBarry Smith PetscValidHeaderSpecific(pc,PC_CLASSID,1); 4774ac538c5SBarry Smith ierr = PetscTryMethod(pc,"PCShellSetSetUp_C",(PC,PetscErrorCode (*)(PC)),(pc,setup));CHKERRQ(ierr); 4784b9ad928SBarry Smith PetscFunctionReturn(0); 4794b9ad928SBarry Smith } 4804b9ad928SBarry Smith 4814b9ad928SBarry Smith 4824b9ad928SBarry Smith #undef __FUNCT__ 4834b9ad928SBarry Smith #define __FUNCT__ "PCShellSetView" 4844b9ad928SBarry Smith /*@C 4854b9ad928SBarry Smith PCShellSetView - Sets routine to use as viewer of shell preconditioner 4864b9ad928SBarry Smith 4873f9fe445SBarry Smith Logically Collective on PC 4884b9ad928SBarry Smith 4894b9ad928SBarry Smith Input Parameters: 4904b9ad928SBarry Smith + pc - the preconditioner context 4914b9ad928SBarry Smith - view - the application-provided view routine 4924b9ad928SBarry Smith 4934b9ad928SBarry Smith Calling sequence of apply: 4944b9ad928SBarry Smith .vb 4956891c3e4SJed Brown PetscErrorCode view(PC pc,PetscViewer v) 4964b9ad928SBarry Smith .ve 4974b9ad928SBarry Smith 4986891c3e4SJed Brown + pc - the preconditioner, get the application context with PCShellGetContext() 4994b9ad928SBarry Smith - v - viewer 5004b9ad928SBarry Smith 5014aa34b0aSBarry Smith Notes: the function MUST return an error code of 0 on success and nonzero on failure. 5024aa34b0aSBarry Smith 5034b9ad928SBarry Smith Level: developer 5044b9ad928SBarry Smith 5054b9ad928SBarry Smith .keywords: PC, shell, set, apply, user-provided 5064b9ad928SBarry Smith 5074b9ad928SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose() 5084b9ad928SBarry Smith @*/ 5097087cfbeSBarry Smith PetscErrorCode PCShellSetView(PC pc,PetscErrorCode (*view)(PC,PetscViewer)) 5104b9ad928SBarry Smith { 5114ac538c5SBarry Smith PetscErrorCode ierr; 5124b9ad928SBarry Smith 5134b9ad928SBarry Smith PetscFunctionBegin; 5140700a824SBarry Smith PetscValidHeaderSpecific(pc,PC_CLASSID,1); 5154ac538c5SBarry Smith ierr = PetscTryMethod(pc,"PCShellSetView_C",(PC,PetscErrorCode (*)(PC,PetscViewer)),(pc,view));CHKERRQ(ierr); 5164b9ad928SBarry Smith PetscFunctionReturn(0); 5174b9ad928SBarry Smith } 5184b9ad928SBarry Smith 5194b9ad928SBarry Smith #undef __FUNCT__ 5204b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApply" 5214b9ad928SBarry Smith /*@C 5224b9ad928SBarry Smith PCShellSetApply - Sets routine to use as preconditioner. 5234b9ad928SBarry Smith 5243f9fe445SBarry Smith Logically Collective on PC 5254b9ad928SBarry Smith 5264b9ad928SBarry Smith Input Parameters: 5274b9ad928SBarry Smith + pc - the preconditioner context 528be29d3c6SBarry Smith - apply - the application-provided preconditioning routine 5294b9ad928SBarry Smith 5304b9ad928SBarry Smith Calling sequence of apply: 5314b9ad928SBarry Smith .vb 5326891c3e4SJed Brown PetscErrorCode apply (PC pc,Vec xin,Vec xout) 5334b9ad928SBarry Smith .ve 5344b9ad928SBarry Smith 5356891c3e4SJed Brown + pc - the preconditioner, get the application context with PCShellGetContext() 5364b9ad928SBarry Smith . xin - input vector 5374b9ad928SBarry Smith - xout - output vector 5384b9ad928SBarry Smith 5394aa34b0aSBarry Smith Notes: the function MUST return an error code of 0 on success and nonzero on failure. 5404aa34b0aSBarry Smith 541292fb18eSBarry Smith Developer Notes: There should also be a PCShellSetApplySymmetricRight() and PCShellSetApplySymmetricLeft(). 542292fb18eSBarry Smith 5434b9ad928SBarry Smith Level: developer 5444b9ad928SBarry Smith 5454b9ad928SBarry Smith .keywords: PC, shell, set, apply, user-provided 5464b9ad928SBarry Smith 5472bb17772SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose(), PCShellSetContext(), PCShellSetApplyBA() 5484b9ad928SBarry Smith @*/ 5497087cfbeSBarry Smith PetscErrorCode PCShellSetApply(PC pc,PetscErrorCode (*apply)(PC,Vec,Vec)) 5504b9ad928SBarry Smith { 5514ac538c5SBarry Smith PetscErrorCode ierr; 5524b9ad928SBarry Smith 5534b9ad928SBarry Smith PetscFunctionBegin; 5540700a824SBarry Smith PetscValidHeaderSpecific(pc,PC_CLASSID,1); 5554ac538c5SBarry Smith ierr = PetscTryMethod(pc,"PCShellSetApply_C",(PC,PetscErrorCode (*)(PC,Vec,Vec)),(pc,apply));CHKERRQ(ierr); 5564b9ad928SBarry Smith PetscFunctionReturn(0); 5574b9ad928SBarry Smith } 5584b9ad928SBarry Smith 5594b9ad928SBarry Smith #undef __FUNCT__ 5602bb17772SBarry Smith #define __FUNCT__ "PCShellSetApplyBA" 5612bb17772SBarry Smith /*@C 5622bb17772SBarry Smith PCShellSetApplyBA - Sets routine to use as preconditioner times operator. 5632bb17772SBarry Smith 5643f9fe445SBarry Smith Logically Collective on PC 5652bb17772SBarry Smith 5662bb17772SBarry Smith Input Parameters: 5672bb17772SBarry Smith + pc - the preconditioner context 5682bb17772SBarry Smith - applyBA - the application-provided BA routine 5692bb17772SBarry Smith 5702bb17772SBarry Smith Calling sequence of apply: 5712bb17772SBarry Smith .vb 5726891c3e4SJed Brown PetscErrorCode applyBA (PC pc,Vec xin,Vec xout) 5732bb17772SBarry Smith .ve 5742bb17772SBarry Smith 5756891c3e4SJed Brown + pc - the preconditioner, get the application context with PCShellGetContext() 5762bb17772SBarry Smith . xin - input vector 5772bb17772SBarry Smith - xout - output vector 5782bb17772SBarry Smith 5794aa34b0aSBarry Smith Notes: the function MUST return an error code of 0 on success and nonzero on failure. 5804aa34b0aSBarry Smith 5812bb17772SBarry Smith Level: developer 5822bb17772SBarry Smith 5832bb17772SBarry Smith .keywords: PC, shell, set, apply, user-provided 5842bb17772SBarry Smith 5852bb17772SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose(), PCShellSetContext(), PCShellSetApply() 5862bb17772SBarry Smith @*/ 5877087cfbeSBarry Smith PetscErrorCode PCShellSetApplyBA(PC pc,PetscErrorCode (*applyBA)(PC,PCSide,Vec,Vec,Vec)) 5882bb17772SBarry Smith { 5894ac538c5SBarry Smith PetscErrorCode ierr; 5902bb17772SBarry Smith 5912bb17772SBarry Smith PetscFunctionBegin; 5920700a824SBarry Smith PetscValidHeaderSpecific(pc,PC_CLASSID,1); 5934ac538c5SBarry Smith ierr = PetscTryMethod(pc,"PCShellSetApplyBA_C",(PC,PetscErrorCode (*)(PC,PCSide,Vec,Vec,Vec)),(pc,applyBA));CHKERRQ(ierr); 5942bb17772SBarry Smith PetscFunctionReturn(0); 5952bb17772SBarry Smith } 5962bb17772SBarry Smith 5972bb17772SBarry Smith #undef __FUNCT__ 5984b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApplyTranspose" 5994b9ad928SBarry Smith /*@C 6004b9ad928SBarry Smith PCShellSetApplyTranspose - Sets routine to use as preconditioner transpose. 6014b9ad928SBarry Smith 6023f9fe445SBarry Smith Logically Collective on PC 6034b9ad928SBarry Smith 6044b9ad928SBarry Smith Input Parameters: 6054b9ad928SBarry Smith + pc - the preconditioner context 6064b9ad928SBarry Smith - apply - the application-provided preconditioning transpose routine 6074b9ad928SBarry Smith 6084b9ad928SBarry Smith Calling sequence of apply: 6094b9ad928SBarry Smith .vb 6106891c3e4SJed Brown PetscErrorCode applytranspose (PC pc,Vec xin,Vec xout) 6114b9ad928SBarry Smith .ve 6124b9ad928SBarry Smith 6136891c3e4SJed Brown + pc - the preconditioner, get the application context with PCShellGetContext() 6144b9ad928SBarry Smith . xin - input vector 6154b9ad928SBarry Smith - xout - output vector 6164b9ad928SBarry Smith 6174aa34b0aSBarry Smith Notes: the function MUST return an error code of 0 on success and nonzero on failure. 6184aa34b0aSBarry Smith 6194b9ad928SBarry Smith Level: developer 6204b9ad928SBarry Smith 6214b9ad928SBarry Smith Notes: 6224b9ad928SBarry Smith Uses the same context variable as PCShellSetApply(). 6234b9ad928SBarry Smith 6244b9ad928SBarry Smith .keywords: PC, shell, set, apply, user-provided 6254b9ad928SBarry Smith 6262bb17772SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApply(), PCSetContext(), PCShellSetApplyBA() 6274b9ad928SBarry Smith @*/ 6287087cfbeSBarry Smith PetscErrorCode PCShellSetApplyTranspose(PC pc,PetscErrorCode (*applytranspose)(PC,Vec,Vec)) 6294b9ad928SBarry Smith { 6304ac538c5SBarry Smith PetscErrorCode ierr; 6314b9ad928SBarry Smith 6324b9ad928SBarry Smith PetscFunctionBegin; 6330700a824SBarry Smith PetscValidHeaderSpecific(pc,PC_CLASSID,1); 6344ac538c5SBarry Smith ierr = PetscTryMethod(pc,"PCShellSetApplyTranspose_C",(PC,PetscErrorCode (*)(PC,Vec,Vec)),(pc,applytranspose));CHKERRQ(ierr); 6354b9ad928SBarry Smith PetscFunctionReturn(0); 6364b9ad928SBarry Smith } 6374b9ad928SBarry Smith 6384b9ad928SBarry Smith #undef __FUNCT__ 6397cdd61b2SBarry Smith #define __FUNCT__ "PCShellSetPreSolve" 6407cdd61b2SBarry Smith /*@C 6417cdd61b2SBarry Smith PCShellSetPreSolve - Sets routine to apply to the operators/vectors before a KSPSolve() is 6427cdd61b2SBarry Smith applied. This usually does something like scale the linear system in some application 6437cdd61b2SBarry Smith specific way. 6447cdd61b2SBarry Smith 6453f9fe445SBarry Smith Logically Collective on PC 6467cdd61b2SBarry Smith 6477cdd61b2SBarry Smith Input Parameters: 6487cdd61b2SBarry Smith + pc - the preconditioner context 6497cdd61b2SBarry Smith - presolve - the application-provided presolve routine 6507cdd61b2SBarry Smith 6517cdd61b2SBarry Smith Calling sequence of presolve: 6527cdd61b2SBarry Smith .vb 6536891c3e4SJed Brown PetscErrorCode presolve (PC,KSP ksp,Vec b,Vec x) 6547cdd61b2SBarry Smith .ve 6557cdd61b2SBarry Smith 6566891c3e4SJed Brown + pc - the preconditioner, get the application context with PCShellGetContext() 6577cdd61b2SBarry Smith . xin - input vector 6587cdd61b2SBarry Smith - xout - output vector 6597cdd61b2SBarry Smith 6604aa34b0aSBarry Smith Notes: the function MUST return an error code of 0 on success and nonzero on failure. 6614aa34b0aSBarry Smith 6627cdd61b2SBarry Smith Level: developer 6637cdd61b2SBarry Smith 6647cdd61b2SBarry Smith .keywords: PC, shell, set, apply, user-provided 6657cdd61b2SBarry Smith 666be29d3c6SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose(), PCShellSetPostSolve(), PCShellSetContext() 6677cdd61b2SBarry Smith @*/ 6687087cfbeSBarry Smith PetscErrorCode PCShellSetPreSolve(PC pc,PetscErrorCode (*presolve)(PC,KSP,Vec,Vec)) 6697cdd61b2SBarry Smith { 6704ac538c5SBarry Smith PetscErrorCode ierr; 6717cdd61b2SBarry Smith 6727cdd61b2SBarry Smith PetscFunctionBegin; 6730700a824SBarry Smith PetscValidHeaderSpecific(pc,PC_CLASSID,1); 6744ac538c5SBarry Smith ierr = PetscTryMethod(pc,"PCShellSetPreSolve_C",(PC,PetscErrorCode (*)(PC,KSP,Vec,Vec)),(pc,presolve));CHKERRQ(ierr); 6757cdd61b2SBarry Smith PetscFunctionReturn(0); 6767cdd61b2SBarry Smith } 6777cdd61b2SBarry Smith 6787cdd61b2SBarry Smith #undef __FUNCT__ 6797cdd61b2SBarry Smith #define __FUNCT__ "PCShellSetPostSolve" 6807cdd61b2SBarry Smith /*@C 6817cdd61b2SBarry Smith PCShellSetPostSolve - Sets routine to apply to the operators/vectors before a KSPSolve() is 6827cdd61b2SBarry Smith applied. This usually does something like scale the linear system in some application 6837cdd61b2SBarry Smith specific way. 6847cdd61b2SBarry Smith 6853f9fe445SBarry Smith Logically Collective on PC 6867cdd61b2SBarry Smith 6877cdd61b2SBarry Smith Input Parameters: 6887cdd61b2SBarry Smith + pc - the preconditioner context 6897cdd61b2SBarry Smith - postsolve - the application-provided presolve routine 6907cdd61b2SBarry Smith 6917cdd61b2SBarry Smith Calling sequence of postsolve: 6927cdd61b2SBarry Smith .vb 6936891c3e4SJed Brown PetscErrorCode postsolve(PC,KSP ksp,Vec b,Vec x) 6947cdd61b2SBarry Smith .ve 6957cdd61b2SBarry Smith 6966891c3e4SJed Brown + pc - the preconditioner, get the application context with PCShellGetContext() 6977cdd61b2SBarry Smith . xin - input vector 6987cdd61b2SBarry Smith - xout - output vector 6997cdd61b2SBarry Smith 7004aa34b0aSBarry Smith Notes: the function MUST return an error code of 0 on success and nonzero on failure. 7014aa34b0aSBarry Smith 7027cdd61b2SBarry Smith Level: developer 7037cdd61b2SBarry Smith 7047cdd61b2SBarry Smith .keywords: PC, shell, set, apply, user-provided 7057cdd61b2SBarry Smith 706be29d3c6SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose(), PCShellSetPreSolve(), PCShellSetContext() 7077cdd61b2SBarry Smith @*/ 7087087cfbeSBarry Smith PetscErrorCode PCShellSetPostSolve(PC pc,PetscErrorCode (*postsolve)(PC,KSP,Vec,Vec)) 7097cdd61b2SBarry Smith { 7104ac538c5SBarry Smith PetscErrorCode ierr; 7117cdd61b2SBarry Smith 7127cdd61b2SBarry Smith PetscFunctionBegin; 7130700a824SBarry Smith PetscValidHeaderSpecific(pc,PC_CLASSID,1); 7144ac538c5SBarry Smith ierr = PetscTryMethod(pc,"PCShellSetPostSolve_C",(PC,PetscErrorCode (*)(PC,KSP,Vec,Vec)),(pc,postsolve));CHKERRQ(ierr); 7157cdd61b2SBarry Smith PetscFunctionReturn(0); 7167cdd61b2SBarry Smith } 7177cdd61b2SBarry Smith 7187cdd61b2SBarry Smith #undef __FUNCT__ 7194b9ad928SBarry Smith #define __FUNCT__ "PCShellSetName" 7204b9ad928SBarry Smith /*@C 7214b9ad928SBarry Smith PCShellSetName - Sets an optional name to associate with a shell 7224b9ad928SBarry Smith preconditioner. 7234b9ad928SBarry Smith 7244b9ad928SBarry Smith Not Collective 7254b9ad928SBarry Smith 7264b9ad928SBarry Smith Input Parameters: 7274b9ad928SBarry Smith + pc - the preconditioner context 7284b9ad928SBarry Smith - name - character string describing shell preconditioner 7294b9ad928SBarry Smith 7304b9ad928SBarry Smith Level: developer 7314b9ad928SBarry Smith 7324b9ad928SBarry Smith .keywords: PC, shell, set, name, user-provided 7334b9ad928SBarry Smith 7344b9ad928SBarry Smith .seealso: PCShellGetName() 7354b9ad928SBarry Smith @*/ 7367087cfbeSBarry Smith PetscErrorCode PCShellSetName(PC pc,const char name[]) 7374b9ad928SBarry Smith { 7384ac538c5SBarry Smith PetscErrorCode ierr; 7394b9ad928SBarry Smith 7404b9ad928SBarry Smith PetscFunctionBegin; 7410700a824SBarry Smith PetscValidHeaderSpecific(pc,PC_CLASSID,1); 7424ac538c5SBarry Smith ierr = PetscTryMethod(pc,"PCShellSetName_C",(PC,const char []),(pc,name));CHKERRQ(ierr); 7434b9ad928SBarry Smith PetscFunctionReturn(0); 7444b9ad928SBarry Smith } 7454b9ad928SBarry Smith 7464b9ad928SBarry Smith #undef __FUNCT__ 7474b9ad928SBarry Smith #define __FUNCT__ "PCShellGetName" 7484b9ad928SBarry Smith /*@C 7494b9ad928SBarry Smith PCShellGetName - Gets an optional name that the user has set for a shell 7504b9ad928SBarry Smith preconditioner. 7514b9ad928SBarry Smith 7524b9ad928SBarry Smith Not Collective 7534b9ad928SBarry Smith 7544b9ad928SBarry Smith Input Parameter: 7554b9ad928SBarry Smith . pc - the preconditioner context 7564b9ad928SBarry Smith 7574b9ad928SBarry Smith Output Parameter: 7584b9ad928SBarry Smith . name - character string describing shell preconditioner (you should not free this) 7594b9ad928SBarry Smith 7604b9ad928SBarry Smith Level: developer 7614b9ad928SBarry Smith 7624b9ad928SBarry Smith .keywords: PC, shell, get, name, user-provided 7634b9ad928SBarry Smith 7644b9ad928SBarry Smith .seealso: PCShellSetName() 7654b9ad928SBarry Smith @*/ 7667087cfbeSBarry Smith PetscErrorCode PCShellGetName(PC pc,char *name[]) 7674b9ad928SBarry Smith { 7684ac538c5SBarry Smith PetscErrorCode ierr; 7694b9ad928SBarry Smith 7704b9ad928SBarry Smith PetscFunctionBegin; 7710700a824SBarry Smith PetscValidHeaderSpecific(pc,PC_CLASSID,1); 7724482741eSBarry Smith PetscValidPointer(name,2); 7734ac538c5SBarry Smith ierr = PetscUseMethod(pc,"PCShellGetName_C",(PC,char *[]),(pc,name));CHKERRQ(ierr); 7744b9ad928SBarry Smith PetscFunctionReturn(0); 7754b9ad928SBarry Smith } 7764b9ad928SBarry Smith 7774b9ad928SBarry Smith #undef __FUNCT__ 7784b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApplyRichardson" 7794b9ad928SBarry Smith /*@C 7804b9ad928SBarry Smith PCShellSetApplyRichardson - Sets routine to use as preconditioner 7814b9ad928SBarry Smith in Richardson iteration. 7824b9ad928SBarry Smith 7833f9fe445SBarry Smith Logically Collective on PC 7844b9ad928SBarry Smith 7854b9ad928SBarry Smith Input Parameters: 7864b9ad928SBarry Smith + pc - the preconditioner context 787be29d3c6SBarry Smith - apply - the application-provided preconditioning routine 7884b9ad928SBarry Smith 7894b9ad928SBarry Smith Calling sequence of apply: 7904b9ad928SBarry Smith .vb 7916891c3e4SJed Brown PetscErrorCode apply (PC pc,Vec b,Vec x,Vec r,PetscReal rtol,PetscReal abstol,PetscReal dtol,PetscInt maxits) 7924b9ad928SBarry Smith .ve 7934b9ad928SBarry Smith 7946891c3e4SJed Brown + pc - the preconditioner, get the application context with PCShellGetContext() 7954b9ad928SBarry Smith . b - right-hand-side 7964b9ad928SBarry Smith . x - current iterate 7974b9ad928SBarry Smith . r - work space 7984b9ad928SBarry Smith . rtol - relative tolerance of residual norm to stop at 79970441072SBarry Smith . abstol - absolute tolerance of residual norm to stop at 8004b9ad928SBarry Smith . dtol - if residual norm increases by this factor than return 8014b9ad928SBarry Smith - maxits - number of iterations to run 8024b9ad928SBarry Smith 8034aa34b0aSBarry Smith Notes: the function MUST return an error code of 0 on success and nonzero on failure. 8044aa34b0aSBarry Smith 8054b9ad928SBarry Smith Level: developer 8064b9ad928SBarry Smith 8074b9ad928SBarry Smith .keywords: PC, shell, set, apply, Richardson, user-provided 8084b9ad928SBarry Smith 809be29d3c6SBarry Smith .seealso: PCShellSetApply(), PCShellSetContext() 8104b9ad928SBarry Smith @*/ 8117087cfbeSBarry Smith PetscErrorCode PCShellSetApplyRichardson(PC pc,PetscErrorCode (*apply)(PC,Vec,Vec,Vec,PetscReal,PetscReal,PetscReal,PetscInt,PetscBool ,PetscInt*,PCRichardsonConvergedReason*)) 8124b9ad928SBarry Smith { 8134ac538c5SBarry Smith PetscErrorCode ierr; 8144b9ad928SBarry Smith 8154b9ad928SBarry Smith PetscFunctionBegin; 8160700a824SBarry Smith PetscValidHeaderSpecific(pc,PC_CLASSID,1); 8174ac538c5SBarry Smith ierr = PetscTryMethod(pc,"PCShellSetApplyRichardson_C",(PC,PetscErrorCode (*)(PC,Vec,Vec,Vec,PetscReal,PetscReal,PetscReal,PetscInt,PetscBool ,PetscInt*,PCRichardsonConvergedReason*)),(pc,apply));CHKERRQ(ierr); 8184b9ad928SBarry Smith PetscFunctionReturn(0); 8194b9ad928SBarry Smith } 8204b9ad928SBarry Smith 8214b9ad928SBarry Smith /*MC 8224b9ad928SBarry Smith PCSHELL - Creates a new preconditioner class for use with your 8234b9ad928SBarry Smith own private data storage format. 8244b9ad928SBarry Smith 8254b9ad928SBarry Smith Level: advanced 82690198e61SBarry Smith > 8274b9ad928SBarry Smith Concepts: providing your own preconditioner 8284b9ad928SBarry Smith 8294b9ad928SBarry Smith Usage: 8306891c3e4SJed Brown $ extern PetscErrorCode apply(PC,Vec,Vec); 8316891c3e4SJed Brown $ extern PetscErrorCode applyba(PC,PCSide,Vec,Vec,Vec); 8326891c3e4SJed Brown $ extern PetscErrorCode applytranspose(PC,Vec,Vec); 8336891c3e4SJed Brown $ extern PetscErrorCode setup(PC); 8346891c3e4SJed Brown $ extern PetscErrorCode destroy(PC); 8356891c3e4SJed Brown $ 8364b9ad928SBarry Smith $ PCCreate(comm,&pc); 8374b9ad928SBarry Smith $ PCSetType(pc,PCSHELL); 838be29d3c6SBarry Smith $ PCShellSetContext(pc,ctx) 8396891c3e4SJed Brown $ PCShellSetApply(pc,apply); 8406891c3e4SJed Brown $ PCShellSetApplyBA(pc,applyba); (optional) 8416891c3e4SJed Brown $ PCShellSetApplyTranspose(pc,applytranspose); (optional) 8424b9ad928SBarry Smith $ PCShellSetSetUp(pc,setup); (optional) 843d01c8aa3SLisandro Dalcin $ PCShellSetDestroy(pc,destroy); (optional) 8444b9ad928SBarry Smith 8454b9ad928SBarry Smith .seealso: PCCreate(), PCSetType(), PCType (for list of available types), PC, 846fd2d0fe1Svictor MATSHELL, PCShellSetSetUp(), PCShellSetApply(), PCShellSetView(), 847fd2d0fe1Svictor PCShellSetApplyTranspose(), PCShellSetName(), PCShellSetApplyRichardson(), 8482bb17772SBarry Smith PCShellGetName(), PCShellSetContext(), PCShellGetContext(), PCShellSetApplyBA() 8494b9ad928SBarry Smith M*/ 8504b9ad928SBarry Smith 8514b9ad928SBarry Smith EXTERN_C_BEGIN 8524b9ad928SBarry Smith #undef __FUNCT__ 8534b9ad928SBarry Smith #define __FUNCT__ "PCCreate_Shell" 8547087cfbeSBarry Smith PetscErrorCode PCCreate_Shell(PC pc) 8554b9ad928SBarry Smith { 856dfbe8321SBarry Smith PetscErrorCode ierr; 8574b9ad928SBarry Smith PC_Shell *shell; 8584b9ad928SBarry Smith 8594b9ad928SBarry Smith PetscFunctionBegin; 86038f2d2fdSLisandro Dalcin ierr = PetscNewLog(pc,PC_Shell,&shell);CHKERRQ(ierr); 8614b9ad928SBarry Smith pc->data = (void*)shell; 8624b9ad928SBarry Smith 863d01c8aa3SLisandro Dalcin pc->ops->destroy = PCDestroy_Shell; 8644b9ad928SBarry Smith pc->ops->view = PCView_Shell; 865d01c8aa3SLisandro Dalcin pc->ops->apply = PCApply_Shell; 866d01c8aa3SLisandro Dalcin pc->ops->applytranspose = 0; 8674b9ad928SBarry Smith pc->ops->applyrichardson = 0; 868d01c8aa3SLisandro Dalcin pc->ops->setup = 0; 8699bbb2c88SBarry Smith pc->ops->presolve = 0; 8709bbb2c88SBarry Smith pc->ops->postsolve = 0; 8714b9ad928SBarry Smith 8724b9ad928SBarry Smith shell->apply = 0; 8734b9ad928SBarry Smith shell->applytranspose = 0; 8744b9ad928SBarry Smith shell->name = 0; 8754b9ad928SBarry Smith shell->applyrich = 0; 8767cdd61b2SBarry Smith shell->presolve = 0; 8777cdd61b2SBarry Smith shell->postsolve = 0; 8784b9ad928SBarry Smith shell->ctx = 0; 8794b9ad928SBarry Smith shell->setup = 0; 8804b9ad928SBarry Smith shell->view = 0; 88118be62a5SSatish Balay shell->destroy = 0; 8824b9ad928SBarry Smith 88318be62a5SSatish Balay ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetDestroy_C","PCShellSetDestroy_Shell", 88418be62a5SSatish Balay PCShellSetDestroy_Shell);CHKERRQ(ierr); 8854b9ad928SBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetSetUp_C","PCShellSetSetUp_Shell", 8864b9ad928SBarry Smith PCShellSetSetUp_Shell);CHKERRQ(ierr); 8874b9ad928SBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetApply_C","PCShellSetApply_Shell", 8884b9ad928SBarry Smith PCShellSetApply_Shell);CHKERRQ(ierr); 8892bb17772SBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetApplyBA_C","PCShellSetApplyBA_Shell", 8902bb17772SBarry Smith PCShellSetApplyBA_Shell);CHKERRQ(ierr); 8917cdd61b2SBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetPreSolve_C","PCShellSetPreSolve_Shell", 8927cdd61b2SBarry Smith PCShellSetPreSolve_Shell);CHKERRQ(ierr); 8937cdd61b2SBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetPostSolve_C","PCShellSetPostSolve_Shell", 8947cdd61b2SBarry Smith PCShellSetPostSolve_Shell);CHKERRQ(ierr); 8954b9ad928SBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetView_C","PCShellSetView_Shell", 8964b9ad928SBarry Smith PCShellSetView_Shell);CHKERRQ(ierr); 897be29d3c6SBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetApplyTranspose_C","PCShellSetApplyTranspose_Shell", 8984b9ad928SBarry Smith PCShellSetApplyTranspose_Shell);CHKERRQ(ierr); 8994b9ad928SBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetName_C","PCShellSetName_Shell", 9004b9ad928SBarry Smith PCShellSetName_Shell);CHKERRQ(ierr); 9014b9ad928SBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellGetName_C","PCShellGetName_Shell", 9024b9ad928SBarry Smith PCShellGetName_Shell);CHKERRQ(ierr); 903be29d3c6SBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetApplyRichardson_C","PCShellSetApplyRichardson_Shell", 9044b9ad928SBarry Smith PCShellSetApplyRichardson_Shell);CHKERRQ(ierr); 9054b9ad928SBarry Smith PetscFunctionReturn(0); 9064b9ad928SBarry Smith } 9074b9ad928SBarry Smith EXTERN_C_END 9084b9ad928SBarry Smith 9094b9ad928SBarry Smith 9104b9ad928SBarry Smith 9114b9ad928SBarry Smith 9124b9ad928SBarry Smith 9134b9ad928SBarry Smith 914