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; 56*0700a824SBarry 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 69be29d3c6SBarry Smith Collective on PC 70be29d3c6SBarry Smith 71be29d3c6SBarry Smith Input Parameters: 72be29d3c6SBarry Smith + pc - the shell PC 73be29d3c6SBarry Smith - ctx - the context 74be29d3c6SBarry Smith 75be29d3c6SBarry Smith Level: advanced 76be29d3c6SBarry Smith 77be29d3c6SBarry Smith Fortran Notes: The context can only be an integer or a PetscObject 78be29d3c6SBarry Smith unfortunately it cannot be a Fortran array or derived type. 79be29d3c6SBarry Smith 806895c445SBarry Smith 81be29d3c6SBarry Smith .seealso: PCCreateShell(), PCShellGetContext() 82be29d3c6SBarry Smith @*/ 83be29d3c6SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetContext(PC pc,void *ctx) 84be29d3c6SBarry Smith { 85d01c8aa3SLisandro Dalcin PC_Shell *shell; 86be29d3c6SBarry Smith PetscErrorCode ierr; 87be29d3c6SBarry Smith PetscTruth flg; 88be29d3c6SBarry Smith 89be29d3c6SBarry Smith PetscFunctionBegin; 90*0700a824SBarry 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; 108d01c8aa3SLisandro Dalcin if (!shell->setup) SETERRQ(PETSC_ERR_USER,"No setup() routine provided to Shell PC"); 109d01c8aa3SLisandro Dalcin PetscStackPush("PCSHELL user function setup()"); 110e9a2bbcdSBarry Smith CHKMEMQ; 1116891c3e4SJed Brown ierr = (*shell->setup)(pc);CHKERRQ(ierr); 112e9a2bbcdSBarry Smith CHKMEMQ; 113d01c8aa3SLisandro Dalcin PetscStackPop; 1144b9ad928SBarry Smith PetscFunctionReturn(0); 1154b9ad928SBarry Smith } 1164b9ad928SBarry Smith 1174b9ad928SBarry Smith #undef __FUNCT__ 1184b9ad928SBarry Smith #define __FUNCT__ "PCApply_Shell" 1196849ba73SBarry Smith static PetscErrorCode PCApply_Shell(PC pc,Vec x,Vec y) 1204b9ad928SBarry Smith { 1214b9ad928SBarry Smith PC_Shell *shell; 122dfbe8321SBarry Smith PetscErrorCode ierr; 1234b9ad928SBarry Smith 1244b9ad928SBarry Smith PetscFunctionBegin; 1254b9ad928SBarry Smith shell = (PC_Shell*)pc->data; 1261302d50aSBarry Smith if (!shell->apply) SETERRQ(PETSC_ERR_USER,"No apply() routine provided to Shell PC"); 127d01c8aa3SLisandro Dalcin PetscStackPush("PCSHELL user function apply()"); 128e9a2bbcdSBarry Smith CHKMEMQ; 1296891c3e4SJed Brown ierr = (*shell->apply)(pc,x,y);CHKERRQ(ierr); 130e9a2bbcdSBarry Smith CHKMEMQ; 131e9a2bbcdSBarry Smith PetscStackPop; 1324b9ad928SBarry Smith PetscFunctionReturn(0); 1334b9ad928SBarry Smith } 1344b9ad928SBarry Smith 1354b9ad928SBarry Smith #undef __FUNCT__ 1362bb17772SBarry Smith #define __FUNCT__ "PCApplyBA_Shell" 1372bb17772SBarry Smith static PetscErrorCode PCApplyBA_Shell(PC pc,PCSide side,Vec x,Vec y,Vec w) 1382bb17772SBarry Smith { 1392bb17772SBarry Smith PC_Shell *shell; 1402bb17772SBarry Smith PetscErrorCode ierr; 1412bb17772SBarry Smith 1422bb17772SBarry Smith PetscFunctionBegin; 1432bb17772SBarry Smith shell = (PC_Shell*)pc->data; 1442bb17772SBarry Smith if (!shell->applyBA) SETERRQ(PETSC_ERR_USER,"No applyBA() routine provided to Shell PC"); 145d01c8aa3SLisandro Dalcin PetscStackPush("PCSHELL user function applyBA()"); 1462bb17772SBarry Smith CHKMEMQ; 1476891c3e4SJed Brown ierr = (*shell->applyBA)(pc,side,x,y,w);CHKERRQ(ierr); 1482bb17772SBarry Smith CHKMEMQ; 1492bb17772SBarry Smith PetscStackPop; 1502bb17772SBarry Smith PetscFunctionReturn(0); 1512bb17772SBarry Smith } 1522bb17772SBarry Smith 1532bb17772SBarry Smith #undef __FUNCT__ 1547cdd61b2SBarry Smith #define __FUNCT__ "PCPreSolve_Shell" 1557cdd61b2SBarry Smith static PetscErrorCode PCPreSolve_Shell(PC pc,KSP ksp,Vec b,Vec x) 1567cdd61b2SBarry Smith { 1577cdd61b2SBarry Smith PC_Shell *shell; 1587cdd61b2SBarry Smith PetscErrorCode ierr; 1597cdd61b2SBarry Smith 1607cdd61b2SBarry Smith PetscFunctionBegin; 1617cdd61b2SBarry Smith shell = (PC_Shell*)pc->data; 16291ad8336SSatish Balay if (!shell->presolve) SETERRQ(PETSC_ERR_USER,"No presolve() routine provided to Shell PC"); 163d01c8aa3SLisandro Dalcin PetscStackPush("PCSHELL user function presolve()"); 164d01c8aa3SLisandro Dalcin CHKMEMQ; 1656891c3e4SJed Brown ierr = (*shell->presolve)(pc,ksp,b,x);CHKERRQ(ierr); 166d01c8aa3SLisandro Dalcin CHKMEMQ; 167d01c8aa3SLisandro Dalcin PetscStackPop; 1687cdd61b2SBarry Smith PetscFunctionReturn(0); 1697cdd61b2SBarry Smith } 1707cdd61b2SBarry Smith 1717cdd61b2SBarry Smith #undef __FUNCT__ 1727cdd61b2SBarry Smith #define __FUNCT__ "PCPostSolve_Shell" 1737cdd61b2SBarry Smith static PetscErrorCode PCPostSolve_Shell(PC pc,KSP ksp,Vec b,Vec x) 1747cdd61b2SBarry Smith { 1757cdd61b2SBarry Smith PC_Shell *shell; 1767cdd61b2SBarry Smith PetscErrorCode ierr; 1777cdd61b2SBarry Smith 1787cdd61b2SBarry Smith PetscFunctionBegin; 1797cdd61b2SBarry Smith shell = (PC_Shell*)pc->data; 18091ad8336SSatish Balay if (!shell->postsolve) SETERRQ(PETSC_ERR_USER,"No postsolve() routine provided to Shell PC"); 181d01c8aa3SLisandro Dalcin PetscStackPush("PCSHELL user function postsolve()"); 182d01c8aa3SLisandro Dalcin CHKMEMQ; 1836891c3e4SJed Brown ierr = (*shell->postsolve)(pc,ksp,b,x);CHKERRQ(ierr); 184d01c8aa3SLisandro Dalcin CHKMEMQ; 185d01c8aa3SLisandro Dalcin PetscStackPop; 1867cdd61b2SBarry Smith PetscFunctionReturn(0); 1877cdd61b2SBarry Smith } 1887cdd61b2SBarry Smith 1897cdd61b2SBarry Smith #undef __FUNCT__ 1904b9ad928SBarry Smith #define __FUNCT__ "PCApplyTranspose_Shell" 1916849ba73SBarry Smith static PetscErrorCode PCApplyTranspose_Shell(PC pc,Vec x,Vec y) 1924b9ad928SBarry Smith { 1934b9ad928SBarry Smith PC_Shell *shell; 194dfbe8321SBarry Smith PetscErrorCode ierr; 1954b9ad928SBarry Smith 1964b9ad928SBarry Smith PetscFunctionBegin; 1974b9ad928SBarry Smith shell = (PC_Shell*)pc->data; 1981302d50aSBarry Smith if (!shell->applytranspose) SETERRQ(PETSC_ERR_USER,"No applytranspose() routine provided to Shell PC"); 199d01c8aa3SLisandro Dalcin PetscStackPush("PCSHELL user function applytranspose()"); 200d01c8aa3SLisandro Dalcin CHKMEMQ; 2016891c3e4SJed Brown ierr = (*shell->applytranspose)(pc,x,y);CHKERRQ(ierr); 202d01c8aa3SLisandro Dalcin CHKMEMQ; 203d01c8aa3SLisandro Dalcin PetscStackPop; 2044b9ad928SBarry Smith PetscFunctionReturn(0); 2054b9ad928SBarry Smith } 2064b9ad928SBarry Smith 2074b9ad928SBarry Smith #undef __FUNCT__ 2084b9ad928SBarry Smith #define __FUNCT__ "PCApplyRichardson_Shell" 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; 216d01c8aa3SLisandro Dalcin if (!shell->applyrich) SETERRQ(PETSC_ERR_USER,"No applyrichardson() routine provided to Shell PC"); 217d01c8aa3SLisandro Dalcin PetscStackPush("PCSHELL user function applyrichardson()"); 218d01c8aa3SLisandro Dalcin CHKMEMQ; 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; 23305b42c5fSBarry Smith ierr = PetscStrfree(shell->name);CHKERRQ(ierr); 23418be62a5SSatish Balay if (shell->destroy) { 2356891c3e4SJed Brown ierr = (*shell->destroy)(pc);CHKERRQ(ierr); 23618be62a5SSatish Balay } 2374b9ad928SBarry Smith ierr = PetscFree(shell);CHKERRQ(ierr); 2384b9ad928SBarry Smith PetscFunctionReturn(0); 2394b9ad928SBarry Smith } 2404b9ad928SBarry Smith 2414b9ad928SBarry Smith #undef __FUNCT__ 2424b9ad928SBarry Smith #define __FUNCT__ "PCView_Shell" 2436849ba73SBarry Smith static PetscErrorCode PCView_Shell(PC pc,PetscViewer viewer) 2444b9ad928SBarry Smith { 2454b9ad928SBarry Smith PC_Shell *shell = (PC_Shell*)pc->data; 246dfbe8321SBarry Smith PetscErrorCode ierr; 24732077d6dSBarry Smith PetscTruth iascii; 2484b9ad928SBarry Smith 2494b9ad928SBarry Smith PetscFunctionBegin; 25032077d6dSBarry Smith ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_ASCII,&iascii);CHKERRQ(ierr); 25132077d6dSBarry Smith if (iascii) { 2524b9ad928SBarry Smith if (shell->name) {ierr = PetscViewerASCIIPrintf(viewer," Shell: %s\n",shell->name);CHKERRQ(ierr);} 2534b9ad928SBarry Smith else {ierr = PetscViewerASCIIPrintf(viewer," Shell: no name\n");CHKERRQ(ierr);} 2544b9ad928SBarry Smith } 2554b9ad928SBarry Smith if (shell->view) { 2564b9ad928SBarry Smith ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 2576891c3e4SJed Brown ierr = (*shell->view)(pc,viewer);CHKERRQ(ierr); 2584b9ad928SBarry Smith ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 2594b9ad928SBarry Smith } 2604b9ad928SBarry Smith PetscFunctionReturn(0); 2614b9ad928SBarry Smith } 2624b9ad928SBarry Smith 2634b9ad928SBarry Smith /* ------------------------------------------------------------------------------*/ 2644b9ad928SBarry Smith EXTERN_C_BEGIN 2654b9ad928SBarry Smith #undef __FUNCT__ 26618be62a5SSatish Balay #define __FUNCT__ "PCShellSetDestroy_Shell" 2676891c3e4SJed Brown PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetDestroy_Shell(PC pc, PetscErrorCode (*destroy)(PC)) 26818be62a5SSatish Balay { 26918be62a5SSatish Balay PC_Shell *shell; 27018be62a5SSatish Balay 27118be62a5SSatish Balay PetscFunctionBegin; 27218be62a5SSatish Balay shell = (PC_Shell*)pc->data; 27318be62a5SSatish Balay shell->destroy = destroy; 27418be62a5SSatish Balay PetscFunctionReturn(0); 27518be62a5SSatish Balay } 27618be62a5SSatish Balay EXTERN_C_END 27718be62a5SSatish Balay 27818be62a5SSatish Balay EXTERN_C_BEGIN 27918be62a5SSatish Balay #undef __FUNCT__ 2804b9ad928SBarry Smith #define __FUNCT__ "PCShellSetSetUp_Shell" 2816891c3e4SJed Brown PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetSetUp_Shell(PC pc, PetscErrorCode (*setup)(PC)) 2824b9ad928SBarry Smith { 2834b9ad928SBarry Smith PC_Shell *shell; 2844b9ad928SBarry Smith 2854b9ad928SBarry Smith PetscFunctionBegin; 2864b9ad928SBarry Smith shell = (PC_Shell*)pc->data; 2874b9ad928SBarry Smith shell->setup = setup; 288d01c8aa3SLisandro Dalcin if (setup) pc->ops->setup = PCSetUp_Shell; 289d01c8aa3SLisandro Dalcin else pc->ops->setup = 0; 2904b9ad928SBarry Smith PetscFunctionReturn(0); 2914b9ad928SBarry Smith } 2924b9ad928SBarry Smith EXTERN_C_END 2934b9ad928SBarry Smith 2944b9ad928SBarry Smith EXTERN_C_BEGIN 2954b9ad928SBarry Smith #undef __FUNCT__ 2964b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApply_Shell" 2976891c3e4SJed Brown PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApply_Shell(PC pc,PetscErrorCode (*apply)(PC,Vec,Vec)) 2984b9ad928SBarry Smith { 2994b9ad928SBarry Smith PC_Shell *shell; 3004b9ad928SBarry Smith 3014b9ad928SBarry Smith PetscFunctionBegin; 3024b9ad928SBarry Smith shell = (PC_Shell*)pc->data; 3034b9ad928SBarry Smith shell->apply = apply; 3044b9ad928SBarry Smith PetscFunctionReturn(0); 3054b9ad928SBarry Smith } 3064b9ad928SBarry Smith EXTERN_C_END 3074b9ad928SBarry Smith 3084b9ad928SBarry Smith EXTERN_C_BEGIN 3094b9ad928SBarry Smith #undef __FUNCT__ 3102bb17772SBarry Smith #define __FUNCT__ "PCShellSetApplyBA_Shell" 3116891c3e4SJed Brown PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApplyBA_Shell(PC pc,PetscErrorCode (*applyBA)(PC,PCSide,Vec,Vec,Vec)) 3122bb17772SBarry Smith { 3132bb17772SBarry Smith PC_Shell *shell; 3142bb17772SBarry Smith 3152bb17772SBarry Smith PetscFunctionBegin; 3162bb17772SBarry Smith shell = (PC_Shell*)pc->data; 317d01c8aa3SLisandro Dalcin shell->applyBA = applyBA; 318d01c8aa3SLisandro Dalcin if (applyBA) pc->ops->applyBA = PCApplyBA_Shell; 319aef0136fSBarry Smith else pc->ops->applyBA = 0; 3202bb17772SBarry Smith PetscFunctionReturn(0); 3212bb17772SBarry Smith } 3222bb17772SBarry Smith EXTERN_C_END 3232bb17772SBarry Smith 3242bb17772SBarry Smith EXTERN_C_BEGIN 3252bb17772SBarry Smith #undef __FUNCT__ 3267cdd61b2SBarry Smith #define __FUNCT__ "PCShellSetPreSolve_Shell" 3276891c3e4SJed Brown PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetPreSolve_Shell(PC pc,PetscErrorCode (*presolve)(PC,KSP,Vec,Vec)) 3287cdd61b2SBarry Smith { 3297cdd61b2SBarry Smith PC_Shell *shell; 3307cdd61b2SBarry Smith 3317cdd61b2SBarry Smith PetscFunctionBegin; 3327cdd61b2SBarry Smith shell = (PC_Shell*)pc->data; 3337cdd61b2SBarry Smith shell->presolve = presolve; 334d01c8aa3SLisandro Dalcin if (presolve) pc->ops->presolve = PCPreSolve_Shell; 335d01c8aa3SLisandro Dalcin else pc->ops->presolve = 0; 3367cdd61b2SBarry Smith PetscFunctionReturn(0); 3377cdd61b2SBarry Smith } 3387cdd61b2SBarry Smith EXTERN_C_END 3397cdd61b2SBarry Smith 3407cdd61b2SBarry Smith EXTERN_C_BEGIN 3417cdd61b2SBarry Smith #undef __FUNCT__ 3427cdd61b2SBarry Smith #define __FUNCT__ "PCShellSetPostSolve_Shell" 3436891c3e4SJed Brown PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetPostSolve_Shell(PC pc,PetscErrorCode (*postsolve)(PC,KSP,Vec,Vec)) 3447cdd61b2SBarry Smith { 3457cdd61b2SBarry Smith PC_Shell *shell; 3467cdd61b2SBarry Smith 3477cdd61b2SBarry Smith PetscFunctionBegin; 3487cdd61b2SBarry Smith shell = (PC_Shell*)pc->data; 3497cdd61b2SBarry Smith shell->postsolve = postsolve; 350d01c8aa3SLisandro Dalcin if (postsolve) pc->ops->postsolve = PCPostSolve_Shell; 351d01c8aa3SLisandro Dalcin else pc->ops->postsolve = 0; 3527cdd61b2SBarry Smith PetscFunctionReturn(0); 3537cdd61b2SBarry Smith } 3547cdd61b2SBarry Smith EXTERN_C_END 3557cdd61b2SBarry Smith 3567cdd61b2SBarry Smith EXTERN_C_BEGIN 3577cdd61b2SBarry Smith #undef __FUNCT__ 3584b9ad928SBarry Smith #define __FUNCT__ "PCShellSetView_Shell" 3596891c3e4SJed Brown PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetView_Shell(PC pc,PetscErrorCode (*view)(PC,PetscViewer)) 3604b9ad928SBarry Smith { 3614b9ad928SBarry Smith PC_Shell *shell; 3624b9ad928SBarry Smith 3634b9ad928SBarry Smith PetscFunctionBegin; 3644b9ad928SBarry Smith shell = (PC_Shell*)pc->data; 3654b9ad928SBarry Smith shell->view = view; 3664b9ad928SBarry Smith PetscFunctionReturn(0); 3674b9ad928SBarry Smith } 3684b9ad928SBarry Smith EXTERN_C_END 3694b9ad928SBarry Smith 3704b9ad928SBarry Smith EXTERN_C_BEGIN 3714b9ad928SBarry Smith #undef __FUNCT__ 3724b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApplyTranspose_Shell" 3736891c3e4SJed Brown PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApplyTranspose_Shell(PC pc,PetscErrorCode (*applytranspose)(PC,Vec,Vec)) 3744b9ad928SBarry Smith { 3754b9ad928SBarry Smith PC_Shell *shell; 3764b9ad928SBarry Smith 3774b9ad928SBarry Smith PetscFunctionBegin; 3784b9ad928SBarry Smith shell = (PC_Shell*)pc->data; 3794b9ad928SBarry Smith shell->applytranspose = applytranspose; 380d01c8aa3SLisandro Dalcin if (applytranspose) pc->ops->applytranspose = PCApplyTranspose_Shell; 381d01c8aa3SLisandro Dalcin else pc->ops->applytranspose = 0; 382d01c8aa3SLisandro Dalcin PetscFunctionReturn(0); 383d01c8aa3SLisandro Dalcin } 384d01c8aa3SLisandro Dalcin EXTERN_C_END 385d01c8aa3SLisandro Dalcin 386d01c8aa3SLisandro Dalcin EXTERN_C_BEGIN 387d01c8aa3SLisandro Dalcin #undef __FUNCT__ 388d01c8aa3SLisandro Dalcin #define __FUNCT__ "PCShellSetApplyRichardson_Shell" 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; 412f259bd47SBarry Smith ierr = PetscStrfree(shell->name);CHKERRQ(ierr); 4134b9ad928SBarry Smith ierr = PetscStrallocpy(name,&shell->name);CHKERRQ(ierr); 4144b9ad928SBarry Smith PetscFunctionReturn(0); 4154b9ad928SBarry Smith } 4164b9ad928SBarry Smith EXTERN_C_END 4174b9ad928SBarry Smith 4184b9ad928SBarry Smith EXTERN_C_BEGIN 4194b9ad928SBarry Smith #undef __FUNCT__ 4204b9ad928SBarry Smith #define __FUNCT__ "PCShellGetName_Shell" 421dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellGetName_Shell(PC pc,char *name[]) 4224b9ad928SBarry Smith { 4234b9ad928SBarry Smith PC_Shell *shell; 4244b9ad928SBarry Smith 4254b9ad928SBarry Smith PetscFunctionBegin; 4264b9ad928SBarry Smith shell = (PC_Shell*)pc->data; 4274b9ad928SBarry Smith *name = shell->name; 4284b9ad928SBarry Smith PetscFunctionReturn(0); 4294b9ad928SBarry Smith } 4304b9ad928SBarry Smith EXTERN_C_END 4314b9ad928SBarry Smith 4324b9ad928SBarry Smith /* -------------------------------------------------------------------------------*/ 4334b9ad928SBarry Smith 4344b9ad928SBarry Smith #undef __FUNCT__ 43518be62a5SSatish Balay #define __FUNCT__ "PCShellSetDestroy" 43618be62a5SSatish Balay /*@C 43718be62a5SSatish Balay PCShellSetDestroy - Sets routine to use to destroy the user-provided 43818be62a5SSatish Balay application context. 43918be62a5SSatish Balay 44018be62a5SSatish Balay Collective on PC 44118be62a5SSatish Balay 44218be62a5SSatish Balay Input Parameters: 44318be62a5SSatish Balay + pc - the preconditioner context 44418be62a5SSatish Balay . destroy - the application-provided destroy routine 44518be62a5SSatish Balay 44618be62a5SSatish Balay Calling sequence of destroy: 44718be62a5SSatish Balay .vb 4486891c3e4SJed Brown PetscErrorCode destroy (PC) 44918be62a5SSatish Balay .ve 45018be62a5SSatish Balay 45118be62a5SSatish Balay . ptr - the application context 45218be62a5SSatish Balay 4534aa34b0aSBarry Smith Notes: the function MUST return an error code of 0 on success and nonzero on failure. 4544aa34b0aSBarry Smith 45518be62a5SSatish Balay Level: developer 45618be62a5SSatish Balay 45718be62a5SSatish Balay .keywords: PC, shell, set, destroy, user-provided 45818be62a5SSatish Balay 45918be62a5SSatish Balay .seealso: PCShellSetApply(), PCShellSetContext() 46018be62a5SSatish Balay @*/ 4616891c3e4SJed Brown PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetDestroy(PC pc,PetscErrorCode (*destroy)(PC)) 46218be62a5SSatish Balay { 4636891c3e4SJed Brown PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(PC)); 46418be62a5SSatish Balay 46518be62a5SSatish Balay PetscFunctionBegin; 466*0700a824SBarry 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 4814b9ad928SBarry Smith Collective on PC 4824b9ad928SBarry Smith 4834b9ad928SBarry Smith Input Parameters: 4844b9ad928SBarry Smith + pc - the preconditioner context 4854b9ad928SBarry Smith . setup - the application-provided setup routine 4864b9ad928SBarry Smith 4874b9ad928SBarry Smith Calling sequence of setup: 4884b9ad928SBarry Smith .vb 4896891c3e4SJed Brown PetscErrorCode setup (PC pc) 4904b9ad928SBarry Smith .ve 4914b9ad928SBarry Smith 4926891c3e4SJed Brown . pc - the preconditioner, get the application context with PCShellGetContext() 4934b9ad928SBarry Smith 4944aa34b0aSBarry Smith Notes: the function MUST return an error code of 0 on success and nonzero on failure. 4954aa34b0aSBarry Smith 4964b9ad928SBarry Smith Level: developer 4974b9ad928SBarry Smith 4984b9ad928SBarry Smith .keywords: PC, shell, set, setup, user-provided 4994b9ad928SBarry Smith 500be29d3c6SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetApply(), PCShellSetContext() 5014b9ad928SBarry Smith @*/ 5026891c3e4SJed Brown PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetSetUp(PC pc,PetscErrorCode (*setup)(PC)) 5034b9ad928SBarry Smith { 5046891c3e4SJed Brown PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(PC)); 5054b9ad928SBarry Smith 5064b9ad928SBarry Smith PetscFunctionBegin; 507*0700a824SBarry 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 5214b9ad928SBarry Smith Collective on PC 5224b9ad928SBarry Smith 5234b9ad928SBarry Smith Input Parameters: 5244b9ad928SBarry Smith + pc - the preconditioner context 5254b9ad928SBarry Smith - view - the application-provided view routine 5264b9ad928SBarry Smith 5274b9ad928SBarry Smith Calling sequence of apply: 5284b9ad928SBarry Smith .vb 5296891c3e4SJed Brown PetscErrorCode view(PC pc,PetscViewer v) 5304b9ad928SBarry Smith .ve 5314b9ad928SBarry Smith 5326891c3e4SJed Brown + pc - the preconditioner, get the application context with PCShellGetContext() 5334b9ad928SBarry Smith - v - viewer 5344b9ad928SBarry Smith 5354aa34b0aSBarry Smith Notes: the function MUST return an error code of 0 on success and nonzero on failure. 5364aa34b0aSBarry Smith 5374b9ad928SBarry Smith Level: developer 5384b9ad928SBarry Smith 5394b9ad928SBarry Smith .keywords: PC, shell, set, apply, user-provided 5404b9ad928SBarry Smith 5414b9ad928SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose() 5424b9ad928SBarry Smith @*/ 5436891c3e4SJed Brown PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetView(PC pc,PetscErrorCode (*view)(PC,PetscViewer)) 5444b9ad928SBarry Smith { 5456891c3e4SJed Brown PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(PC,PetscViewer)); 5464b9ad928SBarry Smith 5474b9ad928SBarry Smith PetscFunctionBegin; 548*0700a824SBarry 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 5614b9ad928SBarry Smith Collective on PC 5624b9ad928SBarry Smith 5634b9ad928SBarry Smith Input Parameters: 5644b9ad928SBarry Smith + pc - the preconditioner context 565be29d3c6SBarry Smith - apply - the application-provided preconditioning routine 5664b9ad928SBarry Smith 5674b9ad928SBarry Smith Calling sequence of apply: 5684b9ad928SBarry Smith .vb 5696891c3e4SJed Brown PetscErrorCode apply (PC pc,Vec xin,Vec xout) 5704b9ad928SBarry Smith .ve 5714b9ad928SBarry Smith 5726891c3e4SJed Brown + pc - the preconditioner, get the application context with PCShellGetContext() 5734b9ad928SBarry Smith . xin - input vector 5744b9ad928SBarry Smith - xout - output vector 5754b9ad928SBarry Smith 5764aa34b0aSBarry Smith Notes: the function MUST return an error code of 0 on success and nonzero on failure. 5774aa34b0aSBarry Smith 5784b9ad928SBarry Smith Level: developer 5794b9ad928SBarry Smith 5804b9ad928SBarry Smith .keywords: PC, shell, set, apply, user-provided 5814b9ad928SBarry Smith 5822bb17772SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose(), PCShellSetContext(), PCShellSetApplyBA() 5834b9ad928SBarry Smith @*/ 5846891c3e4SJed Brown PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApply(PC pc,PetscErrorCode (*apply)(PC,Vec,Vec)) 5854b9ad928SBarry Smith { 5866891c3e4SJed Brown PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(PC,Vec,Vec)); 5874b9ad928SBarry Smith 5884b9ad928SBarry Smith PetscFunctionBegin; 589*0700a824SBarry 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 6022bb17772SBarry Smith Collective on PC 6032bb17772SBarry Smith 6042bb17772SBarry Smith Input Parameters: 6052bb17772SBarry Smith + pc - the preconditioner context 6062bb17772SBarry Smith - applyBA - the application-provided BA routine 6072bb17772SBarry Smith 6082bb17772SBarry Smith Calling sequence of apply: 6092bb17772SBarry Smith .vb 6106891c3e4SJed Brown PetscErrorCode applyBA (PC pc,Vec xin,Vec xout) 6112bb17772SBarry Smith .ve 6122bb17772SBarry Smith 6136891c3e4SJed Brown + pc - the preconditioner, get the application context with PCShellGetContext() 6142bb17772SBarry Smith . xin - input vector 6152bb17772SBarry Smith - xout - output vector 6162bb17772SBarry Smith 6174aa34b0aSBarry Smith Notes: the function MUST return an error code of 0 on success and nonzero on failure. 6184aa34b0aSBarry Smith 6192bb17772SBarry Smith Level: developer 6202bb17772SBarry Smith 6212bb17772SBarry Smith .keywords: PC, shell, set, apply, user-provided 6222bb17772SBarry Smith 6232bb17772SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose(), PCShellSetContext(), PCShellSetApply() 6242bb17772SBarry Smith @*/ 6256891c3e4SJed Brown PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApplyBA(PC pc,PetscErrorCode (*applyBA)(PC,PCSide,Vec,Vec,Vec)) 6262bb17772SBarry Smith { 6276891c3e4SJed Brown PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(PC,PCSide,Vec,Vec,Vec)); 6282bb17772SBarry Smith 6292bb17772SBarry Smith PetscFunctionBegin; 630*0700a824SBarry 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 6434b9ad928SBarry Smith Collective on PC 6444b9ad928SBarry Smith 6454b9ad928SBarry Smith Input Parameters: 6464b9ad928SBarry Smith + pc - the preconditioner context 6474b9ad928SBarry Smith - apply - the application-provided preconditioning transpose routine 6484b9ad928SBarry Smith 6494b9ad928SBarry Smith Calling sequence of apply: 6504b9ad928SBarry Smith .vb 6516891c3e4SJed Brown PetscErrorCode applytranspose (PC pc,Vec xin,Vec xout) 6524b9ad928SBarry Smith .ve 6534b9ad928SBarry Smith 6546891c3e4SJed Brown + pc - the preconditioner, get the application context with PCShellGetContext() 6554b9ad928SBarry Smith . xin - input vector 6564b9ad928SBarry Smith - xout - output vector 6574b9ad928SBarry Smith 6584aa34b0aSBarry Smith Notes: the function MUST return an error code of 0 on success and nonzero on failure. 6594aa34b0aSBarry Smith 6604b9ad928SBarry Smith Level: developer 6614b9ad928SBarry Smith 6624b9ad928SBarry Smith Notes: 6634b9ad928SBarry Smith Uses the same context variable as PCShellSetApply(). 6644b9ad928SBarry Smith 6654b9ad928SBarry Smith .keywords: PC, shell, set, apply, user-provided 6664b9ad928SBarry Smith 6672bb17772SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApply(), PCSetContext(), PCShellSetApplyBA() 6684b9ad928SBarry Smith @*/ 6696891c3e4SJed Brown PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApplyTranspose(PC pc,PetscErrorCode (*applytranspose)(PC,Vec,Vec)) 6704b9ad928SBarry Smith { 6716891c3e4SJed Brown PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(PC,Vec,Vec)); 6724b9ad928SBarry Smith 6734b9ad928SBarry Smith PetscFunctionBegin; 674*0700a824SBarry 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 6897cdd61b2SBarry Smith Collective on PC 6907cdd61b2SBarry Smith 6917cdd61b2SBarry Smith Input Parameters: 6927cdd61b2SBarry Smith + pc - the preconditioner context 6937cdd61b2SBarry Smith - presolve - the application-provided presolve routine 6947cdd61b2SBarry Smith 6957cdd61b2SBarry Smith Calling sequence of presolve: 6967cdd61b2SBarry Smith .vb 6976891c3e4SJed Brown PetscErrorCode presolve (PC,KSP ksp,Vec b,Vec x) 6987cdd61b2SBarry Smith .ve 6997cdd61b2SBarry Smith 7006891c3e4SJed Brown + pc - the preconditioner, get the application context with PCShellGetContext() 7017cdd61b2SBarry Smith . xin - input vector 7027cdd61b2SBarry Smith - xout - output vector 7037cdd61b2SBarry Smith 7044aa34b0aSBarry Smith Notes: the function MUST return an error code of 0 on success and nonzero on failure. 7054aa34b0aSBarry Smith 7067cdd61b2SBarry Smith Level: developer 7077cdd61b2SBarry Smith 7087cdd61b2SBarry Smith .keywords: PC, shell, set, apply, user-provided 7097cdd61b2SBarry Smith 710be29d3c6SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose(), PCShellSetPostSolve(), PCShellSetContext() 7117cdd61b2SBarry Smith @*/ 7126891c3e4SJed Brown PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetPreSolve(PC pc,PetscErrorCode (*presolve)(PC,KSP,Vec,Vec)) 7137cdd61b2SBarry Smith { 7146891c3e4SJed Brown PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(PC,KSP,Vec,Vec)); 7157cdd61b2SBarry Smith 7167cdd61b2SBarry Smith PetscFunctionBegin; 717*0700a824SBarry 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 7327cdd61b2SBarry Smith Collective on PC 7337cdd61b2SBarry Smith 7347cdd61b2SBarry Smith Input Parameters: 7357cdd61b2SBarry Smith + pc - the preconditioner context 7367cdd61b2SBarry Smith - postsolve - the application-provided presolve routine 7377cdd61b2SBarry Smith 7387cdd61b2SBarry Smith Calling sequence of postsolve: 7397cdd61b2SBarry Smith .vb 7406891c3e4SJed Brown PetscErrorCode postsolve(PC,KSP ksp,Vec b,Vec x) 7417cdd61b2SBarry Smith .ve 7427cdd61b2SBarry Smith 7436891c3e4SJed Brown + pc - the preconditioner, get the application context with PCShellGetContext() 7447cdd61b2SBarry Smith . xin - input vector 7457cdd61b2SBarry Smith - xout - output vector 7467cdd61b2SBarry Smith 7474aa34b0aSBarry Smith Notes: the function MUST return an error code of 0 on success and nonzero on failure. 7484aa34b0aSBarry Smith 7497cdd61b2SBarry Smith Level: developer 7507cdd61b2SBarry Smith 7517cdd61b2SBarry Smith .keywords: PC, shell, set, apply, user-provided 7527cdd61b2SBarry Smith 753be29d3c6SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose(), PCShellSetPreSolve(), PCShellSetContext() 7547cdd61b2SBarry Smith @*/ 7556891c3e4SJed Brown PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetPostSolve(PC pc,PetscErrorCode (*postsolve)(PC,KSP,Vec,Vec)) 7567cdd61b2SBarry Smith { 7576891c3e4SJed Brown PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(PC,KSP,Vec,Vec)); 7587cdd61b2SBarry Smith 7597cdd61b2SBarry Smith PetscFunctionBegin; 760*0700a824SBarry 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; 791*0700a824SBarry 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; 824*0700a824SBarry 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); 8294b9ad928SBarry Smith } else { 8301302d50aSBarry Smith SETERRQ(PETSC_ERR_ARG_WRONG,"Not shell preconditioner, cannot get name"); 8314b9ad928SBarry Smith } 8324b9ad928SBarry Smith PetscFunctionReturn(0); 8334b9ad928SBarry Smith } 8344b9ad928SBarry Smith 8354b9ad928SBarry Smith #undef __FUNCT__ 8364b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApplyRichardson" 8374b9ad928SBarry Smith /*@C 8384b9ad928SBarry Smith PCShellSetApplyRichardson - Sets routine to use as preconditioner 8394b9ad928SBarry Smith in Richardson iteration. 8404b9ad928SBarry Smith 8414b9ad928SBarry Smith Collective on PC 8424b9ad928SBarry Smith 8434b9ad928SBarry Smith Input Parameters: 8444b9ad928SBarry Smith + pc - the preconditioner context 845be29d3c6SBarry Smith - apply - the application-provided preconditioning routine 8464b9ad928SBarry Smith 8474b9ad928SBarry Smith Calling sequence of apply: 8484b9ad928SBarry Smith .vb 8496891c3e4SJed Brown PetscErrorCode apply (PC pc,Vec b,Vec x,Vec r,PetscReal rtol,PetscReal abstol,PetscReal dtol,PetscInt maxits) 8504b9ad928SBarry Smith .ve 8514b9ad928SBarry Smith 8526891c3e4SJed Brown + pc - the preconditioner, get the application context with PCShellGetContext() 8534b9ad928SBarry Smith . b - right-hand-side 8544b9ad928SBarry Smith . x - current iterate 8554b9ad928SBarry Smith . r - work space 8564b9ad928SBarry Smith . rtol - relative tolerance of residual norm to stop at 85770441072SBarry Smith . abstol - absolute tolerance of residual norm to stop at 8584b9ad928SBarry Smith . dtol - if residual norm increases by this factor than return 8594b9ad928SBarry Smith - maxits - number of iterations to run 8604b9ad928SBarry Smith 8614aa34b0aSBarry Smith Notes: the function MUST return an error code of 0 on success and nonzero on failure. 8624aa34b0aSBarry Smith 8634b9ad928SBarry Smith Level: developer 8644b9ad928SBarry Smith 8654b9ad928SBarry Smith .keywords: PC, shell, set, apply, Richardson, user-provided 8664b9ad928SBarry Smith 867be29d3c6SBarry Smith .seealso: PCShellSetApply(), PCShellSetContext() 8684b9ad928SBarry Smith @*/ 8697319c654SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApplyRichardson(PC pc,PetscErrorCode (*apply)(PC,Vec,Vec,Vec,PetscReal,PetscReal,PetscReal,PetscInt,PetscTruth,PetscInt*,PCRichardsonConvergedReason*)) 8704b9ad928SBarry Smith { 8717319c654SBarry Smith PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(PC,Vec,Vec,Vec,PetscReal,PetscReal,PetscReal,PetscInt,PetscTruth,PetscInt*,PCRichardsonConvergedReason*)); 8724b9ad928SBarry Smith 8734b9ad928SBarry Smith PetscFunctionBegin; 874*0700a824SBarry Smith PetscValidHeaderSpecific(pc,PC_CLASSID,1); 8754b9ad928SBarry Smith ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetApplyRichardson_C",(void (**)(void))&f);CHKERRQ(ierr); 8764b9ad928SBarry Smith if (f) { 877be29d3c6SBarry Smith ierr = (*f)(pc,apply);CHKERRQ(ierr); 8784b9ad928SBarry Smith } 8794b9ad928SBarry Smith PetscFunctionReturn(0); 8804b9ad928SBarry Smith } 8814b9ad928SBarry Smith 8824b9ad928SBarry Smith /*MC 8834b9ad928SBarry Smith PCSHELL - Creates a new preconditioner class for use with your 8844b9ad928SBarry Smith own private data storage format. 8854b9ad928SBarry Smith 8864b9ad928SBarry Smith Level: advanced 88790198e61SBarry Smith > 8884b9ad928SBarry Smith Concepts: providing your own preconditioner 8894b9ad928SBarry Smith 8904b9ad928SBarry Smith Usage: 8916891c3e4SJed Brown $ extern PetscErrorCode apply(PC,Vec,Vec); 8926891c3e4SJed Brown $ extern PetscErrorCode applyba(PC,PCSide,Vec,Vec,Vec); 8936891c3e4SJed Brown $ extern PetscErrorCode applytranspose(PC,Vec,Vec); 8946891c3e4SJed Brown $ extern PetscErrorCode setup(PC); 8956891c3e4SJed Brown $ extern PetscErrorCode destroy(PC); 8966891c3e4SJed Brown $ 8974b9ad928SBarry Smith $ PCCreate(comm,&pc); 8984b9ad928SBarry Smith $ PCSetType(pc,PCSHELL); 899be29d3c6SBarry Smith $ PCShellSetContext(pc,ctx) 9006891c3e4SJed Brown $ PCShellSetApply(pc,apply); 9016891c3e4SJed Brown $ PCShellSetApplyBA(pc,applyba); (optional) 9026891c3e4SJed Brown $ PCShellSetApplyTranspose(pc,applytranspose); (optional) 9034b9ad928SBarry Smith $ PCShellSetSetUp(pc,setup); (optional) 904d01c8aa3SLisandro Dalcin $ PCShellSetDestroy(pc,destroy); (optional) 9054b9ad928SBarry Smith 9064b9ad928SBarry Smith .seealso: PCCreate(), PCSetType(), PCType (for list of available types), PC, 907fd2d0fe1Svictor MATSHELL, PCShellSetSetUp(), PCShellSetApply(), PCShellSetView(), 908fd2d0fe1Svictor PCShellSetApplyTranspose(), PCShellSetName(), PCShellSetApplyRichardson(), 9092bb17772SBarry Smith PCShellGetName(), PCShellSetContext(), PCShellGetContext(), PCShellSetApplyBA() 9104b9ad928SBarry Smith M*/ 9114b9ad928SBarry Smith 9124b9ad928SBarry Smith EXTERN_C_BEGIN 9134b9ad928SBarry Smith #undef __FUNCT__ 9144b9ad928SBarry Smith #define __FUNCT__ "PCCreate_Shell" 915dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCCreate_Shell(PC pc) 9164b9ad928SBarry Smith { 917dfbe8321SBarry Smith PetscErrorCode ierr; 9184b9ad928SBarry Smith PC_Shell *shell; 9194b9ad928SBarry Smith 9204b9ad928SBarry Smith PetscFunctionBegin; 92138f2d2fdSLisandro Dalcin ierr = PetscNewLog(pc,PC_Shell,&shell);CHKERRQ(ierr); 9224b9ad928SBarry Smith pc->data = (void*)shell; 9234b9ad928SBarry Smith 924d01c8aa3SLisandro Dalcin pc->ops->destroy = PCDestroy_Shell; 9254b9ad928SBarry Smith pc->ops->view = PCView_Shell; 926d01c8aa3SLisandro Dalcin pc->ops->apply = PCApply_Shell; 927d01c8aa3SLisandro Dalcin pc->ops->applytranspose = 0; 9284b9ad928SBarry Smith pc->ops->applyrichardson = 0; 929d01c8aa3SLisandro Dalcin pc->ops->setup = 0; 9309bbb2c88SBarry Smith pc->ops->presolve = 0; 9319bbb2c88SBarry Smith pc->ops->postsolve = 0; 9324b9ad928SBarry Smith 9334b9ad928SBarry Smith shell->apply = 0; 9344b9ad928SBarry Smith shell->applytranspose = 0; 9354b9ad928SBarry Smith shell->name = 0; 9364b9ad928SBarry Smith shell->applyrich = 0; 9377cdd61b2SBarry Smith shell->presolve = 0; 9387cdd61b2SBarry Smith shell->postsolve = 0; 9394b9ad928SBarry Smith shell->ctx = 0; 9404b9ad928SBarry Smith shell->setup = 0; 9414b9ad928SBarry Smith shell->view = 0; 94218be62a5SSatish Balay shell->destroy = 0; 9434b9ad928SBarry Smith 94418be62a5SSatish Balay ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetDestroy_C","PCShellSetDestroy_Shell", 94518be62a5SSatish Balay PCShellSetDestroy_Shell);CHKERRQ(ierr); 9464b9ad928SBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetSetUp_C","PCShellSetSetUp_Shell", 9474b9ad928SBarry Smith PCShellSetSetUp_Shell);CHKERRQ(ierr); 9484b9ad928SBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetApply_C","PCShellSetApply_Shell", 9494b9ad928SBarry Smith PCShellSetApply_Shell);CHKERRQ(ierr); 9502bb17772SBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetApplyBA_C","PCShellSetApplyBA_Shell", 9512bb17772SBarry Smith PCShellSetApplyBA_Shell);CHKERRQ(ierr); 9527cdd61b2SBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetPreSolve_C","PCShellSetPreSolve_Shell", 9537cdd61b2SBarry Smith PCShellSetPreSolve_Shell);CHKERRQ(ierr); 9547cdd61b2SBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetPostSolve_C","PCShellSetPostSolve_Shell", 9557cdd61b2SBarry Smith PCShellSetPostSolve_Shell);CHKERRQ(ierr); 9564b9ad928SBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetView_C","PCShellSetView_Shell", 9574b9ad928SBarry Smith PCShellSetView_Shell);CHKERRQ(ierr); 958be29d3c6SBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetApplyTranspose_C","PCShellSetApplyTranspose_Shell", 9594b9ad928SBarry Smith PCShellSetApplyTranspose_Shell);CHKERRQ(ierr); 9604b9ad928SBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetName_C","PCShellSetName_Shell", 9614b9ad928SBarry Smith PCShellSetName_Shell);CHKERRQ(ierr); 9624b9ad928SBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellGetName_C","PCShellGetName_Shell", 9634b9ad928SBarry Smith PCShellGetName_Shell);CHKERRQ(ierr); 964be29d3c6SBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetApplyRichardson_C","PCShellSetApplyRichardson_Shell", 9654b9ad928SBarry Smith PCShellSetApplyRichardson_Shell);CHKERRQ(ierr); 9664b9ad928SBarry Smith PetscFunctionReturn(0); 9674b9ad928SBarry Smith } 9684b9ad928SBarry Smith EXTERN_C_END 9694b9ad928SBarry Smith 9704b9ad928SBarry Smith 9714b9ad928SBarry Smith 9724b9ad928SBarry Smith 9734b9ad928SBarry Smith 9744b9ad928SBarry Smith 975