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 84b9ad928SBarry Smith #include "src/ksp/pc/pcimpl.h" /*I "petscpc.h" I*/ 93c94ec11SBarry Smith #include "vecimpl.h" 104b9ad928SBarry Smith 11ac226902SBarry Smith EXTERN_C_BEGIN 124b9ad928SBarry Smith typedef struct { 134b9ad928SBarry Smith void *ctx,*ctxrich; /* user provided contexts for preconditioner */ 146849ba73SBarry Smith PetscErrorCode (*setup)(void*); 156849ba73SBarry Smith PetscErrorCode (*apply)(void*,Vec,Vec); 167cdd61b2SBarry Smith PetscErrorCode (*presolve)(void*,KSP,Vec,Vec); 177cdd61b2SBarry Smith PetscErrorCode (*postsolve)(void*,KSP,Vec,Vec); 186849ba73SBarry Smith PetscErrorCode (*view)(void*,PetscViewer); 196849ba73SBarry Smith PetscErrorCode (*applytranspose)(void*,Vec,Vec); 2013f74950SBarry Smith PetscErrorCode (*applyrich)(void*,Vec,Vec,Vec,PetscReal,PetscReal,PetscReal,PetscInt); 214b9ad928SBarry Smith char *name; 224b9ad928SBarry Smith } PC_Shell; 23ac226902SBarry Smith EXTERN_C_END 244b9ad928SBarry Smith 254b9ad928SBarry Smith #undef __FUNCT__ 264b9ad928SBarry Smith #define __FUNCT__ "PCApply_SetUp" 276849ba73SBarry Smith static PetscErrorCode PCSetUp_Shell(PC pc) 284b9ad928SBarry Smith { 294b9ad928SBarry Smith PC_Shell *shell; 30dfbe8321SBarry Smith PetscErrorCode ierr; 314b9ad928SBarry Smith 324b9ad928SBarry Smith PetscFunctionBegin; 334b9ad928SBarry Smith shell = (PC_Shell*)pc->data; 344b9ad928SBarry Smith if (shell->setup) { 354b9ad928SBarry Smith ierr = (*shell->setup)(shell->ctx);CHKERRQ(ierr); 364b9ad928SBarry Smith } 374b9ad928SBarry Smith PetscFunctionReturn(0); 384b9ad928SBarry Smith } 394b9ad928SBarry Smith 404b9ad928SBarry Smith #undef __FUNCT__ 414b9ad928SBarry Smith #define __FUNCT__ "PCApply_Shell" 426849ba73SBarry Smith static PetscErrorCode PCApply_Shell(PC pc,Vec x,Vec y) 434b9ad928SBarry Smith { 444b9ad928SBarry Smith PC_Shell *shell; 45dfbe8321SBarry Smith PetscErrorCode ierr; 464b9ad928SBarry Smith 474b9ad928SBarry Smith PetscFunctionBegin; 484b9ad928SBarry Smith shell = (PC_Shell*)pc->data; 491302d50aSBarry Smith if (!shell->apply) SETERRQ(PETSC_ERR_USER,"No apply() routine provided to Shell PC"); 504b9ad928SBarry Smith ierr = (*shell->apply)(shell->ctx,x,y);CHKERRQ(ierr); 514b9ad928SBarry Smith PetscFunctionReturn(0); 524b9ad928SBarry Smith } 534b9ad928SBarry Smith 544b9ad928SBarry Smith #undef __FUNCT__ 557cdd61b2SBarry Smith #define __FUNCT__ "PCPreSolve_Shell" 567cdd61b2SBarry Smith static PetscErrorCode PCPreSolve_Shell(PC pc,KSP ksp,Vec b,Vec x) 577cdd61b2SBarry Smith { 587cdd61b2SBarry Smith PC_Shell *shell; 597cdd61b2SBarry Smith PetscErrorCode ierr; 607cdd61b2SBarry Smith 617cdd61b2SBarry Smith PetscFunctionBegin; 627cdd61b2SBarry Smith shell = (PC_Shell*)pc->data; 637cdd61b2SBarry Smith if (!shell->apply) SETERRQ(PETSC_ERR_USER,"No presolve() routine provided to Shell PC"); 647cdd61b2SBarry Smith ierr = (*shell->presolve)(shell->ctx,ksp,b,x);CHKERRQ(ierr); 657cdd61b2SBarry Smith PetscFunctionReturn(0); 667cdd61b2SBarry Smith } 677cdd61b2SBarry Smith 687cdd61b2SBarry Smith #undef __FUNCT__ 697cdd61b2SBarry Smith #define __FUNCT__ "PCPostSolve_Shell" 707cdd61b2SBarry Smith static PetscErrorCode PCPostSolve_Shell(PC pc,KSP ksp,Vec b,Vec x) 717cdd61b2SBarry Smith { 727cdd61b2SBarry Smith PC_Shell *shell; 737cdd61b2SBarry Smith PetscErrorCode ierr; 747cdd61b2SBarry Smith 757cdd61b2SBarry Smith PetscFunctionBegin; 767cdd61b2SBarry Smith shell = (PC_Shell*)pc->data; 777cdd61b2SBarry Smith if (!shell->apply) SETERRQ(PETSC_ERR_USER,"No presolve() routine provided to Shell PC"); 787cdd61b2SBarry Smith ierr = (*shell->presolve)(shell->ctx,ksp,b,x);CHKERRQ(ierr); 797cdd61b2SBarry Smith PetscFunctionReturn(0); 807cdd61b2SBarry Smith } 817cdd61b2SBarry Smith 827cdd61b2SBarry Smith #undef __FUNCT__ 834b9ad928SBarry Smith #define __FUNCT__ "PCApplyTranspose_Shell" 846849ba73SBarry Smith static PetscErrorCode PCApplyTranspose_Shell(PC pc,Vec x,Vec y) 854b9ad928SBarry Smith { 864b9ad928SBarry Smith PC_Shell *shell; 87dfbe8321SBarry Smith PetscErrorCode ierr; 884b9ad928SBarry Smith 894b9ad928SBarry Smith PetscFunctionBegin; 904b9ad928SBarry Smith shell = (PC_Shell*)pc->data; 911302d50aSBarry Smith if (!shell->applytranspose) SETERRQ(PETSC_ERR_USER,"No applytranspose() routine provided to Shell PC"); 924b9ad928SBarry Smith ierr = (*shell->applytranspose)(shell->ctx,x,y);CHKERRQ(ierr); 934b9ad928SBarry Smith PetscFunctionReturn(0); 944b9ad928SBarry Smith } 954b9ad928SBarry Smith 964b9ad928SBarry Smith #undef __FUNCT__ 974b9ad928SBarry Smith #define __FUNCT__ "PCApplyRichardson_Shell" 9813f74950SBarry Smith static PetscErrorCode PCApplyRichardson_Shell(PC pc,Vec x,Vec y,Vec w,PetscReal rtol,PetscReal abstol, PetscReal dtol,PetscInt it) 994b9ad928SBarry Smith { 100dfbe8321SBarry Smith PetscErrorCode ierr; 1014b9ad928SBarry Smith PC_Shell *shell; 1024b9ad928SBarry Smith 1034b9ad928SBarry Smith PetscFunctionBegin; 1044b9ad928SBarry Smith shell = (PC_Shell*)pc->data; 10570441072SBarry Smith ierr = (*shell->applyrich)(shell->ctxrich,x,y,w,rtol,abstol,dtol,it);CHKERRQ(ierr); 1064b9ad928SBarry Smith PetscFunctionReturn(0); 1074b9ad928SBarry Smith } 1084b9ad928SBarry Smith 1094b9ad928SBarry Smith #undef __FUNCT__ 1104b9ad928SBarry Smith #define __FUNCT__ "PCDestroy_Shell" 1116849ba73SBarry Smith static PetscErrorCode PCDestroy_Shell(PC pc) 1124b9ad928SBarry Smith { 1134b9ad928SBarry Smith PC_Shell *shell = (PC_Shell*)pc->data; 114dfbe8321SBarry Smith PetscErrorCode ierr; 1154b9ad928SBarry Smith 1164b9ad928SBarry Smith PetscFunctionBegin; 1174b9ad928SBarry Smith if (shell->name) {ierr = PetscFree(shell->name);} 1184b9ad928SBarry Smith ierr = PetscFree(shell);CHKERRQ(ierr); 1194b9ad928SBarry Smith PetscFunctionReturn(0); 1204b9ad928SBarry Smith } 1214b9ad928SBarry Smith 1224b9ad928SBarry Smith #undef __FUNCT__ 1234b9ad928SBarry Smith #define __FUNCT__ "PCView_Shell" 1246849ba73SBarry Smith static PetscErrorCode PCView_Shell(PC pc,PetscViewer viewer) 1254b9ad928SBarry Smith { 1264b9ad928SBarry Smith PC_Shell *shell = (PC_Shell*)pc->data; 127dfbe8321SBarry Smith PetscErrorCode ierr; 12832077d6dSBarry Smith PetscTruth iascii; 1294b9ad928SBarry Smith 1304b9ad928SBarry Smith PetscFunctionBegin; 13132077d6dSBarry Smith ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_ASCII,&iascii);CHKERRQ(ierr); 13232077d6dSBarry Smith if (iascii) { 1334b9ad928SBarry Smith if (shell->name) {ierr = PetscViewerASCIIPrintf(viewer," Shell: %s\n",shell->name);CHKERRQ(ierr);} 1344b9ad928SBarry Smith else {ierr = PetscViewerASCIIPrintf(viewer," Shell: no name\n");CHKERRQ(ierr);} 1354b9ad928SBarry Smith } 1364b9ad928SBarry Smith if (shell->view) { 1374b9ad928SBarry Smith ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 1384b9ad928SBarry Smith ierr = (*shell->view)(shell->ctx,viewer);CHKERRQ(ierr); 1394b9ad928SBarry Smith ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 1404b9ad928SBarry Smith } 1414b9ad928SBarry Smith PetscFunctionReturn(0); 1424b9ad928SBarry Smith } 1434b9ad928SBarry Smith 1444b9ad928SBarry Smith /* ------------------------------------------------------------------------------*/ 1454b9ad928SBarry Smith EXTERN_C_BEGIN 1464b9ad928SBarry Smith #undef __FUNCT__ 1474b9ad928SBarry Smith #define __FUNCT__ "PCShellSetSetUp_Shell" 148dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetSetUp_Shell(PC pc, PetscErrorCode (*setup)(void*)) 1494b9ad928SBarry Smith { 1504b9ad928SBarry Smith PC_Shell *shell; 1514b9ad928SBarry Smith 1524b9ad928SBarry Smith PetscFunctionBegin; 1534b9ad928SBarry Smith shell = (PC_Shell*)pc->data; 1544b9ad928SBarry Smith shell->setup = setup; 1554b9ad928SBarry Smith PetscFunctionReturn(0); 1564b9ad928SBarry Smith } 1574b9ad928SBarry Smith EXTERN_C_END 1584b9ad928SBarry Smith 1594b9ad928SBarry Smith EXTERN_C_BEGIN 1604b9ad928SBarry Smith #undef __FUNCT__ 1614b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApply_Shell" 162dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApply_Shell(PC pc,PetscErrorCode (*apply)(void*,Vec,Vec),void *ptr) 1634b9ad928SBarry Smith { 1644b9ad928SBarry Smith PC_Shell *shell; 1654b9ad928SBarry Smith 1664b9ad928SBarry Smith PetscFunctionBegin; 1674b9ad928SBarry Smith shell = (PC_Shell*)pc->data; 1684b9ad928SBarry Smith shell->apply = apply; 1694b9ad928SBarry Smith shell->ctx = ptr; 1704b9ad928SBarry Smith PetscFunctionReturn(0); 1714b9ad928SBarry Smith } 1724b9ad928SBarry Smith EXTERN_C_END 1734b9ad928SBarry Smith 1744b9ad928SBarry Smith EXTERN_C_BEGIN 1754b9ad928SBarry Smith #undef __FUNCT__ 1767cdd61b2SBarry Smith #define __FUNCT__ "PCShellSetPreSolve_Shell" 1777cdd61b2SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetPreSolve_Shell(PC pc,PetscErrorCode (*presolve)(void*,KSP,Vec,Vec),void *ptr) 1787cdd61b2SBarry Smith { 1797cdd61b2SBarry Smith PC_Shell *shell; 1807cdd61b2SBarry Smith 1817cdd61b2SBarry Smith PetscFunctionBegin; 1827cdd61b2SBarry Smith shell = (PC_Shell*)pc->data; 1837cdd61b2SBarry Smith shell->presolve = presolve; 184*9bbb2c88SBarry Smith if (presolve) { 185*9bbb2c88SBarry Smith pc->ops->presolve = PCPreSolve_Shell; 186*9bbb2c88SBarry Smith } else { 187*9bbb2c88SBarry Smith pc->ops->presolve = 0; 188*9bbb2c88SBarry Smith } 1897cdd61b2SBarry Smith PetscFunctionReturn(0); 1907cdd61b2SBarry Smith } 1917cdd61b2SBarry Smith EXTERN_C_END 1927cdd61b2SBarry Smith 1937cdd61b2SBarry Smith EXTERN_C_BEGIN 1947cdd61b2SBarry Smith #undef __FUNCT__ 1957cdd61b2SBarry Smith #define __FUNCT__ "PCShellSetPostSolve_Shell" 1967cdd61b2SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetPostSolve_Shell(PC pc,PetscErrorCode (*postsolve)(void*,KSP,Vec,Vec),void *ptr) 1977cdd61b2SBarry Smith { 1987cdd61b2SBarry Smith PC_Shell *shell; 1997cdd61b2SBarry Smith 2007cdd61b2SBarry Smith PetscFunctionBegin; 2017cdd61b2SBarry Smith shell = (PC_Shell*)pc->data; 2027cdd61b2SBarry Smith shell->postsolve = postsolve; 203*9bbb2c88SBarry Smith if (postsolve) { 204*9bbb2c88SBarry Smith pc->ops->postsolve = PCPostSolve_Shell; 205*9bbb2c88SBarry Smith } else { 206*9bbb2c88SBarry Smith pc->ops->postsolve = 0; 207*9bbb2c88SBarry Smith } 2087cdd61b2SBarry Smith PetscFunctionReturn(0); 2097cdd61b2SBarry Smith } 2107cdd61b2SBarry Smith EXTERN_C_END 2117cdd61b2SBarry Smith 2127cdd61b2SBarry Smith EXTERN_C_BEGIN 2137cdd61b2SBarry Smith #undef __FUNCT__ 2144b9ad928SBarry Smith #define __FUNCT__ "PCShellSetView_Shell" 215dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetView_Shell(PC pc,PetscErrorCode (*view)(void*,PetscViewer)) 2164b9ad928SBarry Smith { 2174b9ad928SBarry Smith PC_Shell *shell; 2184b9ad928SBarry Smith 2194b9ad928SBarry Smith PetscFunctionBegin; 2204b9ad928SBarry Smith shell = (PC_Shell*)pc->data; 2214b9ad928SBarry Smith shell->view = view; 2224b9ad928SBarry Smith PetscFunctionReturn(0); 2234b9ad928SBarry Smith } 2244b9ad928SBarry Smith EXTERN_C_END 2254b9ad928SBarry Smith 2264b9ad928SBarry Smith EXTERN_C_BEGIN 2274b9ad928SBarry Smith #undef __FUNCT__ 2284b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApplyTranspose_Shell" 229dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApplyTranspose_Shell(PC pc,PetscErrorCode (*applytranspose)(void*,Vec,Vec)) 2304b9ad928SBarry Smith { 2314b9ad928SBarry Smith PC_Shell *shell; 2324b9ad928SBarry Smith 2334b9ad928SBarry Smith PetscFunctionBegin; 2344b9ad928SBarry Smith shell = (PC_Shell*)pc->data; 2354b9ad928SBarry Smith shell->applytranspose = applytranspose; 2364b9ad928SBarry Smith PetscFunctionReturn(0); 2374b9ad928SBarry Smith } 2384b9ad928SBarry Smith EXTERN_C_END 2394b9ad928SBarry Smith 2404b9ad928SBarry Smith EXTERN_C_BEGIN 2414b9ad928SBarry Smith #undef __FUNCT__ 2424b9ad928SBarry Smith #define __FUNCT__ "PCShellSetName_Shell" 243dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetName_Shell(PC pc,const char name[]) 2444b9ad928SBarry Smith { 2454b9ad928SBarry Smith PC_Shell *shell; 246dfbe8321SBarry Smith PetscErrorCode ierr; 2474b9ad928SBarry Smith 2484b9ad928SBarry Smith PetscFunctionBegin; 2494b9ad928SBarry Smith shell = (PC_Shell*)pc->data; 2504b9ad928SBarry Smith ierr = PetscStrallocpy(name,&shell->name);CHKERRQ(ierr); 2514b9ad928SBarry Smith PetscFunctionReturn(0); 2524b9ad928SBarry Smith } 2534b9ad928SBarry Smith EXTERN_C_END 2544b9ad928SBarry Smith 2554b9ad928SBarry Smith EXTERN_C_BEGIN 2564b9ad928SBarry Smith #undef __FUNCT__ 2574b9ad928SBarry Smith #define __FUNCT__ "PCShellGetName_Shell" 258dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellGetName_Shell(PC pc,char *name[]) 2594b9ad928SBarry Smith { 2604b9ad928SBarry Smith PC_Shell *shell; 2614b9ad928SBarry Smith 2624b9ad928SBarry Smith PetscFunctionBegin; 2634b9ad928SBarry Smith shell = (PC_Shell*)pc->data; 2644b9ad928SBarry Smith *name = shell->name; 2654b9ad928SBarry Smith PetscFunctionReturn(0); 2664b9ad928SBarry Smith } 2674b9ad928SBarry Smith EXTERN_C_END 2684b9ad928SBarry Smith 2694b9ad928SBarry Smith EXTERN_C_BEGIN 2704b9ad928SBarry Smith #undef __FUNCT__ 2714b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApplyRichardson_Shell" 272dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApplyRichardson_Shell(PC pc,PetscErrorCode (*apply)(void*,Vec,Vec,Vec,PetscReal,PetscReal,PetscReal,PetscInt),void *ptr) 2734b9ad928SBarry Smith { 2744b9ad928SBarry Smith PC_Shell *shell; 2754b9ad928SBarry Smith 2764b9ad928SBarry Smith PetscFunctionBegin; 2774b9ad928SBarry Smith shell = (PC_Shell*)pc->data; 2784b9ad928SBarry Smith pc->ops->applyrichardson = PCApplyRichardson_Shell; 2794b9ad928SBarry Smith shell->applyrich = apply; 2804b9ad928SBarry Smith shell->ctxrich = ptr; 2814b9ad928SBarry Smith PetscFunctionReturn(0); 2824b9ad928SBarry Smith } 2834b9ad928SBarry Smith EXTERN_C_END 2844b9ad928SBarry Smith 2854b9ad928SBarry Smith /* -------------------------------------------------------------------------------*/ 2864b9ad928SBarry Smith 2874b9ad928SBarry Smith #undef __FUNCT__ 2884b9ad928SBarry Smith #define __FUNCT__ "PCShellSetSetUp" 2894b9ad928SBarry Smith /*@C 2904b9ad928SBarry Smith PCShellSetSetUp - Sets routine to use to "setup" the preconditioner whenever the 2914b9ad928SBarry Smith matrix operator is changed. 2924b9ad928SBarry Smith 2934b9ad928SBarry Smith Collective on PC 2944b9ad928SBarry Smith 2954b9ad928SBarry Smith Input Parameters: 2964b9ad928SBarry Smith + pc - the preconditioner context 2974b9ad928SBarry Smith . setup - the application-provided setup routine 2984b9ad928SBarry Smith 2994b9ad928SBarry Smith Calling sequence of setup: 3004b9ad928SBarry Smith .vb 30113f74950SBarry Smith PetscErrorCode setup (void *ptr) 3024b9ad928SBarry Smith .ve 3034b9ad928SBarry Smith 3044b9ad928SBarry Smith . ptr - the application context 3054b9ad928SBarry Smith 3064b9ad928SBarry Smith Level: developer 3074b9ad928SBarry Smith 3084b9ad928SBarry Smith .keywords: PC, shell, set, setup, user-provided 3094b9ad928SBarry Smith 3104b9ad928SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetApply() 3114b9ad928SBarry Smith @*/ 312dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetSetUp(PC pc,PetscErrorCode (*setup)(void*)) 3134b9ad928SBarry Smith { 3146849ba73SBarry Smith PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*)); 3154b9ad928SBarry Smith 3164b9ad928SBarry Smith PetscFunctionBegin; 3174482741eSBarry Smith PetscValidHeaderSpecific(pc,PC_COOKIE,1); 3184b9ad928SBarry Smith ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetSetUp_C",(void (**)(void))&f);CHKERRQ(ierr); 3194b9ad928SBarry Smith if (f) { 3204b9ad928SBarry Smith ierr = (*f)(pc,setup);CHKERRQ(ierr); 3214b9ad928SBarry Smith } 3224b9ad928SBarry Smith PetscFunctionReturn(0); 3234b9ad928SBarry Smith } 3244b9ad928SBarry Smith 3254b9ad928SBarry Smith 3264b9ad928SBarry Smith #undef __FUNCT__ 3274b9ad928SBarry Smith #define __FUNCT__ "PCShellSetView" 3284b9ad928SBarry Smith /*@C 3294b9ad928SBarry Smith PCShellSetView - Sets routine to use as viewer of shell preconditioner 3304b9ad928SBarry Smith 3314b9ad928SBarry Smith Collective on PC 3324b9ad928SBarry Smith 3334b9ad928SBarry Smith Input Parameters: 3344b9ad928SBarry Smith + pc - the preconditioner context 3354b9ad928SBarry Smith - view - the application-provided view routine 3364b9ad928SBarry Smith 3374b9ad928SBarry Smith Calling sequence of apply: 3384b9ad928SBarry Smith .vb 33913f74950SBarry Smith PetscErrorCode view(void *ptr,PetscViewer v) 3404b9ad928SBarry Smith .ve 3414b9ad928SBarry Smith 3424b9ad928SBarry Smith + ptr - the application context 3434b9ad928SBarry Smith - v - viewer 3444b9ad928SBarry Smith 3454b9ad928SBarry Smith Level: developer 3464b9ad928SBarry Smith 3474b9ad928SBarry Smith .keywords: PC, shell, set, apply, user-provided 3484b9ad928SBarry Smith 3494b9ad928SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose() 3504b9ad928SBarry Smith @*/ 351dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetView(PC pc,PetscErrorCode (*view)(void*,PetscViewer)) 3524b9ad928SBarry Smith { 3536849ba73SBarry Smith PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*,PetscViewer)); 3544b9ad928SBarry Smith 3554b9ad928SBarry Smith PetscFunctionBegin; 3564482741eSBarry Smith PetscValidHeaderSpecific(pc,PC_COOKIE,1); 3574b9ad928SBarry Smith ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetView_C",(void (**)(void))&f);CHKERRQ(ierr); 3584b9ad928SBarry Smith if (f) { 3594b9ad928SBarry Smith ierr = (*f)(pc,view);CHKERRQ(ierr); 3604b9ad928SBarry Smith } 3614b9ad928SBarry Smith PetscFunctionReturn(0); 3624b9ad928SBarry Smith } 3634b9ad928SBarry Smith 3644b9ad928SBarry Smith #undef __FUNCT__ 3654b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApply" 3664b9ad928SBarry Smith /*@C 3674b9ad928SBarry Smith PCShellSetApply - Sets routine to use as preconditioner. 3684b9ad928SBarry Smith 3694b9ad928SBarry Smith Collective on PC 3704b9ad928SBarry Smith 3714b9ad928SBarry Smith Input Parameters: 3724b9ad928SBarry Smith + pc - the preconditioner context 3734b9ad928SBarry Smith . apply - the application-provided preconditioning routine 3744b9ad928SBarry Smith - ptr - pointer to data needed by this routine 3754b9ad928SBarry Smith 3764b9ad928SBarry Smith Calling sequence of apply: 3774b9ad928SBarry Smith .vb 37813f74950SBarry Smith PetscErrorCode apply (void *ptr,Vec xin,Vec xout) 3794b9ad928SBarry Smith .ve 3804b9ad928SBarry Smith 3814b9ad928SBarry Smith + ptr - the application context 3824b9ad928SBarry Smith . xin - input vector 3834b9ad928SBarry Smith - xout - output vector 3844b9ad928SBarry Smith 3854b9ad928SBarry Smith Level: developer 3864b9ad928SBarry Smith 3874b9ad928SBarry Smith .keywords: PC, shell, set, apply, user-provided 3884b9ad928SBarry Smith 3894b9ad928SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose() 3904b9ad928SBarry Smith @*/ 391dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApply(PC pc,PetscErrorCode (*apply)(void*,Vec,Vec),void *ptr) 3924b9ad928SBarry Smith { 3936849ba73SBarry Smith PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*,Vec,Vec),void *); 3944b9ad928SBarry Smith 3954b9ad928SBarry Smith PetscFunctionBegin; 3964482741eSBarry Smith PetscValidHeaderSpecific(pc,PC_COOKIE,1); 3974b9ad928SBarry Smith ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetApply_C",(void (**)(void))&f);CHKERRQ(ierr); 3984b9ad928SBarry Smith if (f) { 3994b9ad928SBarry Smith ierr = (*f)(pc,apply,ptr);CHKERRQ(ierr); 4004b9ad928SBarry Smith } 4014b9ad928SBarry Smith PetscFunctionReturn(0); 4024b9ad928SBarry Smith } 4034b9ad928SBarry Smith 4044b9ad928SBarry Smith #undef __FUNCT__ 4054b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApplyTranspose" 4064b9ad928SBarry Smith /*@C 4074b9ad928SBarry Smith PCShellSetApplyTranspose - Sets routine to use as preconditioner transpose. 4084b9ad928SBarry Smith 4094b9ad928SBarry Smith Collective on PC 4104b9ad928SBarry Smith 4114b9ad928SBarry Smith Input Parameters: 4124b9ad928SBarry Smith + pc - the preconditioner context 4134b9ad928SBarry Smith - apply - the application-provided preconditioning transpose routine 4144b9ad928SBarry Smith 4154b9ad928SBarry Smith Calling sequence of apply: 4164b9ad928SBarry Smith .vb 41713f74950SBarry Smith PetscErrorCode applytranspose (void *ptr,Vec xin,Vec xout) 4184b9ad928SBarry Smith .ve 4194b9ad928SBarry Smith 4204b9ad928SBarry Smith + ptr - the application context 4214b9ad928SBarry Smith . xin - input vector 4224b9ad928SBarry Smith - xout - output vector 4234b9ad928SBarry Smith 4244b9ad928SBarry Smith Level: developer 4254b9ad928SBarry Smith 4264b9ad928SBarry Smith Notes: 4274b9ad928SBarry Smith Uses the same context variable as PCShellSetApply(). 4284b9ad928SBarry Smith 4294b9ad928SBarry Smith .keywords: PC, shell, set, apply, user-provided 4304b9ad928SBarry Smith 4314b9ad928SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApply() 4324b9ad928SBarry Smith @*/ 433dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApplyTranspose(PC pc,PetscErrorCode (*applytranspose)(void*,Vec,Vec)) 4344b9ad928SBarry Smith { 4356849ba73SBarry Smith PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*,Vec,Vec)); 4364b9ad928SBarry Smith 4374b9ad928SBarry Smith PetscFunctionBegin; 4384482741eSBarry Smith PetscValidHeaderSpecific(pc,PC_COOKIE,1); 4394b9ad928SBarry Smith ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetApplyTranspose_C",(void (**)(void))&f);CHKERRQ(ierr); 4404b9ad928SBarry Smith if (f) { 4414b9ad928SBarry Smith ierr = (*f)(pc,applytranspose);CHKERRQ(ierr); 4424b9ad928SBarry Smith } 4434b9ad928SBarry Smith PetscFunctionReturn(0); 4444b9ad928SBarry Smith } 4454b9ad928SBarry Smith 4464b9ad928SBarry Smith #undef __FUNCT__ 4477cdd61b2SBarry Smith #define __FUNCT__ "PCShellSetPreSolve" 4487cdd61b2SBarry Smith /*@C 4497cdd61b2SBarry Smith PCShellSetPreSolve - Sets routine to apply to the operators/vectors before a KSPSolve() is 4507cdd61b2SBarry Smith applied. This usually does something like scale the linear system in some application 4517cdd61b2SBarry Smith specific way. 4527cdd61b2SBarry Smith 4537cdd61b2SBarry Smith Collective on PC 4547cdd61b2SBarry Smith 4557cdd61b2SBarry Smith Input Parameters: 4567cdd61b2SBarry Smith + pc - the preconditioner context 4577cdd61b2SBarry Smith - presolve - the application-provided presolve routine 4587cdd61b2SBarry Smith 4597cdd61b2SBarry Smith Calling sequence of presolve: 4607cdd61b2SBarry Smith .vb 4617cdd61b2SBarry Smith PetscErrorCode presolve (void *ptr,KSP ksp,Vec b,Vec x) 4627cdd61b2SBarry Smith .ve 4637cdd61b2SBarry Smith 4647cdd61b2SBarry Smith + ptr - the application context 4657cdd61b2SBarry Smith . xin - input vector 4667cdd61b2SBarry Smith - xout - output vector 4677cdd61b2SBarry Smith 4687cdd61b2SBarry Smith Level: developer 4697cdd61b2SBarry Smith 4707cdd61b2SBarry Smith .keywords: PC, shell, set, apply, user-provided 4717cdd61b2SBarry Smith 4727cdd61b2SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose(), PCShellSetPostSolve() 4737cdd61b2SBarry Smith @*/ 4747cdd61b2SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetPreSolve(PC pc,PetscErrorCode (*presolve)(void*,KSP,Vec,Vec)) 4757cdd61b2SBarry Smith { 4767cdd61b2SBarry Smith PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*,KSP,Vec,Vec)); 4777cdd61b2SBarry Smith 4787cdd61b2SBarry Smith PetscFunctionBegin; 4797cdd61b2SBarry Smith PetscValidHeaderSpecific(pc,PC_COOKIE,1); 4807cdd61b2SBarry Smith ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetPreSolve_C",(void (**)(void))&f);CHKERRQ(ierr); 4817cdd61b2SBarry Smith if (f) { 4827cdd61b2SBarry Smith ierr = (*f)(pc,presolve);CHKERRQ(ierr); 4837cdd61b2SBarry Smith } 4847cdd61b2SBarry Smith PetscFunctionReturn(0); 4857cdd61b2SBarry Smith } 4867cdd61b2SBarry Smith 4877cdd61b2SBarry Smith #undef __FUNCT__ 4887cdd61b2SBarry Smith #define __FUNCT__ "PCShellSetPostSolve" 4897cdd61b2SBarry Smith /*@C 4907cdd61b2SBarry Smith PCShellSetPostSolve - Sets routine to apply to the operators/vectors before a KSPSolve() is 4917cdd61b2SBarry Smith applied. This usually does something like scale the linear system in some application 4927cdd61b2SBarry Smith specific way. 4937cdd61b2SBarry Smith 4947cdd61b2SBarry Smith Collective on PC 4957cdd61b2SBarry Smith 4967cdd61b2SBarry Smith Input Parameters: 4977cdd61b2SBarry Smith + pc - the preconditioner context 4987cdd61b2SBarry Smith - postsolve - the application-provided presolve routine 4997cdd61b2SBarry Smith 5007cdd61b2SBarry Smith Calling sequence of postsolve: 5017cdd61b2SBarry Smith .vb 5027cdd61b2SBarry Smith PetscErrorCode postsolve(void *ptr,KSP ksp,Vec b,Vec x) 5037cdd61b2SBarry Smith .ve 5047cdd61b2SBarry Smith 5057cdd61b2SBarry Smith + ptr - the application context 5067cdd61b2SBarry Smith . xin - input vector 5077cdd61b2SBarry Smith - xout - output vector 5087cdd61b2SBarry Smith 5097cdd61b2SBarry Smith Level: developer 5107cdd61b2SBarry Smith 5117cdd61b2SBarry Smith .keywords: PC, shell, set, apply, user-provided 5127cdd61b2SBarry Smith 5137cdd61b2SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose(), PCShellSetPreSolve() 5147cdd61b2SBarry Smith @*/ 5157cdd61b2SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetPostSolve(PC pc,PetscErrorCode (*postsolve)(void*,KSP,Vec,Vec)) 5167cdd61b2SBarry Smith { 5177cdd61b2SBarry Smith PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*,KSP,Vec,Vec)); 5187cdd61b2SBarry Smith 5197cdd61b2SBarry Smith PetscFunctionBegin; 5207cdd61b2SBarry Smith PetscValidHeaderSpecific(pc,PC_COOKIE,1); 5217cdd61b2SBarry Smith ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetPostSolve_C",(void (**)(void))&f);CHKERRQ(ierr); 5227cdd61b2SBarry Smith if (f) { 5237cdd61b2SBarry Smith ierr = (*f)(pc,postsolve);CHKERRQ(ierr); 5247cdd61b2SBarry Smith } 5257cdd61b2SBarry Smith PetscFunctionReturn(0); 5267cdd61b2SBarry Smith } 5277cdd61b2SBarry Smith 5287cdd61b2SBarry Smith #undef __FUNCT__ 5294b9ad928SBarry Smith #define __FUNCT__ "PCShellSetName" 5304b9ad928SBarry Smith /*@C 5314b9ad928SBarry Smith PCShellSetName - Sets an optional name to associate with a shell 5324b9ad928SBarry Smith preconditioner. 5334b9ad928SBarry Smith 5344b9ad928SBarry Smith Not Collective 5354b9ad928SBarry Smith 5364b9ad928SBarry Smith Input Parameters: 5374b9ad928SBarry Smith + pc - the preconditioner context 5384b9ad928SBarry Smith - name - character string describing shell preconditioner 5394b9ad928SBarry Smith 5404b9ad928SBarry Smith Level: developer 5414b9ad928SBarry Smith 5424b9ad928SBarry Smith .keywords: PC, shell, set, name, user-provided 5434b9ad928SBarry Smith 5444b9ad928SBarry Smith .seealso: PCShellGetName() 5454b9ad928SBarry Smith @*/ 546dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetName(PC pc,const char name[]) 5474b9ad928SBarry Smith { 548dfbe8321SBarry Smith PetscErrorCode ierr,(*f)(PC,const char []); 5494b9ad928SBarry Smith 5504b9ad928SBarry Smith PetscFunctionBegin; 5514482741eSBarry Smith PetscValidHeaderSpecific(pc,PC_COOKIE,1); 5524b9ad928SBarry Smith ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetName_C",(void (**)(void))&f);CHKERRQ(ierr); 5534b9ad928SBarry Smith if (f) { 5544b9ad928SBarry Smith ierr = (*f)(pc,name);CHKERRQ(ierr); 5554b9ad928SBarry Smith } 5564b9ad928SBarry Smith PetscFunctionReturn(0); 5574b9ad928SBarry Smith } 5584b9ad928SBarry Smith 5594b9ad928SBarry Smith #undef __FUNCT__ 5604b9ad928SBarry Smith #define __FUNCT__ "PCShellGetName" 5614b9ad928SBarry Smith /*@C 5624b9ad928SBarry Smith PCShellGetName - Gets an optional name that the user has set for a shell 5634b9ad928SBarry Smith preconditioner. 5644b9ad928SBarry Smith 5654b9ad928SBarry Smith Not Collective 5664b9ad928SBarry Smith 5674b9ad928SBarry Smith Input Parameter: 5684b9ad928SBarry Smith . pc - the preconditioner context 5694b9ad928SBarry Smith 5704b9ad928SBarry Smith Output Parameter: 5714b9ad928SBarry Smith . name - character string describing shell preconditioner (you should not free this) 5724b9ad928SBarry Smith 5734b9ad928SBarry Smith Level: developer 5744b9ad928SBarry Smith 5754b9ad928SBarry Smith .keywords: PC, shell, get, name, user-provided 5764b9ad928SBarry Smith 5774b9ad928SBarry Smith .seealso: PCShellSetName() 5784b9ad928SBarry Smith @*/ 579dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellGetName(PC pc,char *name[]) 5804b9ad928SBarry Smith { 581dfbe8321SBarry Smith PetscErrorCode ierr,(*f)(PC,char *[]); 5824b9ad928SBarry Smith 5834b9ad928SBarry Smith PetscFunctionBegin; 5844482741eSBarry Smith PetscValidHeaderSpecific(pc,PC_COOKIE,1); 5854482741eSBarry Smith PetscValidPointer(name,2); 5864b9ad928SBarry Smith ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellGetName_C",(void (**)(void))&f);CHKERRQ(ierr); 5874b9ad928SBarry Smith if (f) { 5884b9ad928SBarry Smith ierr = (*f)(pc,name);CHKERRQ(ierr); 5894b9ad928SBarry Smith } else { 5901302d50aSBarry Smith SETERRQ(PETSC_ERR_ARG_WRONG,"Not shell preconditioner, cannot get name"); 5914b9ad928SBarry Smith } 5924b9ad928SBarry Smith PetscFunctionReturn(0); 5934b9ad928SBarry Smith } 5944b9ad928SBarry Smith 5954b9ad928SBarry Smith #undef __FUNCT__ 5964b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApplyRichardson" 5974b9ad928SBarry Smith /*@C 5984b9ad928SBarry Smith PCShellSetApplyRichardson - Sets routine to use as preconditioner 5994b9ad928SBarry Smith in Richardson iteration. 6004b9ad928SBarry Smith 6014b9ad928SBarry Smith Collective on PC 6024b9ad928SBarry Smith 6034b9ad928SBarry Smith Input Parameters: 6044b9ad928SBarry Smith + pc - the preconditioner context 6054b9ad928SBarry Smith . apply - the application-provided preconditioning routine 6064b9ad928SBarry Smith - ptr - pointer to data needed by this routine 6074b9ad928SBarry Smith 6084b9ad928SBarry Smith Calling sequence of apply: 6094b9ad928SBarry Smith .vb 61013f74950SBarry Smith PetscErrorCode apply (void *ptr,Vec b,Vec x,Vec r,PetscReal rtol,PetscReal abstol,PetscReal dtol,PetscInt maxits) 6114b9ad928SBarry Smith .ve 6124b9ad928SBarry Smith 6134b9ad928SBarry Smith + ptr - the application context 6144b9ad928SBarry Smith . b - right-hand-side 6154b9ad928SBarry Smith . x - current iterate 6164b9ad928SBarry Smith . r - work space 6174b9ad928SBarry Smith . rtol - relative tolerance of residual norm to stop at 61870441072SBarry Smith . abstol - absolute tolerance of residual norm to stop at 6194b9ad928SBarry Smith . dtol - if residual norm increases by this factor than return 6204b9ad928SBarry Smith - maxits - number of iterations to run 6214b9ad928SBarry Smith 6224b9ad928SBarry Smith Level: developer 6234b9ad928SBarry Smith 6244b9ad928SBarry Smith .keywords: PC, shell, set, apply, Richardson, user-provided 6254b9ad928SBarry Smith 6264b9ad928SBarry Smith .seealso: PCShellSetApply() 6274b9ad928SBarry Smith @*/ 628dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApplyRichardson(PC pc,PetscErrorCode (*apply)(void*,Vec,Vec,Vec,PetscReal,PetscReal,PetscReal,PetscInt),void *ptr) 6294b9ad928SBarry Smith { 63013f74950SBarry Smith PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*,Vec,Vec,Vec,PetscReal,PetscReal,PetscReal,PetscInt),void *); 6314b9ad928SBarry Smith 6324b9ad928SBarry Smith PetscFunctionBegin; 6334482741eSBarry Smith PetscValidHeaderSpecific(pc,PC_COOKIE,1); 6344b9ad928SBarry Smith ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetApplyRichardson_C",(void (**)(void))&f);CHKERRQ(ierr); 6354b9ad928SBarry Smith if (f) { 6364b9ad928SBarry Smith ierr = (*f)(pc,apply,ptr);CHKERRQ(ierr); 6374b9ad928SBarry Smith } 6384b9ad928SBarry Smith PetscFunctionReturn(0); 6394b9ad928SBarry Smith } 6404b9ad928SBarry Smith 6414b9ad928SBarry Smith /*MC 6424b9ad928SBarry Smith PCSHELL - Creates a new preconditioner class for use with your 6434b9ad928SBarry Smith own private data storage format. 6444b9ad928SBarry Smith 6454b9ad928SBarry Smith Level: advanced 6464b9ad928SBarry Smith 6474b9ad928SBarry Smith Concepts: providing your own preconditioner 6484b9ad928SBarry Smith 6494b9ad928SBarry Smith Usage: 6506849ba73SBarry Smith $ PetscErrorCode (*mult)(void*,Vec,Vec); 6516849ba73SBarry Smith $ PetscErrorCode (*setup)(void*); 6524b9ad928SBarry Smith $ PCCreate(comm,&pc); 6534b9ad928SBarry Smith $ PCSetType(pc,PCSHELL); 6544b9ad928SBarry Smith $ PCShellSetApply(pc,mult,ctx); 6554b9ad928SBarry Smith $ PCShellSetSetUp(pc,setup); (optional) 6564b9ad928SBarry Smith 6574b9ad928SBarry Smith .seealso: PCCreate(), PCSetType(), PCType (for list of available types), PC, 658d07a9264SSatish Balay MATSHELL, PCShellSetUp(), PCShellSetApply(), PCShellSetView(), 6594b9ad928SBarry Smith PCShellSetApplyTranpose(), PCShellSetName(), PCShellSetApplyRichardson(), 6604b9ad928SBarry Smith PCShellGetName() 6614b9ad928SBarry Smith M*/ 6624b9ad928SBarry Smith 6634b9ad928SBarry Smith EXTERN_C_BEGIN 6644b9ad928SBarry Smith #undef __FUNCT__ 6654b9ad928SBarry Smith #define __FUNCT__ "PCCreate_Shell" 666dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCCreate_Shell(PC pc) 6674b9ad928SBarry Smith { 668dfbe8321SBarry Smith PetscErrorCode ierr; 6694b9ad928SBarry Smith PC_Shell *shell; 6704b9ad928SBarry Smith 6714b9ad928SBarry Smith PetscFunctionBegin; 6724b9ad928SBarry Smith pc->ops->destroy = PCDestroy_Shell; 6734b9ad928SBarry Smith ierr = PetscNew(PC_Shell,&shell);CHKERRQ(ierr); 67452e6d16bSBarry Smith ierr = PetscLogObjectMemory(pc,sizeof(PC_Shell));CHKERRQ(ierr); 6754b9ad928SBarry Smith pc->data = (void*)shell; 6764b9ad928SBarry Smith pc->name = 0; 6774b9ad928SBarry Smith 6784b9ad928SBarry Smith pc->ops->apply = PCApply_Shell; 6794b9ad928SBarry Smith pc->ops->view = PCView_Shell; 6804b9ad928SBarry Smith pc->ops->applytranspose = PCApplyTranspose_Shell; 6814b9ad928SBarry Smith pc->ops->applyrichardson = 0; 6824b9ad928SBarry Smith pc->ops->setup = PCSetUp_Shell; 683*9bbb2c88SBarry Smith pc->ops->presolve = 0; 684*9bbb2c88SBarry Smith pc->ops->postsolve = 0; 6854b9ad928SBarry Smith pc->ops->view = PCView_Shell; 6864b9ad928SBarry Smith 6874b9ad928SBarry Smith shell->apply = 0; 6884b9ad928SBarry Smith shell->applytranspose = 0; 6894b9ad928SBarry Smith shell->name = 0; 6904b9ad928SBarry Smith shell->applyrich = 0; 6917cdd61b2SBarry Smith shell->presolve = 0; 6927cdd61b2SBarry Smith shell->postsolve = 0; 6934b9ad928SBarry Smith shell->ctxrich = 0; 6944b9ad928SBarry Smith shell->ctx = 0; 6954b9ad928SBarry Smith shell->setup = 0; 6964b9ad928SBarry Smith shell->view = 0; 6974b9ad928SBarry Smith 6984b9ad928SBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetSetUp_C","PCShellSetSetUp_Shell", 6994b9ad928SBarry Smith PCShellSetSetUp_Shell);CHKERRQ(ierr); 7004b9ad928SBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetApply_C","PCShellSetApply_Shell", 7014b9ad928SBarry Smith PCShellSetApply_Shell);CHKERRQ(ierr); 7027cdd61b2SBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetPreSolve_C","PCShellSetPreSolve_Shell", 7037cdd61b2SBarry Smith PCShellSetPreSolve_Shell);CHKERRQ(ierr); 7047cdd61b2SBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetPostSolve_C","PCShellSetPostSolve_Shell", 7057cdd61b2SBarry Smith PCShellSetPostSolve_Shell);CHKERRQ(ierr); 7064b9ad928SBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetView_C","PCShellSetView_Shell", 7074b9ad928SBarry Smith PCShellSetView_Shell);CHKERRQ(ierr); 7084b9ad928SBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetApplyTranspose_C", 7094b9ad928SBarry Smith "PCShellSetApplyTranspose_Shell", 7104b9ad928SBarry Smith PCShellSetApplyTranspose_Shell);CHKERRQ(ierr); 7114b9ad928SBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetName_C","PCShellSetName_Shell", 7124b9ad928SBarry Smith PCShellSetName_Shell);CHKERRQ(ierr); 7134b9ad928SBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellGetName_C","PCShellGetName_Shell", 7144b9ad928SBarry Smith PCShellGetName_Shell);CHKERRQ(ierr); 7154b9ad928SBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetApplyRichardson_C", 7164b9ad928SBarry Smith "PCShellSetApplyRichardson_Shell", 7174b9ad928SBarry Smith PCShellSetApplyRichardson_Shell);CHKERRQ(ierr); 7184b9ad928SBarry Smith 7194b9ad928SBarry Smith PetscFunctionReturn(0); 7204b9ad928SBarry Smith } 7214b9ad928SBarry Smith EXTERN_C_END 7224b9ad928SBarry Smith 7234b9ad928SBarry Smith 7244b9ad928SBarry Smith 7254b9ad928SBarry Smith 7264b9ad928SBarry Smith 7274b9ad928SBarry Smith 728