1dba47a55SKris Buschelman #define PETSCKSP_DLL 2dba47a55SKris Buschelman 34b9ad928SBarry Smith /* 44b9ad928SBarry Smith This provides a simple shell for Fortran (and C programmers) to 54b9ad928SBarry Smith create their own preconditioner without writing much interface code. 64b9ad928SBarry Smith */ 74b9ad928SBarry Smith 86356e834SBarry Smith #include "private/pcimpl.h" /*I "petscpc.h" I*/ 91d8d5f9aSSatish Balay #include "private/vecimpl.h" 104b9ad928SBarry Smith 11ac226902SBarry Smith EXTERN_C_BEGIN 124b9ad928SBarry Smith typedef struct { 13be29d3c6SBarry Smith void *ctx; /* user provided contexts for preconditioner */ 1418be62a5SSatish Balay PetscErrorCode (*destroy)(void*); 156849ba73SBarry Smith PetscErrorCode (*setup)(void*); 166849ba73SBarry Smith PetscErrorCode (*apply)(void*,Vec,Vec); 172bb17772SBarry Smith PetscErrorCode (*applyBA)(void*,PCSide,Vec,Vec,Vec); 187cdd61b2SBarry Smith PetscErrorCode (*presolve)(void*,KSP,Vec,Vec); 197cdd61b2SBarry Smith PetscErrorCode (*postsolve)(void*,KSP,Vec,Vec); 206849ba73SBarry Smith PetscErrorCode (*view)(void*,PetscViewer); 216849ba73SBarry Smith PetscErrorCode (*applytranspose)(void*,Vec,Vec); 2213f74950SBarry Smith PetscErrorCode (*applyrich)(void*,Vec,Vec,Vec,PetscReal,PetscReal,PetscReal,PetscInt); 234b9ad928SBarry Smith char *name; 244b9ad928SBarry Smith } PC_Shell; 25ac226902SBarry Smith EXTERN_C_END 264b9ad928SBarry Smith 274b9ad928SBarry Smith #undef __FUNCT__ 28be29d3c6SBarry Smith #define __FUNCT__ "PCShellGetContext" 29*b29801fcSSatish Balay /*@C 30be29d3c6SBarry Smith PCShellGetContext - Returns the user-provided context associated with a shell PC 31be29d3c6SBarry Smith 32be29d3c6SBarry Smith Not Collective 33be29d3c6SBarry Smith 34be29d3c6SBarry Smith Input Parameter: 35be29d3c6SBarry Smith . pc - should have been created with PCCreateShell() 36be29d3c6SBarry Smith 37be29d3c6SBarry Smith Output Parameter: 38be29d3c6SBarry Smith . ctx - the user provided context 39be29d3c6SBarry Smith 40be29d3c6SBarry Smith Level: advanced 41be29d3c6SBarry Smith 42be29d3c6SBarry Smith Notes: 43be29d3c6SBarry Smith This routine is intended for use within various shell routines 44be29d3c6SBarry Smith 45be29d3c6SBarry Smith .keywords: PC, shell, get, context 46be29d3c6SBarry Smith 47be29d3c6SBarry Smith .seealso: PCCreateShell(), PCShellSetContext() 48be29d3c6SBarry Smith @*/ 49be29d3c6SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellGetContext(PC pc,void **ctx) 50be29d3c6SBarry Smith { 51be29d3c6SBarry Smith PetscErrorCode ierr; 52be29d3c6SBarry Smith PetscTruth flg; 53be29d3c6SBarry Smith 54be29d3c6SBarry Smith PetscFunctionBegin; 55be29d3c6SBarry Smith PetscValidHeaderSpecific(pc,PC_COOKIE,1); 56be29d3c6SBarry Smith PetscValidPointer(ctx,2); 57be29d3c6SBarry Smith ierr = PetscTypeCompare((PetscObject)pc,PCSHELL,&flg);CHKERRQ(ierr); 58be29d3c6SBarry Smith if (!flg) *ctx = 0; 59be29d3c6SBarry Smith else *ctx = ((PC_Shell*)(pc->data))->ctx; 60be29d3c6SBarry Smith PetscFunctionReturn(0); 61be29d3c6SBarry Smith } 62be29d3c6SBarry Smith 63be29d3c6SBarry Smith #undef __FUNCT__ 64be29d3c6SBarry Smith #define __FUNCT__ "PCShellSetContext" 65*b29801fcSSatish Balay /*@ 66be29d3c6SBarry Smith PCShellSetContext - sets the context for a shell PC 67be29d3c6SBarry Smith 68be29d3c6SBarry Smith Collective on PC 69be29d3c6SBarry Smith 70be29d3c6SBarry Smith Input Parameters: 71be29d3c6SBarry Smith + pc - the shell PC 72be29d3c6SBarry Smith - ctx - the context 73be29d3c6SBarry Smith 74be29d3c6SBarry Smith Level: advanced 75be29d3c6SBarry Smith 76be29d3c6SBarry Smith Fortran Notes: The context can only be an integer or a PetscObject 77be29d3c6SBarry Smith unfortunately it cannot be a Fortran array or derived type. 78be29d3c6SBarry Smith 79be29d3c6SBarry Smith .seealso: PCCreateShell(), PCShellGetContext() 80be29d3c6SBarry Smith @*/ 81be29d3c6SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetContext(PC pc,void *ctx) 82be29d3c6SBarry Smith { 83be29d3c6SBarry Smith PC_Shell *shell = (PC_Shell*)pc->data; 84be29d3c6SBarry Smith PetscErrorCode ierr; 85be29d3c6SBarry Smith PetscTruth flg; 86be29d3c6SBarry Smith 87be29d3c6SBarry Smith PetscFunctionBegin; 88be29d3c6SBarry Smith PetscValidHeaderSpecific(pc,PC_COOKIE,1); 89be29d3c6SBarry Smith ierr = PetscTypeCompare((PetscObject)pc,PCSHELL,&flg);CHKERRQ(ierr); 90be29d3c6SBarry Smith if (flg) { 91be29d3c6SBarry Smith shell->ctx = ctx; 92be29d3c6SBarry Smith } 93be29d3c6SBarry Smith PetscFunctionReturn(0); 94be29d3c6SBarry Smith } 95be29d3c6SBarry Smith 96be29d3c6SBarry Smith #undef __FUNCT__ 9718be62a5SSatish Balay #define __FUNCT__ "PCSetUp_Shell" 986849ba73SBarry Smith static PetscErrorCode PCSetUp_Shell(PC pc) 994b9ad928SBarry Smith { 1004b9ad928SBarry Smith PC_Shell *shell; 101dfbe8321SBarry Smith PetscErrorCode ierr; 1024b9ad928SBarry Smith 1034b9ad928SBarry Smith PetscFunctionBegin; 1044b9ad928SBarry Smith shell = (PC_Shell*)pc->data; 1054b9ad928SBarry Smith if (shell->setup) { 106e9a2bbcdSBarry Smith CHKMEMQ; 1074b9ad928SBarry Smith ierr = (*shell->setup)(shell->ctx);CHKERRQ(ierr); 108e9a2bbcdSBarry Smith CHKMEMQ; 1094b9ad928SBarry Smith } 1104b9ad928SBarry Smith PetscFunctionReturn(0); 1114b9ad928SBarry Smith } 1124b9ad928SBarry Smith 1134b9ad928SBarry Smith #undef __FUNCT__ 1144b9ad928SBarry Smith #define __FUNCT__ "PCApply_Shell" 1156849ba73SBarry Smith static PetscErrorCode PCApply_Shell(PC pc,Vec x,Vec y) 1164b9ad928SBarry Smith { 1174b9ad928SBarry Smith PC_Shell *shell; 118dfbe8321SBarry Smith PetscErrorCode ierr; 1194b9ad928SBarry Smith 1204b9ad928SBarry Smith PetscFunctionBegin; 1214b9ad928SBarry Smith shell = (PC_Shell*)pc->data; 1221302d50aSBarry Smith if (!shell->apply) SETERRQ(PETSC_ERR_USER,"No apply() routine provided to Shell PC"); 123e9a2bbcdSBarry Smith PetscStackPush("PCSHELL user function"); 124e9a2bbcdSBarry Smith CHKMEMQ; 1254b9ad928SBarry Smith ierr = (*shell->apply)(shell->ctx,x,y);CHKERRQ(ierr); 126e9a2bbcdSBarry Smith CHKMEMQ; 127e9a2bbcdSBarry Smith PetscStackPop; 1284b9ad928SBarry Smith PetscFunctionReturn(0); 1294b9ad928SBarry Smith } 1304b9ad928SBarry Smith 1314b9ad928SBarry Smith #undef __FUNCT__ 1322bb17772SBarry Smith #define __FUNCT__ "PCApplyBA_Shell" 1332bb17772SBarry Smith static PetscErrorCode PCApplyBA_Shell(PC pc,PCSide side,Vec x,Vec y,Vec w) 1342bb17772SBarry Smith { 1352bb17772SBarry Smith PC_Shell *shell; 1362bb17772SBarry Smith PetscErrorCode ierr; 1372bb17772SBarry Smith 1382bb17772SBarry Smith PetscFunctionBegin; 1392bb17772SBarry Smith shell = (PC_Shell*)pc->data; 1402bb17772SBarry Smith if (!shell->applyBA) SETERRQ(PETSC_ERR_USER,"No applyBA() routine provided to Shell PC"); 1412bb17772SBarry Smith PetscStackPush("PCSHELL user function BA"); 1422bb17772SBarry Smith CHKMEMQ; 1432bb17772SBarry Smith ierr = (*shell->applyBA)(shell->ctx,side,x,y,w);CHKERRQ(ierr); 1442bb17772SBarry Smith CHKMEMQ; 1452bb17772SBarry Smith PetscStackPop; 1462bb17772SBarry Smith PetscFunctionReturn(0); 1472bb17772SBarry Smith } 1482bb17772SBarry Smith 1492bb17772SBarry Smith #undef __FUNCT__ 1507cdd61b2SBarry Smith #define __FUNCT__ "PCPreSolve_Shell" 1517cdd61b2SBarry Smith static PetscErrorCode PCPreSolve_Shell(PC pc,KSP ksp,Vec b,Vec x) 1527cdd61b2SBarry Smith { 1537cdd61b2SBarry Smith PC_Shell *shell; 1547cdd61b2SBarry Smith PetscErrorCode ierr; 1557cdd61b2SBarry Smith 1567cdd61b2SBarry Smith PetscFunctionBegin; 1577cdd61b2SBarry Smith shell = (PC_Shell*)pc->data; 15891ad8336SSatish Balay if (!shell->presolve) SETERRQ(PETSC_ERR_USER,"No presolve() routine provided to Shell PC"); 1597cdd61b2SBarry Smith ierr = (*shell->presolve)(shell->ctx,ksp,b,x);CHKERRQ(ierr); 1607cdd61b2SBarry Smith PetscFunctionReturn(0); 1617cdd61b2SBarry Smith } 1627cdd61b2SBarry Smith 1637cdd61b2SBarry Smith #undef __FUNCT__ 1647cdd61b2SBarry Smith #define __FUNCT__ "PCPostSolve_Shell" 1657cdd61b2SBarry Smith static PetscErrorCode PCPostSolve_Shell(PC pc,KSP ksp,Vec b,Vec x) 1667cdd61b2SBarry Smith { 1677cdd61b2SBarry Smith PC_Shell *shell; 1687cdd61b2SBarry Smith PetscErrorCode ierr; 1697cdd61b2SBarry Smith 1707cdd61b2SBarry Smith PetscFunctionBegin; 1717cdd61b2SBarry Smith shell = (PC_Shell*)pc->data; 17291ad8336SSatish Balay if (!shell->postsolve) SETERRQ(PETSC_ERR_USER,"No postsolve() routine provided to Shell PC"); 17391ad8336SSatish Balay ierr = (*shell->postsolve)(shell->ctx,ksp,b,x);CHKERRQ(ierr); 1747cdd61b2SBarry Smith PetscFunctionReturn(0); 1757cdd61b2SBarry Smith } 1767cdd61b2SBarry Smith 1777cdd61b2SBarry Smith #undef __FUNCT__ 1784b9ad928SBarry Smith #define __FUNCT__ "PCApplyTranspose_Shell" 1796849ba73SBarry Smith static PetscErrorCode PCApplyTranspose_Shell(PC pc,Vec x,Vec y) 1804b9ad928SBarry Smith { 1814b9ad928SBarry Smith PC_Shell *shell; 182dfbe8321SBarry Smith PetscErrorCode ierr; 1834b9ad928SBarry Smith 1844b9ad928SBarry Smith PetscFunctionBegin; 1854b9ad928SBarry Smith shell = (PC_Shell*)pc->data; 1861302d50aSBarry Smith if (!shell->applytranspose) SETERRQ(PETSC_ERR_USER,"No applytranspose() routine provided to Shell PC"); 1874b9ad928SBarry Smith ierr = (*shell->applytranspose)(shell->ctx,x,y);CHKERRQ(ierr); 1884b9ad928SBarry Smith PetscFunctionReturn(0); 1894b9ad928SBarry Smith } 1904b9ad928SBarry Smith 1914b9ad928SBarry Smith #undef __FUNCT__ 1924b9ad928SBarry Smith #define __FUNCT__ "PCApplyRichardson_Shell" 19313f74950SBarry Smith static PetscErrorCode PCApplyRichardson_Shell(PC pc,Vec x,Vec y,Vec w,PetscReal rtol,PetscReal abstol, PetscReal dtol,PetscInt it) 1944b9ad928SBarry Smith { 195dfbe8321SBarry Smith PetscErrorCode ierr; 1964b9ad928SBarry Smith PC_Shell *shell; 1974b9ad928SBarry Smith 1984b9ad928SBarry Smith PetscFunctionBegin; 1994b9ad928SBarry Smith shell = (PC_Shell*)pc->data; 200be29d3c6SBarry Smith ierr = (*shell->applyrich)(shell->ctx,x,y,w,rtol,abstol,dtol,it);CHKERRQ(ierr); 2014b9ad928SBarry Smith PetscFunctionReturn(0); 2024b9ad928SBarry Smith } 2034b9ad928SBarry Smith 2044b9ad928SBarry Smith #undef __FUNCT__ 2054b9ad928SBarry Smith #define __FUNCT__ "PCDestroy_Shell" 2066849ba73SBarry Smith static PetscErrorCode PCDestroy_Shell(PC pc) 2074b9ad928SBarry Smith { 2084b9ad928SBarry Smith PC_Shell *shell = (PC_Shell*)pc->data; 209dfbe8321SBarry Smith PetscErrorCode ierr; 2104b9ad928SBarry Smith 2114b9ad928SBarry Smith PetscFunctionBegin; 21205b42c5fSBarry Smith ierr = PetscStrfree(shell->name);CHKERRQ(ierr); 21318be62a5SSatish Balay if (shell->destroy) { 21418be62a5SSatish Balay ierr = (*shell->destroy)(shell->ctx);CHKERRQ(ierr); 21518be62a5SSatish Balay } 2164b9ad928SBarry Smith ierr = PetscFree(shell);CHKERRQ(ierr); 2174b9ad928SBarry Smith PetscFunctionReturn(0); 2184b9ad928SBarry Smith } 2194b9ad928SBarry Smith 2204b9ad928SBarry Smith #undef __FUNCT__ 2214b9ad928SBarry Smith #define __FUNCT__ "PCView_Shell" 2226849ba73SBarry Smith static PetscErrorCode PCView_Shell(PC pc,PetscViewer viewer) 2234b9ad928SBarry Smith { 2244b9ad928SBarry Smith PC_Shell *shell = (PC_Shell*)pc->data; 225dfbe8321SBarry Smith PetscErrorCode ierr; 22632077d6dSBarry Smith PetscTruth iascii; 2274b9ad928SBarry Smith 2284b9ad928SBarry Smith PetscFunctionBegin; 22932077d6dSBarry Smith ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_ASCII,&iascii);CHKERRQ(ierr); 23032077d6dSBarry Smith if (iascii) { 2314b9ad928SBarry Smith if (shell->name) {ierr = PetscViewerASCIIPrintf(viewer," Shell: %s\n",shell->name);CHKERRQ(ierr);} 2324b9ad928SBarry Smith else {ierr = PetscViewerASCIIPrintf(viewer," Shell: no name\n");CHKERRQ(ierr);} 2334b9ad928SBarry Smith } 2344b9ad928SBarry Smith if (shell->view) { 2354b9ad928SBarry Smith ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 2364b9ad928SBarry Smith ierr = (*shell->view)(shell->ctx,viewer);CHKERRQ(ierr); 2374b9ad928SBarry Smith ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 2384b9ad928SBarry Smith } 2394b9ad928SBarry Smith PetscFunctionReturn(0); 2404b9ad928SBarry Smith } 2414b9ad928SBarry Smith 2424b9ad928SBarry Smith /* ------------------------------------------------------------------------------*/ 2434b9ad928SBarry Smith EXTERN_C_BEGIN 2444b9ad928SBarry Smith #undef __FUNCT__ 24518be62a5SSatish Balay #define __FUNCT__ "PCShellSetDestroy_Shell" 24618be62a5SSatish Balay PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetDestroy_Shell(PC pc, PetscErrorCode (*destroy)(void*)) 24718be62a5SSatish Balay { 24818be62a5SSatish Balay PC_Shell *shell; 24918be62a5SSatish Balay 25018be62a5SSatish Balay PetscFunctionBegin; 25118be62a5SSatish Balay shell = (PC_Shell*)pc->data; 25218be62a5SSatish Balay shell->destroy = destroy; 25318be62a5SSatish Balay PetscFunctionReturn(0); 25418be62a5SSatish Balay } 25518be62a5SSatish Balay EXTERN_C_END 25618be62a5SSatish Balay 25718be62a5SSatish Balay EXTERN_C_BEGIN 25818be62a5SSatish Balay #undef __FUNCT__ 2594b9ad928SBarry Smith #define __FUNCT__ "PCShellSetSetUp_Shell" 260dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetSetUp_Shell(PC pc, PetscErrorCode (*setup)(void*)) 2614b9ad928SBarry Smith { 2624b9ad928SBarry Smith PC_Shell *shell; 2634b9ad928SBarry Smith 2644b9ad928SBarry Smith PetscFunctionBegin; 2654b9ad928SBarry Smith shell = (PC_Shell*)pc->data; 2664b9ad928SBarry Smith shell->setup = setup; 2674b9ad928SBarry Smith PetscFunctionReturn(0); 2684b9ad928SBarry Smith } 2694b9ad928SBarry Smith EXTERN_C_END 2704b9ad928SBarry Smith 2714b9ad928SBarry Smith EXTERN_C_BEGIN 2724b9ad928SBarry Smith #undef __FUNCT__ 2734b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApply_Shell" 274be29d3c6SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApply_Shell(PC pc,PetscErrorCode (*apply)(void*,Vec,Vec)) 2754b9ad928SBarry Smith { 2764b9ad928SBarry Smith PC_Shell *shell; 2774b9ad928SBarry Smith 2784b9ad928SBarry Smith PetscFunctionBegin; 2794b9ad928SBarry Smith shell = (PC_Shell*)pc->data; 2804b9ad928SBarry Smith shell->apply = apply; 2814b9ad928SBarry Smith PetscFunctionReturn(0); 2824b9ad928SBarry Smith } 2834b9ad928SBarry Smith EXTERN_C_END 2844b9ad928SBarry Smith 2854b9ad928SBarry Smith EXTERN_C_BEGIN 2864b9ad928SBarry Smith #undef __FUNCT__ 2872bb17772SBarry Smith #define __FUNCT__ "PCShellSetApplyBA_Shell" 2882bb17772SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApplyBA_Shell(PC pc,PetscErrorCode (*apply)(void*,PCSide,Vec,Vec,Vec)) 2892bb17772SBarry Smith { 2902bb17772SBarry Smith PC_Shell *shell; 2912bb17772SBarry Smith 2922bb17772SBarry Smith PetscFunctionBegin; 2932bb17772SBarry Smith shell = (PC_Shell*)pc->data; 294aef0136fSBarry Smith if (apply) pc->ops->applyBA = PCApplyBA_Shell; 295aef0136fSBarry Smith else pc->ops->applyBA = 0; 2962bb17772SBarry Smith shell->applyBA = apply; 2972bb17772SBarry Smith PetscFunctionReturn(0); 2982bb17772SBarry Smith } 2992bb17772SBarry Smith EXTERN_C_END 3002bb17772SBarry Smith 3012bb17772SBarry Smith EXTERN_C_BEGIN 3022bb17772SBarry Smith #undef __FUNCT__ 3037cdd61b2SBarry Smith #define __FUNCT__ "PCShellSetPreSolve_Shell" 304be29d3c6SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetPreSolve_Shell(PC pc,PetscErrorCode (*presolve)(void*,KSP,Vec,Vec)) 3057cdd61b2SBarry Smith { 3067cdd61b2SBarry Smith PC_Shell *shell; 3077cdd61b2SBarry Smith 3087cdd61b2SBarry Smith PetscFunctionBegin; 3097cdd61b2SBarry Smith shell = (PC_Shell*)pc->data; 3107cdd61b2SBarry Smith shell->presolve = presolve; 3119bbb2c88SBarry Smith if (presolve) { 3129bbb2c88SBarry Smith pc->ops->presolve = PCPreSolve_Shell; 3139bbb2c88SBarry Smith } else { 3149bbb2c88SBarry Smith pc->ops->presolve = 0; 3159bbb2c88SBarry Smith } 3167cdd61b2SBarry Smith PetscFunctionReturn(0); 3177cdd61b2SBarry Smith } 3187cdd61b2SBarry Smith EXTERN_C_END 3197cdd61b2SBarry Smith 3207cdd61b2SBarry Smith EXTERN_C_BEGIN 3217cdd61b2SBarry Smith #undef __FUNCT__ 3227cdd61b2SBarry Smith #define __FUNCT__ "PCShellSetPostSolve_Shell" 323be29d3c6SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetPostSolve_Shell(PC pc,PetscErrorCode (*postsolve)(void*,KSP,Vec,Vec)) 3247cdd61b2SBarry Smith { 3257cdd61b2SBarry Smith PC_Shell *shell; 3267cdd61b2SBarry Smith 3277cdd61b2SBarry Smith PetscFunctionBegin; 3287cdd61b2SBarry Smith shell = (PC_Shell*)pc->data; 3297cdd61b2SBarry Smith shell->postsolve = postsolve; 3309bbb2c88SBarry Smith if (postsolve) { 3319bbb2c88SBarry Smith pc->ops->postsolve = PCPostSolve_Shell; 3329bbb2c88SBarry Smith } else { 3339bbb2c88SBarry Smith pc->ops->postsolve = 0; 3349bbb2c88SBarry Smith } 3357cdd61b2SBarry Smith PetscFunctionReturn(0); 3367cdd61b2SBarry Smith } 3377cdd61b2SBarry Smith EXTERN_C_END 3387cdd61b2SBarry Smith 3397cdd61b2SBarry Smith EXTERN_C_BEGIN 3407cdd61b2SBarry Smith #undef __FUNCT__ 3414b9ad928SBarry Smith #define __FUNCT__ "PCShellSetView_Shell" 342dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetView_Shell(PC pc,PetscErrorCode (*view)(void*,PetscViewer)) 3434b9ad928SBarry Smith { 3444b9ad928SBarry Smith PC_Shell *shell; 3454b9ad928SBarry Smith 3464b9ad928SBarry Smith PetscFunctionBegin; 3474b9ad928SBarry Smith shell = (PC_Shell*)pc->data; 3484b9ad928SBarry Smith shell->view = view; 3494b9ad928SBarry Smith PetscFunctionReturn(0); 3504b9ad928SBarry Smith } 3514b9ad928SBarry Smith EXTERN_C_END 3524b9ad928SBarry Smith 3534b9ad928SBarry Smith EXTERN_C_BEGIN 3544b9ad928SBarry Smith #undef __FUNCT__ 3554b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApplyTranspose_Shell" 356dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApplyTranspose_Shell(PC pc,PetscErrorCode (*applytranspose)(void*,Vec,Vec)) 3574b9ad928SBarry Smith { 3584b9ad928SBarry Smith PC_Shell *shell; 3594b9ad928SBarry Smith 3604b9ad928SBarry Smith PetscFunctionBegin; 3614b9ad928SBarry Smith shell = (PC_Shell*)pc->data; 3624b9ad928SBarry Smith shell->applytranspose = applytranspose; 3634b9ad928SBarry Smith PetscFunctionReturn(0); 3644b9ad928SBarry Smith } 3654b9ad928SBarry Smith EXTERN_C_END 3664b9ad928SBarry Smith 3674b9ad928SBarry Smith EXTERN_C_BEGIN 3684b9ad928SBarry Smith #undef __FUNCT__ 3694b9ad928SBarry Smith #define __FUNCT__ "PCShellSetName_Shell" 370dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetName_Shell(PC pc,const char name[]) 3714b9ad928SBarry Smith { 3724b9ad928SBarry Smith PC_Shell *shell; 373dfbe8321SBarry Smith PetscErrorCode ierr; 3744b9ad928SBarry Smith 3754b9ad928SBarry Smith PetscFunctionBegin; 3764b9ad928SBarry Smith shell = (PC_Shell*)pc->data; 377f259bd47SBarry Smith ierr = PetscStrfree(shell->name);CHKERRQ(ierr); 3784b9ad928SBarry Smith ierr = PetscStrallocpy(name,&shell->name);CHKERRQ(ierr); 3794b9ad928SBarry Smith PetscFunctionReturn(0); 3804b9ad928SBarry Smith } 3814b9ad928SBarry Smith EXTERN_C_END 3824b9ad928SBarry Smith 3834b9ad928SBarry Smith EXTERN_C_BEGIN 3844b9ad928SBarry Smith #undef __FUNCT__ 3854b9ad928SBarry Smith #define __FUNCT__ "PCShellGetName_Shell" 386dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellGetName_Shell(PC pc,char *name[]) 3874b9ad928SBarry Smith { 3884b9ad928SBarry Smith PC_Shell *shell; 3894b9ad928SBarry Smith 3904b9ad928SBarry Smith PetscFunctionBegin; 3914b9ad928SBarry Smith shell = (PC_Shell*)pc->data; 3924b9ad928SBarry Smith *name = shell->name; 3934b9ad928SBarry Smith PetscFunctionReturn(0); 3944b9ad928SBarry Smith } 3954b9ad928SBarry Smith EXTERN_C_END 3964b9ad928SBarry Smith 3974b9ad928SBarry Smith EXTERN_C_BEGIN 3984b9ad928SBarry Smith #undef __FUNCT__ 3994b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApplyRichardson_Shell" 400be29d3c6SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApplyRichardson_Shell(PC pc,PetscErrorCode (*apply)(void*,Vec,Vec,Vec,PetscReal,PetscReal,PetscReal,PetscInt)) 4014b9ad928SBarry Smith { 4024b9ad928SBarry Smith PC_Shell *shell; 4034b9ad928SBarry Smith 4044b9ad928SBarry Smith PetscFunctionBegin; 4054b9ad928SBarry Smith shell = (PC_Shell*)pc->data; 4064b9ad928SBarry Smith pc->ops->applyrichardson = PCApplyRichardson_Shell; 4074b9ad928SBarry Smith shell->applyrich = apply; 4084b9ad928SBarry Smith PetscFunctionReturn(0); 4094b9ad928SBarry Smith } 4104b9ad928SBarry Smith EXTERN_C_END 4114b9ad928SBarry Smith 4124b9ad928SBarry Smith /* -------------------------------------------------------------------------------*/ 4134b9ad928SBarry Smith 4144b9ad928SBarry Smith #undef __FUNCT__ 41518be62a5SSatish Balay #define __FUNCT__ "PCShellSetDestroy" 41618be62a5SSatish Balay /*@C 41718be62a5SSatish Balay PCShellSetDestroy - Sets routine to use to destroy the user-provided 41818be62a5SSatish Balay application context. 41918be62a5SSatish Balay 42018be62a5SSatish Balay Collective on PC 42118be62a5SSatish Balay 42218be62a5SSatish Balay Input Parameters: 42318be62a5SSatish Balay + pc - the preconditioner context 42418be62a5SSatish Balay . destroy - the application-provided destroy routine 42518be62a5SSatish Balay 42618be62a5SSatish Balay Calling sequence of destroy: 42718be62a5SSatish Balay .vb 42818be62a5SSatish Balay PetscErrorCode destroy (void *ptr) 42918be62a5SSatish Balay .ve 43018be62a5SSatish Balay 43118be62a5SSatish Balay . ptr - the application context 43218be62a5SSatish Balay 43318be62a5SSatish Balay Level: developer 43418be62a5SSatish Balay 43518be62a5SSatish Balay .keywords: PC, shell, set, destroy, user-provided 43618be62a5SSatish Balay 43718be62a5SSatish Balay .seealso: PCShellSetApply(), PCShellSetContext() 43818be62a5SSatish Balay @*/ 43918be62a5SSatish Balay PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetDestroy(PC pc,PetscErrorCode (*destroy)(void*)) 44018be62a5SSatish Balay { 44118be62a5SSatish Balay PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*)); 44218be62a5SSatish Balay 44318be62a5SSatish Balay PetscFunctionBegin; 44418be62a5SSatish Balay PetscValidHeaderSpecific(pc,PC_COOKIE,1); 44518be62a5SSatish Balay ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetDestroy_C",(void (**)(void))&f);CHKERRQ(ierr); 44618be62a5SSatish Balay if (f) { 44718be62a5SSatish Balay ierr = (*f)(pc,destroy);CHKERRQ(ierr); 44818be62a5SSatish Balay } 44918be62a5SSatish Balay PetscFunctionReturn(0); 45018be62a5SSatish Balay } 45118be62a5SSatish Balay 45218be62a5SSatish Balay 45318be62a5SSatish Balay #undef __FUNCT__ 4544b9ad928SBarry Smith #define __FUNCT__ "PCShellSetSetUp" 4554b9ad928SBarry Smith /*@C 4564b9ad928SBarry Smith PCShellSetSetUp - Sets routine to use to "setup" the preconditioner whenever the 4574b9ad928SBarry Smith matrix operator is changed. 4584b9ad928SBarry Smith 4594b9ad928SBarry Smith Collective on PC 4604b9ad928SBarry Smith 4614b9ad928SBarry Smith Input Parameters: 4624b9ad928SBarry Smith + pc - the preconditioner context 4634b9ad928SBarry Smith . setup - the application-provided setup routine 4644b9ad928SBarry Smith 4654b9ad928SBarry Smith Calling sequence of setup: 4664b9ad928SBarry Smith .vb 46713f74950SBarry Smith PetscErrorCode setup (void *ptr) 4684b9ad928SBarry Smith .ve 4694b9ad928SBarry Smith 4704b9ad928SBarry Smith . ptr - the application context 4714b9ad928SBarry Smith 4724b9ad928SBarry Smith Level: developer 4734b9ad928SBarry Smith 4744b9ad928SBarry Smith .keywords: PC, shell, set, setup, user-provided 4754b9ad928SBarry Smith 476be29d3c6SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetApply(), PCShellSetContext() 4774b9ad928SBarry Smith @*/ 478dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetSetUp(PC pc,PetscErrorCode (*setup)(void*)) 4794b9ad928SBarry Smith { 4806849ba73SBarry Smith PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*)); 4814b9ad928SBarry Smith 4824b9ad928SBarry Smith PetscFunctionBegin; 4834482741eSBarry Smith PetscValidHeaderSpecific(pc,PC_COOKIE,1); 4844b9ad928SBarry Smith ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetSetUp_C",(void (**)(void))&f);CHKERRQ(ierr); 4854b9ad928SBarry Smith if (f) { 4864b9ad928SBarry Smith ierr = (*f)(pc,setup);CHKERRQ(ierr); 4874b9ad928SBarry Smith } 4884b9ad928SBarry Smith PetscFunctionReturn(0); 4894b9ad928SBarry Smith } 4904b9ad928SBarry Smith 4914b9ad928SBarry Smith 4924b9ad928SBarry Smith #undef __FUNCT__ 4934b9ad928SBarry Smith #define __FUNCT__ "PCShellSetView" 4944b9ad928SBarry Smith /*@C 4954b9ad928SBarry Smith PCShellSetView - Sets routine to use as viewer of shell preconditioner 4964b9ad928SBarry Smith 4974b9ad928SBarry Smith Collective on PC 4984b9ad928SBarry Smith 4994b9ad928SBarry Smith Input Parameters: 5004b9ad928SBarry Smith + pc - the preconditioner context 5014b9ad928SBarry Smith - view - the application-provided view routine 5024b9ad928SBarry Smith 5034b9ad928SBarry Smith Calling sequence of apply: 5044b9ad928SBarry Smith .vb 50513f74950SBarry Smith PetscErrorCode view(void *ptr,PetscViewer v) 5064b9ad928SBarry Smith .ve 5074b9ad928SBarry Smith 5084b9ad928SBarry Smith + ptr - the application context 5094b9ad928SBarry Smith - v - viewer 5104b9ad928SBarry Smith 5114b9ad928SBarry Smith Level: developer 5124b9ad928SBarry Smith 5134b9ad928SBarry Smith .keywords: PC, shell, set, apply, user-provided 5144b9ad928SBarry Smith 5154b9ad928SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose() 5164b9ad928SBarry Smith @*/ 517dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetView(PC pc,PetscErrorCode (*view)(void*,PetscViewer)) 5184b9ad928SBarry Smith { 5196849ba73SBarry Smith PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*,PetscViewer)); 5204b9ad928SBarry Smith 5214b9ad928SBarry Smith PetscFunctionBegin; 5224482741eSBarry Smith PetscValidHeaderSpecific(pc,PC_COOKIE,1); 5234b9ad928SBarry Smith ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetView_C",(void (**)(void))&f);CHKERRQ(ierr); 5244b9ad928SBarry Smith if (f) { 5254b9ad928SBarry Smith ierr = (*f)(pc,view);CHKERRQ(ierr); 5264b9ad928SBarry Smith } 5274b9ad928SBarry Smith PetscFunctionReturn(0); 5284b9ad928SBarry Smith } 5294b9ad928SBarry Smith 5304b9ad928SBarry Smith #undef __FUNCT__ 5314b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApply" 5324b9ad928SBarry Smith /*@C 5334b9ad928SBarry Smith PCShellSetApply - Sets routine to use as preconditioner. 5344b9ad928SBarry Smith 5354b9ad928SBarry Smith Collective on PC 5364b9ad928SBarry Smith 5374b9ad928SBarry Smith Input Parameters: 5384b9ad928SBarry Smith + pc - the preconditioner context 539be29d3c6SBarry Smith - apply - the application-provided preconditioning routine 5404b9ad928SBarry Smith 5414b9ad928SBarry Smith Calling sequence of apply: 5424b9ad928SBarry Smith .vb 54313f74950SBarry Smith PetscErrorCode apply (void *ptr,Vec xin,Vec xout) 5444b9ad928SBarry Smith .ve 5454b9ad928SBarry Smith 5464b9ad928SBarry Smith + ptr - the application context 5474b9ad928SBarry Smith . xin - input vector 5484b9ad928SBarry Smith - xout - output vector 5494b9ad928SBarry Smith 5504b9ad928SBarry Smith Level: developer 5514b9ad928SBarry Smith 5524b9ad928SBarry Smith .keywords: PC, shell, set, apply, user-provided 5534b9ad928SBarry Smith 5542bb17772SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose(), PCShellSetContext(), PCShellSetApplyBA() 5554b9ad928SBarry Smith @*/ 556be29d3c6SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApply(PC pc,PetscErrorCode (*apply)(void*,Vec,Vec)) 5574b9ad928SBarry Smith { 558be29d3c6SBarry Smith PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*,Vec,Vec)); 5594b9ad928SBarry Smith 5604b9ad928SBarry Smith PetscFunctionBegin; 5614482741eSBarry Smith PetscValidHeaderSpecific(pc,PC_COOKIE,1); 5624b9ad928SBarry Smith ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetApply_C",(void (**)(void))&f);CHKERRQ(ierr); 5634b9ad928SBarry Smith if (f) { 564be29d3c6SBarry Smith ierr = (*f)(pc,apply);CHKERRQ(ierr); 5654b9ad928SBarry Smith } 5664b9ad928SBarry Smith PetscFunctionReturn(0); 5674b9ad928SBarry Smith } 5684b9ad928SBarry Smith 5694b9ad928SBarry Smith #undef __FUNCT__ 5702bb17772SBarry Smith #define __FUNCT__ "PCShellSetApplyBA" 5712bb17772SBarry Smith /*@C 5722bb17772SBarry Smith PCShellSetApplyBA - Sets routine to use as preconditioner times operator. 5732bb17772SBarry Smith 5742bb17772SBarry Smith Collective on PC 5752bb17772SBarry Smith 5762bb17772SBarry Smith Input Parameters: 5772bb17772SBarry Smith + pc - the preconditioner context 5782bb17772SBarry Smith - applyBA - the application-provided BA routine 5792bb17772SBarry Smith 5802bb17772SBarry Smith Calling sequence of apply: 5812bb17772SBarry Smith .vb 5822bb17772SBarry Smith PetscErrorCode applyBA (void *ptr,Vec xin,Vec xout) 5832bb17772SBarry Smith .ve 5842bb17772SBarry Smith 5852bb17772SBarry Smith + ptr - the application context 5862bb17772SBarry Smith . xin - input vector 5872bb17772SBarry Smith - xout - output vector 5882bb17772SBarry Smith 5892bb17772SBarry Smith Level: developer 5902bb17772SBarry Smith 5912bb17772SBarry Smith .keywords: PC, shell, set, apply, user-provided 5922bb17772SBarry Smith 5932bb17772SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose(), PCShellSetContext(), PCShellSetApply() 5942bb17772SBarry Smith @*/ 5952bb17772SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApplyBA(PC pc,PetscErrorCode (*applyBA)(void*,PCSide,Vec,Vec,Vec)) 5962bb17772SBarry Smith { 5972bb17772SBarry Smith PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*,PCSide,Vec,Vec,Vec)); 5982bb17772SBarry Smith 5992bb17772SBarry Smith PetscFunctionBegin; 6002bb17772SBarry Smith PetscValidHeaderSpecific(pc,PC_COOKIE,1); 6012bb17772SBarry Smith ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetApplyBA_C",(void (**)(void))&f);CHKERRQ(ierr); 6022bb17772SBarry Smith if (f) { 6032bb17772SBarry Smith ierr = (*f)(pc,applyBA);CHKERRQ(ierr); 6042bb17772SBarry Smith } 6052bb17772SBarry Smith PetscFunctionReturn(0); 6062bb17772SBarry Smith } 6072bb17772SBarry Smith 6082bb17772SBarry Smith #undef __FUNCT__ 6094b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApplyTranspose" 6104b9ad928SBarry Smith /*@C 6114b9ad928SBarry Smith PCShellSetApplyTranspose - Sets routine to use as preconditioner transpose. 6124b9ad928SBarry Smith 6134b9ad928SBarry Smith Collective on PC 6144b9ad928SBarry Smith 6154b9ad928SBarry Smith Input Parameters: 6164b9ad928SBarry Smith + pc - the preconditioner context 6174b9ad928SBarry Smith - apply - the application-provided preconditioning transpose routine 6184b9ad928SBarry Smith 6194b9ad928SBarry Smith Calling sequence of apply: 6204b9ad928SBarry Smith .vb 62113f74950SBarry Smith PetscErrorCode applytranspose (void *ptr,Vec xin,Vec xout) 6224b9ad928SBarry Smith .ve 6234b9ad928SBarry Smith 6244b9ad928SBarry Smith + ptr - the application context 6254b9ad928SBarry Smith . xin - input vector 6264b9ad928SBarry Smith - xout - output vector 6274b9ad928SBarry Smith 6284b9ad928SBarry Smith Level: developer 6294b9ad928SBarry Smith 6304b9ad928SBarry Smith Notes: 6314b9ad928SBarry Smith Uses the same context variable as PCShellSetApply(). 6324b9ad928SBarry Smith 6334b9ad928SBarry Smith .keywords: PC, shell, set, apply, user-provided 6344b9ad928SBarry Smith 6352bb17772SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApply(), PCSetContext(), PCShellSetApplyBA() 6364b9ad928SBarry Smith @*/ 637dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApplyTranspose(PC pc,PetscErrorCode (*applytranspose)(void*,Vec,Vec)) 6384b9ad928SBarry Smith { 6396849ba73SBarry Smith PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*,Vec,Vec)); 6404b9ad928SBarry Smith 6414b9ad928SBarry Smith PetscFunctionBegin; 6424482741eSBarry Smith PetscValidHeaderSpecific(pc,PC_COOKIE,1); 6434b9ad928SBarry Smith ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetApplyTranspose_C",(void (**)(void))&f);CHKERRQ(ierr); 6444b9ad928SBarry Smith if (f) { 6454b9ad928SBarry Smith ierr = (*f)(pc,applytranspose);CHKERRQ(ierr); 6464b9ad928SBarry Smith } 6474b9ad928SBarry Smith PetscFunctionReturn(0); 6484b9ad928SBarry Smith } 6494b9ad928SBarry Smith 6504b9ad928SBarry Smith #undef __FUNCT__ 6517cdd61b2SBarry Smith #define __FUNCT__ "PCShellSetPreSolve" 6527cdd61b2SBarry Smith /*@C 6537cdd61b2SBarry Smith PCShellSetPreSolve - Sets routine to apply to the operators/vectors before a KSPSolve() is 6547cdd61b2SBarry Smith applied. This usually does something like scale the linear system in some application 6557cdd61b2SBarry Smith specific way. 6567cdd61b2SBarry Smith 6577cdd61b2SBarry Smith Collective on PC 6587cdd61b2SBarry Smith 6597cdd61b2SBarry Smith Input Parameters: 6607cdd61b2SBarry Smith + pc - the preconditioner context 6617cdd61b2SBarry Smith - presolve - the application-provided presolve routine 6627cdd61b2SBarry Smith 6637cdd61b2SBarry Smith Calling sequence of presolve: 6647cdd61b2SBarry Smith .vb 6657cdd61b2SBarry Smith PetscErrorCode presolve (void *ptr,KSP ksp,Vec b,Vec x) 6667cdd61b2SBarry Smith .ve 6677cdd61b2SBarry Smith 6687cdd61b2SBarry Smith + ptr - the application context 6697cdd61b2SBarry Smith . xin - input vector 6707cdd61b2SBarry Smith - xout - output vector 6717cdd61b2SBarry Smith 6727cdd61b2SBarry Smith Level: developer 6737cdd61b2SBarry Smith 6747cdd61b2SBarry Smith .keywords: PC, shell, set, apply, user-provided 6757cdd61b2SBarry Smith 676be29d3c6SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose(), PCShellSetPostSolve(), PCShellSetContext() 6777cdd61b2SBarry Smith @*/ 6787cdd61b2SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetPreSolve(PC pc,PetscErrorCode (*presolve)(void*,KSP,Vec,Vec)) 6797cdd61b2SBarry Smith { 6807cdd61b2SBarry Smith PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*,KSP,Vec,Vec)); 6817cdd61b2SBarry Smith 6827cdd61b2SBarry Smith PetscFunctionBegin; 6837cdd61b2SBarry Smith PetscValidHeaderSpecific(pc,PC_COOKIE,1); 6847cdd61b2SBarry Smith ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetPreSolve_C",(void (**)(void))&f);CHKERRQ(ierr); 6857cdd61b2SBarry Smith if (f) { 6867cdd61b2SBarry Smith ierr = (*f)(pc,presolve);CHKERRQ(ierr); 6877cdd61b2SBarry Smith } 6887cdd61b2SBarry Smith PetscFunctionReturn(0); 6897cdd61b2SBarry Smith } 6907cdd61b2SBarry Smith 6917cdd61b2SBarry Smith #undef __FUNCT__ 6927cdd61b2SBarry Smith #define __FUNCT__ "PCShellSetPostSolve" 6937cdd61b2SBarry Smith /*@C 6947cdd61b2SBarry Smith PCShellSetPostSolve - Sets routine to apply to the operators/vectors before a KSPSolve() is 6957cdd61b2SBarry Smith applied. This usually does something like scale the linear system in some application 6967cdd61b2SBarry Smith specific way. 6977cdd61b2SBarry Smith 6987cdd61b2SBarry Smith Collective on PC 6997cdd61b2SBarry Smith 7007cdd61b2SBarry Smith Input Parameters: 7017cdd61b2SBarry Smith + pc - the preconditioner context 7027cdd61b2SBarry Smith - postsolve - the application-provided presolve routine 7037cdd61b2SBarry Smith 7047cdd61b2SBarry Smith Calling sequence of postsolve: 7057cdd61b2SBarry Smith .vb 7067cdd61b2SBarry Smith PetscErrorCode postsolve(void *ptr,KSP ksp,Vec b,Vec x) 7077cdd61b2SBarry Smith .ve 7087cdd61b2SBarry Smith 7097cdd61b2SBarry Smith + ptr - the application context 7107cdd61b2SBarry Smith . xin - input vector 7117cdd61b2SBarry Smith - xout - output vector 7127cdd61b2SBarry Smith 7137cdd61b2SBarry Smith Level: developer 7147cdd61b2SBarry Smith 7157cdd61b2SBarry Smith .keywords: PC, shell, set, apply, user-provided 7167cdd61b2SBarry Smith 717be29d3c6SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose(), PCShellSetPreSolve(), PCShellSetContext() 7187cdd61b2SBarry Smith @*/ 7197cdd61b2SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetPostSolve(PC pc,PetscErrorCode (*postsolve)(void*,KSP,Vec,Vec)) 7207cdd61b2SBarry Smith { 7217cdd61b2SBarry Smith PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*,KSP,Vec,Vec)); 7227cdd61b2SBarry Smith 7237cdd61b2SBarry Smith PetscFunctionBegin; 7247cdd61b2SBarry Smith PetscValidHeaderSpecific(pc,PC_COOKIE,1); 7257cdd61b2SBarry Smith ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetPostSolve_C",(void (**)(void))&f);CHKERRQ(ierr); 7267cdd61b2SBarry Smith if (f) { 7277cdd61b2SBarry Smith ierr = (*f)(pc,postsolve);CHKERRQ(ierr); 7287cdd61b2SBarry Smith } 7297cdd61b2SBarry Smith PetscFunctionReturn(0); 7307cdd61b2SBarry Smith } 7317cdd61b2SBarry Smith 7327cdd61b2SBarry Smith #undef __FUNCT__ 7334b9ad928SBarry Smith #define __FUNCT__ "PCShellSetName" 7344b9ad928SBarry Smith /*@C 7354b9ad928SBarry Smith PCShellSetName - Sets an optional name to associate with a shell 7364b9ad928SBarry Smith preconditioner. 7374b9ad928SBarry Smith 7384b9ad928SBarry Smith Not Collective 7394b9ad928SBarry Smith 7404b9ad928SBarry Smith Input Parameters: 7414b9ad928SBarry Smith + pc - the preconditioner context 7424b9ad928SBarry Smith - name - character string describing shell preconditioner 7434b9ad928SBarry Smith 7444b9ad928SBarry Smith Level: developer 7454b9ad928SBarry Smith 7464b9ad928SBarry Smith .keywords: PC, shell, set, name, user-provided 7474b9ad928SBarry Smith 7484b9ad928SBarry Smith .seealso: PCShellGetName() 7494b9ad928SBarry Smith @*/ 750dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetName(PC pc,const char name[]) 7514b9ad928SBarry Smith { 752dfbe8321SBarry Smith PetscErrorCode ierr,(*f)(PC,const char []); 7534b9ad928SBarry Smith 7544b9ad928SBarry Smith PetscFunctionBegin; 7554482741eSBarry Smith PetscValidHeaderSpecific(pc,PC_COOKIE,1); 7564b9ad928SBarry Smith ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetName_C",(void (**)(void))&f);CHKERRQ(ierr); 7574b9ad928SBarry Smith if (f) { 7584b9ad928SBarry Smith ierr = (*f)(pc,name);CHKERRQ(ierr); 7594b9ad928SBarry Smith } 7604b9ad928SBarry Smith PetscFunctionReturn(0); 7614b9ad928SBarry Smith } 7624b9ad928SBarry Smith 7634b9ad928SBarry Smith #undef __FUNCT__ 7644b9ad928SBarry Smith #define __FUNCT__ "PCShellGetName" 7654b9ad928SBarry Smith /*@C 7664b9ad928SBarry Smith PCShellGetName - Gets an optional name that the user has set for a shell 7674b9ad928SBarry Smith preconditioner. 7684b9ad928SBarry Smith 7694b9ad928SBarry Smith Not Collective 7704b9ad928SBarry Smith 7714b9ad928SBarry Smith Input Parameter: 7724b9ad928SBarry Smith . pc - the preconditioner context 7734b9ad928SBarry Smith 7744b9ad928SBarry Smith Output Parameter: 7754b9ad928SBarry Smith . name - character string describing shell preconditioner (you should not free this) 7764b9ad928SBarry Smith 7774b9ad928SBarry Smith Level: developer 7784b9ad928SBarry Smith 7794b9ad928SBarry Smith .keywords: PC, shell, get, name, user-provided 7804b9ad928SBarry Smith 7814b9ad928SBarry Smith .seealso: PCShellSetName() 7824b9ad928SBarry Smith @*/ 783dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellGetName(PC pc,char *name[]) 7844b9ad928SBarry Smith { 785dfbe8321SBarry Smith PetscErrorCode ierr,(*f)(PC,char *[]); 7864b9ad928SBarry Smith 7874b9ad928SBarry Smith PetscFunctionBegin; 7884482741eSBarry Smith PetscValidHeaderSpecific(pc,PC_COOKIE,1); 7894482741eSBarry Smith PetscValidPointer(name,2); 7904b9ad928SBarry Smith ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellGetName_C",(void (**)(void))&f);CHKERRQ(ierr); 7914b9ad928SBarry Smith if (f) { 7924b9ad928SBarry Smith ierr = (*f)(pc,name);CHKERRQ(ierr); 7934b9ad928SBarry Smith } else { 7941302d50aSBarry Smith SETERRQ(PETSC_ERR_ARG_WRONG,"Not shell preconditioner, cannot get name"); 7954b9ad928SBarry Smith } 7964b9ad928SBarry Smith PetscFunctionReturn(0); 7974b9ad928SBarry Smith } 7984b9ad928SBarry Smith 7994b9ad928SBarry Smith #undef __FUNCT__ 8004b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApplyRichardson" 8014b9ad928SBarry Smith /*@C 8024b9ad928SBarry Smith PCShellSetApplyRichardson - Sets routine to use as preconditioner 8034b9ad928SBarry Smith in Richardson iteration. 8044b9ad928SBarry Smith 8054b9ad928SBarry Smith Collective on PC 8064b9ad928SBarry Smith 8074b9ad928SBarry Smith Input Parameters: 8084b9ad928SBarry Smith + pc - the preconditioner context 809be29d3c6SBarry Smith - apply - the application-provided preconditioning routine 8104b9ad928SBarry Smith 8114b9ad928SBarry Smith Calling sequence of apply: 8124b9ad928SBarry Smith .vb 81313f74950SBarry Smith PetscErrorCode apply (void *ptr,Vec b,Vec x,Vec r,PetscReal rtol,PetscReal abstol,PetscReal dtol,PetscInt maxits) 8144b9ad928SBarry Smith .ve 8154b9ad928SBarry Smith 8164b9ad928SBarry Smith + ptr - the application context 8174b9ad928SBarry Smith . b - right-hand-side 8184b9ad928SBarry Smith . x - current iterate 8194b9ad928SBarry Smith . r - work space 8204b9ad928SBarry Smith . rtol - relative tolerance of residual norm to stop at 82170441072SBarry Smith . abstol - absolute tolerance of residual norm to stop at 8224b9ad928SBarry Smith . dtol - if residual norm increases by this factor than return 8234b9ad928SBarry Smith - maxits - number of iterations to run 8244b9ad928SBarry Smith 8254b9ad928SBarry Smith Level: developer 8264b9ad928SBarry Smith 8274b9ad928SBarry Smith .keywords: PC, shell, set, apply, Richardson, user-provided 8284b9ad928SBarry Smith 829be29d3c6SBarry Smith .seealso: PCShellSetApply(), PCShellSetContext() 8304b9ad928SBarry Smith @*/ 831be29d3c6SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApplyRichardson(PC pc,PetscErrorCode (*apply)(void*,Vec,Vec,Vec,PetscReal,PetscReal,PetscReal,PetscInt)) 8324b9ad928SBarry Smith { 833be29d3c6SBarry Smith PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*,Vec,Vec,Vec,PetscReal,PetscReal,PetscReal,PetscInt)); 8344b9ad928SBarry Smith 8354b9ad928SBarry Smith PetscFunctionBegin; 8364482741eSBarry Smith PetscValidHeaderSpecific(pc,PC_COOKIE,1); 8374b9ad928SBarry Smith ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetApplyRichardson_C",(void (**)(void))&f);CHKERRQ(ierr); 8384b9ad928SBarry Smith if (f) { 839be29d3c6SBarry Smith ierr = (*f)(pc,apply);CHKERRQ(ierr); 8404b9ad928SBarry Smith } 8414b9ad928SBarry Smith PetscFunctionReturn(0); 8424b9ad928SBarry Smith } 8434b9ad928SBarry Smith 8444b9ad928SBarry Smith /*MC 8454b9ad928SBarry Smith PCSHELL - Creates a new preconditioner class for use with your 8464b9ad928SBarry Smith own private data storage format. 8474b9ad928SBarry Smith 8484b9ad928SBarry Smith Level: advanced 8494b9ad928SBarry Smith 8504b9ad928SBarry Smith Concepts: providing your own preconditioner 8514b9ad928SBarry Smith 8524b9ad928SBarry Smith Usage: 8536849ba73SBarry Smith $ PetscErrorCode (*mult)(void*,Vec,Vec); 8546849ba73SBarry Smith $ PetscErrorCode (*setup)(void*); 8554b9ad928SBarry Smith $ PCCreate(comm,&pc); 8564b9ad928SBarry Smith $ PCSetType(pc,PCSHELL); 857be29d3c6SBarry Smith $ PCShellSetApply(pc,mult); 8582bb17772SBarry Smith $ PCShellSetApplyBA(pc,mult); (optional) 8592bb17772SBarry Smith $ PCShellSetApplyTranspose(pc,mult); (optional) 860be29d3c6SBarry Smith $ PCShellSetContext(pc,ctx) 8614b9ad928SBarry Smith $ PCShellSetSetUp(pc,setup); (optional) 8624b9ad928SBarry Smith 8634b9ad928SBarry Smith .seealso: PCCreate(), PCSetType(), PCType (for list of available types), PC, 864fd2d0fe1Svictor MATSHELL, PCShellSetSetUp(), PCShellSetApply(), PCShellSetView(), 865fd2d0fe1Svictor PCShellSetApplyTranspose(), PCShellSetName(), PCShellSetApplyRichardson(), 8662bb17772SBarry Smith PCShellGetName(), PCShellSetContext(), PCShellGetContext(), PCShellSetApplyBA() 8674b9ad928SBarry Smith M*/ 8684b9ad928SBarry Smith 8694b9ad928SBarry Smith EXTERN_C_BEGIN 8704b9ad928SBarry Smith #undef __FUNCT__ 8714b9ad928SBarry Smith #define __FUNCT__ "PCCreate_Shell" 872dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCCreate_Shell(PC pc) 8734b9ad928SBarry Smith { 874dfbe8321SBarry Smith PetscErrorCode ierr; 8754b9ad928SBarry Smith PC_Shell *shell; 8764b9ad928SBarry Smith 8774b9ad928SBarry Smith PetscFunctionBegin; 8784b9ad928SBarry Smith pc->ops->destroy = PCDestroy_Shell; 8794b9ad928SBarry Smith ierr = PetscNew(PC_Shell,&shell);CHKERRQ(ierr); 88052e6d16bSBarry Smith ierr = PetscLogObjectMemory(pc,sizeof(PC_Shell));CHKERRQ(ierr); 8814b9ad928SBarry Smith pc->data = (void*)shell; 8824b9ad928SBarry Smith pc->name = 0; 8834b9ad928SBarry Smith 8844b9ad928SBarry Smith pc->ops->apply = PCApply_Shell; 8854b9ad928SBarry Smith pc->ops->view = PCView_Shell; 8864b9ad928SBarry Smith pc->ops->applytranspose = PCApplyTranspose_Shell; 8874b9ad928SBarry Smith pc->ops->applyrichardson = 0; 8884b9ad928SBarry Smith pc->ops->setup = PCSetUp_Shell; 8899bbb2c88SBarry Smith pc->ops->presolve = 0; 8909bbb2c88SBarry Smith pc->ops->postsolve = 0; 8914b9ad928SBarry Smith pc->ops->view = PCView_Shell; 8924b9ad928SBarry Smith 8934b9ad928SBarry Smith shell->apply = 0; 8944b9ad928SBarry Smith shell->applytranspose = 0; 8954b9ad928SBarry Smith shell->name = 0; 8964b9ad928SBarry Smith shell->applyrich = 0; 8977cdd61b2SBarry Smith shell->presolve = 0; 8987cdd61b2SBarry Smith shell->postsolve = 0; 8994b9ad928SBarry Smith shell->ctx = 0; 9004b9ad928SBarry Smith shell->setup = 0; 9014b9ad928SBarry Smith shell->view = 0; 90218be62a5SSatish Balay shell->destroy = 0; 9034b9ad928SBarry Smith 90418be62a5SSatish Balay ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetDestroy_C","PCShellSetDestroy_Shell", 90518be62a5SSatish Balay PCShellSetDestroy_Shell);CHKERRQ(ierr); 9064b9ad928SBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetSetUp_C","PCShellSetSetUp_Shell", 9074b9ad928SBarry Smith PCShellSetSetUp_Shell);CHKERRQ(ierr); 9084b9ad928SBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetApply_C","PCShellSetApply_Shell", 9094b9ad928SBarry Smith PCShellSetApply_Shell);CHKERRQ(ierr); 9102bb17772SBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetApplyBA_C","PCShellSetApplyBA_Shell", 9112bb17772SBarry Smith PCShellSetApplyBA_Shell);CHKERRQ(ierr); 9127cdd61b2SBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetPreSolve_C","PCShellSetPreSolve_Shell", 9137cdd61b2SBarry Smith PCShellSetPreSolve_Shell);CHKERRQ(ierr); 9147cdd61b2SBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetPostSolve_C","PCShellSetPostSolve_Shell", 9157cdd61b2SBarry Smith PCShellSetPostSolve_Shell);CHKERRQ(ierr); 9164b9ad928SBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetView_C","PCShellSetView_Shell", 9174b9ad928SBarry Smith PCShellSetView_Shell);CHKERRQ(ierr); 918be29d3c6SBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetApplyTranspose_C","PCShellSetApplyTranspose_Shell", 9194b9ad928SBarry Smith PCShellSetApplyTranspose_Shell);CHKERRQ(ierr); 9204b9ad928SBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetName_C","PCShellSetName_Shell", 9214b9ad928SBarry Smith PCShellSetName_Shell);CHKERRQ(ierr); 9224b9ad928SBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellGetName_C","PCShellGetName_Shell", 9234b9ad928SBarry Smith PCShellGetName_Shell);CHKERRQ(ierr); 924be29d3c6SBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetApplyRichardson_C","PCShellSetApplyRichardson_Shell", 9254b9ad928SBarry Smith PCShellSetApplyRichardson_Shell);CHKERRQ(ierr); 9264b9ad928SBarry Smith PetscFunctionReturn(0); 9274b9ad928SBarry Smith } 9284b9ad928SBarry Smith EXTERN_C_END 9294b9ad928SBarry Smith 9304b9ad928SBarry Smith 9314b9ad928SBarry Smith 9324b9ad928SBarry Smith 9334b9ad928SBarry Smith 9344b9ad928SBarry Smith 935