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