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); 16*7cdd61b2SBarry Smith PetscErrorCode (*presolve)(void*,KSP,Vec,Vec); 17*7cdd61b2SBarry 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__ 55*7cdd61b2SBarry Smith #define __FUNCT__ "PCPreSolve_Shell" 56*7cdd61b2SBarry Smith static PetscErrorCode PCPreSolve_Shell(PC pc,KSP ksp,Vec b,Vec x) 57*7cdd61b2SBarry Smith { 58*7cdd61b2SBarry Smith PC_Shell *shell; 59*7cdd61b2SBarry Smith PetscErrorCode ierr; 60*7cdd61b2SBarry Smith 61*7cdd61b2SBarry Smith PetscFunctionBegin; 62*7cdd61b2SBarry Smith shell = (PC_Shell*)pc->data; 63*7cdd61b2SBarry Smith if (!shell->apply) SETERRQ(PETSC_ERR_USER,"No presolve() routine provided to Shell PC"); 64*7cdd61b2SBarry Smith ierr = (*shell->presolve)(shell->ctx,ksp,b,x);CHKERRQ(ierr); 65*7cdd61b2SBarry Smith PetscFunctionReturn(0); 66*7cdd61b2SBarry Smith } 67*7cdd61b2SBarry Smith 68*7cdd61b2SBarry Smith #undef __FUNCT__ 69*7cdd61b2SBarry Smith #define __FUNCT__ "PCPostSolve_Shell" 70*7cdd61b2SBarry Smith static PetscErrorCode PCPostSolve_Shell(PC pc,KSP ksp,Vec b,Vec x) 71*7cdd61b2SBarry Smith { 72*7cdd61b2SBarry Smith PC_Shell *shell; 73*7cdd61b2SBarry Smith PetscErrorCode ierr; 74*7cdd61b2SBarry Smith 75*7cdd61b2SBarry Smith PetscFunctionBegin; 76*7cdd61b2SBarry Smith shell = (PC_Shell*)pc->data; 77*7cdd61b2SBarry Smith if (!shell->apply) SETERRQ(PETSC_ERR_USER,"No presolve() routine provided to Shell PC"); 78*7cdd61b2SBarry Smith ierr = (*shell->presolve)(shell->ctx,ksp,b,x);CHKERRQ(ierr); 79*7cdd61b2SBarry Smith PetscFunctionReturn(0); 80*7cdd61b2SBarry Smith } 81*7cdd61b2SBarry Smith 82*7cdd61b2SBarry 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__ 176*7cdd61b2SBarry Smith #define __FUNCT__ "PCShellSetPreSolve_Shell" 177*7cdd61b2SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetPreSolve_Shell(PC pc,PetscErrorCode (*presolve)(void*,KSP,Vec,Vec),void *ptr) 178*7cdd61b2SBarry Smith { 179*7cdd61b2SBarry Smith PC_Shell *shell; 180*7cdd61b2SBarry Smith 181*7cdd61b2SBarry Smith PetscFunctionBegin; 182*7cdd61b2SBarry Smith shell = (PC_Shell*)pc->data; 183*7cdd61b2SBarry Smith shell->presolve = presolve; 184*7cdd61b2SBarry Smith PetscFunctionReturn(0); 185*7cdd61b2SBarry Smith } 186*7cdd61b2SBarry Smith EXTERN_C_END 187*7cdd61b2SBarry Smith 188*7cdd61b2SBarry Smith EXTERN_C_BEGIN 189*7cdd61b2SBarry Smith #undef __FUNCT__ 190*7cdd61b2SBarry Smith #define __FUNCT__ "PCShellSetPostSolve_Shell" 191*7cdd61b2SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetPostSolve_Shell(PC pc,PetscErrorCode (*postsolve)(void*,KSP,Vec,Vec),void *ptr) 192*7cdd61b2SBarry Smith { 193*7cdd61b2SBarry Smith PC_Shell *shell; 194*7cdd61b2SBarry Smith 195*7cdd61b2SBarry Smith PetscFunctionBegin; 196*7cdd61b2SBarry Smith shell = (PC_Shell*)pc->data; 197*7cdd61b2SBarry Smith shell->postsolve = postsolve; 198*7cdd61b2SBarry Smith PetscFunctionReturn(0); 199*7cdd61b2SBarry Smith } 200*7cdd61b2SBarry Smith EXTERN_C_END 201*7cdd61b2SBarry Smith 202*7cdd61b2SBarry Smith EXTERN_C_BEGIN 203*7cdd61b2SBarry Smith #undef __FUNCT__ 2044b9ad928SBarry Smith #define __FUNCT__ "PCShellSetView_Shell" 205dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetView_Shell(PC pc,PetscErrorCode (*view)(void*,PetscViewer)) 2064b9ad928SBarry Smith { 2074b9ad928SBarry Smith PC_Shell *shell; 2084b9ad928SBarry Smith 2094b9ad928SBarry Smith PetscFunctionBegin; 2104b9ad928SBarry Smith shell = (PC_Shell*)pc->data; 2114b9ad928SBarry Smith shell->view = view; 2124b9ad928SBarry Smith PetscFunctionReturn(0); 2134b9ad928SBarry Smith } 2144b9ad928SBarry Smith EXTERN_C_END 2154b9ad928SBarry Smith 2164b9ad928SBarry Smith EXTERN_C_BEGIN 2174b9ad928SBarry Smith #undef __FUNCT__ 2184b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApplyTranspose_Shell" 219dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApplyTranspose_Shell(PC pc,PetscErrorCode (*applytranspose)(void*,Vec,Vec)) 2204b9ad928SBarry Smith { 2214b9ad928SBarry Smith PC_Shell *shell; 2224b9ad928SBarry Smith 2234b9ad928SBarry Smith PetscFunctionBegin; 2244b9ad928SBarry Smith shell = (PC_Shell*)pc->data; 2254b9ad928SBarry Smith shell->applytranspose = applytranspose; 2264b9ad928SBarry Smith PetscFunctionReturn(0); 2274b9ad928SBarry Smith } 2284b9ad928SBarry Smith EXTERN_C_END 2294b9ad928SBarry Smith 2304b9ad928SBarry Smith EXTERN_C_BEGIN 2314b9ad928SBarry Smith #undef __FUNCT__ 2324b9ad928SBarry Smith #define __FUNCT__ "PCShellSetName_Shell" 233dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetName_Shell(PC pc,const char name[]) 2344b9ad928SBarry Smith { 2354b9ad928SBarry Smith PC_Shell *shell; 236dfbe8321SBarry Smith PetscErrorCode ierr; 2374b9ad928SBarry Smith 2384b9ad928SBarry Smith PetscFunctionBegin; 2394b9ad928SBarry Smith shell = (PC_Shell*)pc->data; 2404b9ad928SBarry Smith ierr = PetscStrallocpy(name,&shell->name);CHKERRQ(ierr); 2414b9ad928SBarry Smith PetscFunctionReturn(0); 2424b9ad928SBarry Smith } 2434b9ad928SBarry Smith EXTERN_C_END 2444b9ad928SBarry Smith 2454b9ad928SBarry Smith EXTERN_C_BEGIN 2464b9ad928SBarry Smith #undef __FUNCT__ 2474b9ad928SBarry Smith #define __FUNCT__ "PCShellGetName_Shell" 248dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellGetName_Shell(PC pc,char *name[]) 2494b9ad928SBarry Smith { 2504b9ad928SBarry Smith PC_Shell *shell; 2514b9ad928SBarry Smith 2524b9ad928SBarry Smith PetscFunctionBegin; 2534b9ad928SBarry Smith shell = (PC_Shell*)pc->data; 2544b9ad928SBarry Smith *name = shell->name; 2554b9ad928SBarry Smith PetscFunctionReturn(0); 2564b9ad928SBarry Smith } 2574b9ad928SBarry Smith EXTERN_C_END 2584b9ad928SBarry Smith 2594b9ad928SBarry Smith EXTERN_C_BEGIN 2604b9ad928SBarry Smith #undef __FUNCT__ 2614b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApplyRichardson_Shell" 262dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApplyRichardson_Shell(PC pc,PetscErrorCode (*apply)(void*,Vec,Vec,Vec,PetscReal,PetscReal,PetscReal,PetscInt),void *ptr) 2634b9ad928SBarry Smith { 2644b9ad928SBarry Smith PC_Shell *shell; 2654b9ad928SBarry Smith 2664b9ad928SBarry Smith PetscFunctionBegin; 2674b9ad928SBarry Smith shell = (PC_Shell*)pc->data; 2684b9ad928SBarry Smith pc->ops->applyrichardson = PCApplyRichardson_Shell; 2694b9ad928SBarry Smith shell->applyrich = apply; 2704b9ad928SBarry Smith shell->ctxrich = ptr; 2714b9ad928SBarry Smith PetscFunctionReturn(0); 2724b9ad928SBarry Smith } 2734b9ad928SBarry Smith EXTERN_C_END 2744b9ad928SBarry Smith 2754b9ad928SBarry Smith /* -------------------------------------------------------------------------------*/ 2764b9ad928SBarry Smith 2774b9ad928SBarry Smith #undef __FUNCT__ 2784b9ad928SBarry Smith #define __FUNCT__ "PCShellSetSetUp" 2794b9ad928SBarry Smith /*@C 2804b9ad928SBarry Smith PCShellSetSetUp - Sets routine to use to "setup" the preconditioner whenever the 2814b9ad928SBarry Smith matrix operator is changed. 2824b9ad928SBarry Smith 2834b9ad928SBarry Smith Collective on PC 2844b9ad928SBarry Smith 2854b9ad928SBarry Smith Input Parameters: 2864b9ad928SBarry Smith + pc - the preconditioner context 2874b9ad928SBarry Smith . setup - the application-provided setup routine 2884b9ad928SBarry Smith 2894b9ad928SBarry Smith Calling sequence of setup: 2904b9ad928SBarry Smith .vb 29113f74950SBarry Smith PetscErrorCode setup (void *ptr) 2924b9ad928SBarry Smith .ve 2934b9ad928SBarry Smith 2944b9ad928SBarry Smith . ptr - the application context 2954b9ad928SBarry Smith 2964b9ad928SBarry Smith Level: developer 2974b9ad928SBarry Smith 2984b9ad928SBarry Smith .keywords: PC, shell, set, setup, user-provided 2994b9ad928SBarry Smith 3004b9ad928SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetApply() 3014b9ad928SBarry Smith @*/ 302dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetSetUp(PC pc,PetscErrorCode (*setup)(void*)) 3034b9ad928SBarry Smith { 3046849ba73SBarry Smith PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*)); 3054b9ad928SBarry Smith 3064b9ad928SBarry Smith PetscFunctionBegin; 3074482741eSBarry Smith PetscValidHeaderSpecific(pc,PC_COOKIE,1); 3084b9ad928SBarry Smith ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetSetUp_C",(void (**)(void))&f);CHKERRQ(ierr); 3094b9ad928SBarry Smith if (f) { 3104b9ad928SBarry Smith ierr = (*f)(pc,setup);CHKERRQ(ierr); 3114b9ad928SBarry Smith } 3124b9ad928SBarry Smith PetscFunctionReturn(0); 3134b9ad928SBarry Smith } 3144b9ad928SBarry Smith 3154b9ad928SBarry Smith 3164b9ad928SBarry Smith #undef __FUNCT__ 3174b9ad928SBarry Smith #define __FUNCT__ "PCShellSetView" 3184b9ad928SBarry Smith /*@C 3194b9ad928SBarry Smith PCShellSetView - Sets routine to use as viewer of shell preconditioner 3204b9ad928SBarry Smith 3214b9ad928SBarry Smith Collective on PC 3224b9ad928SBarry Smith 3234b9ad928SBarry Smith Input Parameters: 3244b9ad928SBarry Smith + pc - the preconditioner context 3254b9ad928SBarry Smith - view - the application-provided view routine 3264b9ad928SBarry Smith 3274b9ad928SBarry Smith Calling sequence of apply: 3284b9ad928SBarry Smith .vb 32913f74950SBarry Smith PetscErrorCode view(void *ptr,PetscViewer v) 3304b9ad928SBarry Smith .ve 3314b9ad928SBarry Smith 3324b9ad928SBarry Smith + ptr - the application context 3334b9ad928SBarry Smith - v - viewer 3344b9ad928SBarry Smith 3354b9ad928SBarry Smith Level: developer 3364b9ad928SBarry Smith 3374b9ad928SBarry Smith .keywords: PC, shell, set, apply, user-provided 3384b9ad928SBarry Smith 3394b9ad928SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose() 3404b9ad928SBarry Smith @*/ 341dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetView(PC pc,PetscErrorCode (*view)(void*,PetscViewer)) 3424b9ad928SBarry Smith { 3436849ba73SBarry Smith PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*,PetscViewer)); 3444b9ad928SBarry Smith 3454b9ad928SBarry Smith PetscFunctionBegin; 3464482741eSBarry Smith PetscValidHeaderSpecific(pc,PC_COOKIE,1); 3474b9ad928SBarry Smith ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetView_C",(void (**)(void))&f);CHKERRQ(ierr); 3484b9ad928SBarry Smith if (f) { 3494b9ad928SBarry Smith ierr = (*f)(pc,view);CHKERRQ(ierr); 3504b9ad928SBarry Smith } 3514b9ad928SBarry Smith PetscFunctionReturn(0); 3524b9ad928SBarry Smith } 3534b9ad928SBarry Smith 3544b9ad928SBarry Smith #undef __FUNCT__ 3554b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApply" 3564b9ad928SBarry Smith /*@C 3574b9ad928SBarry Smith PCShellSetApply - Sets routine to use as preconditioner. 3584b9ad928SBarry Smith 3594b9ad928SBarry Smith Collective on PC 3604b9ad928SBarry Smith 3614b9ad928SBarry Smith Input Parameters: 3624b9ad928SBarry Smith + pc - the preconditioner context 3634b9ad928SBarry Smith . apply - the application-provided preconditioning routine 3644b9ad928SBarry Smith - ptr - pointer to data needed by this routine 3654b9ad928SBarry Smith 3664b9ad928SBarry Smith Calling sequence of apply: 3674b9ad928SBarry Smith .vb 36813f74950SBarry Smith PetscErrorCode apply (void *ptr,Vec xin,Vec xout) 3694b9ad928SBarry Smith .ve 3704b9ad928SBarry Smith 3714b9ad928SBarry Smith + ptr - the application context 3724b9ad928SBarry Smith . xin - input vector 3734b9ad928SBarry Smith - xout - output vector 3744b9ad928SBarry Smith 3754b9ad928SBarry Smith Level: developer 3764b9ad928SBarry Smith 3774b9ad928SBarry Smith .keywords: PC, shell, set, apply, user-provided 3784b9ad928SBarry Smith 3794b9ad928SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose() 3804b9ad928SBarry Smith @*/ 381dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApply(PC pc,PetscErrorCode (*apply)(void*,Vec,Vec),void *ptr) 3824b9ad928SBarry Smith { 3836849ba73SBarry Smith PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*,Vec,Vec),void *); 3844b9ad928SBarry Smith 3854b9ad928SBarry Smith PetscFunctionBegin; 3864482741eSBarry Smith PetscValidHeaderSpecific(pc,PC_COOKIE,1); 3874b9ad928SBarry Smith ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetApply_C",(void (**)(void))&f);CHKERRQ(ierr); 3884b9ad928SBarry Smith if (f) { 3894b9ad928SBarry Smith ierr = (*f)(pc,apply,ptr);CHKERRQ(ierr); 3904b9ad928SBarry Smith } 3914b9ad928SBarry Smith PetscFunctionReturn(0); 3924b9ad928SBarry Smith } 3934b9ad928SBarry Smith 3944b9ad928SBarry Smith #undef __FUNCT__ 3954b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApplyTranspose" 3964b9ad928SBarry Smith /*@C 3974b9ad928SBarry Smith PCShellSetApplyTranspose - Sets routine to use as preconditioner transpose. 3984b9ad928SBarry Smith 3994b9ad928SBarry Smith Collective on PC 4004b9ad928SBarry Smith 4014b9ad928SBarry Smith Input Parameters: 4024b9ad928SBarry Smith + pc - the preconditioner context 4034b9ad928SBarry Smith - apply - the application-provided preconditioning transpose routine 4044b9ad928SBarry Smith 4054b9ad928SBarry Smith Calling sequence of apply: 4064b9ad928SBarry Smith .vb 40713f74950SBarry Smith PetscErrorCode applytranspose (void *ptr,Vec xin,Vec xout) 4084b9ad928SBarry Smith .ve 4094b9ad928SBarry Smith 4104b9ad928SBarry Smith + ptr - the application context 4114b9ad928SBarry Smith . xin - input vector 4124b9ad928SBarry Smith - xout - output vector 4134b9ad928SBarry Smith 4144b9ad928SBarry Smith Level: developer 4154b9ad928SBarry Smith 4164b9ad928SBarry Smith Notes: 4174b9ad928SBarry Smith Uses the same context variable as PCShellSetApply(). 4184b9ad928SBarry Smith 4194b9ad928SBarry Smith .keywords: PC, shell, set, apply, user-provided 4204b9ad928SBarry Smith 4214b9ad928SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApply() 4224b9ad928SBarry Smith @*/ 423dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApplyTranspose(PC pc,PetscErrorCode (*applytranspose)(void*,Vec,Vec)) 4244b9ad928SBarry Smith { 4256849ba73SBarry Smith PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*,Vec,Vec)); 4264b9ad928SBarry Smith 4274b9ad928SBarry Smith PetscFunctionBegin; 4284482741eSBarry Smith PetscValidHeaderSpecific(pc,PC_COOKIE,1); 4294b9ad928SBarry Smith ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetApplyTranspose_C",(void (**)(void))&f);CHKERRQ(ierr); 4304b9ad928SBarry Smith if (f) { 4314b9ad928SBarry Smith ierr = (*f)(pc,applytranspose);CHKERRQ(ierr); 4324b9ad928SBarry Smith } 4334b9ad928SBarry Smith PetscFunctionReturn(0); 4344b9ad928SBarry Smith } 4354b9ad928SBarry Smith 4364b9ad928SBarry Smith #undef __FUNCT__ 437*7cdd61b2SBarry Smith #define __FUNCT__ "PCShellSetPreSolve" 438*7cdd61b2SBarry Smith /*@C 439*7cdd61b2SBarry Smith PCShellSetPreSolve - Sets routine to apply to the operators/vectors before a KSPSolve() is 440*7cdd61b2SBarry Smith applied. This usually does something like scale the linear system in some application 441*7cdd61b2SBarry Smith specific way. 442*7cdd61b2SBarry Smith 443*7cdd61b2SBarry Smith Collective on PC 444*7cdd61b2SBarry Smith 445*7cdd61b2SBarry Smith Input Parameters: 446*7cdd61b2SBarry Smith + pc - the preconditioner context 447*7cdd61b2SBarry Smith - presolve - the application-provided presolve routine 448*7cdd61b2SBarry Smith 449*7cdd61b2SBarry Smith Calling sequence of presolve: 450*7cdd61b2SBarry Smith .vb 451*7cdd61b2SBarry Smith PetscErrorCode presolve (void *ptr,KSP ksp,Vec b,Vec x) 452*7cdd61b2SBarry Smith .ve 453*7cdd61b2SBarry Smith 454*7cdd61b2SBarry Smith + ptr - the application context 455*7cdd61b2SBarry Smith . xin - input vector 456*7cdd61b2SBarry Smith - xout - output vector 457*7cdd61b2SBarry Smith 458*7cdd61b2SBarry Smith Level: developer 459*7cdd61b2SBarry Smith 460*7cdd61b2SBarry Smith .keywords: PC, shell, set, apply, user-provided 461*7cdd61b2SBarry Smith 462*7cdd61b2SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose(), PCShellSetPostSolve() 463*7cdd61b2SBarry Smith @*/ 464*7cdd61b2SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetPreSolve(PC pc,PetscErrorCode (*presolve)(void*,KSP,Vec,Vec)) 465*7cdd61b2SBarry Smith { 466*7cdd61b2SBarry Smith PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*,KSP,Vec,Vec)); 467*7cdd61b2SBarry Smith 468*7cdd61b2SBarry Smith PetscFunctionBegin; 469*7cdd61b2SBarry Smith PetscValidHeaderSpecific(pc,PC_COOKIE,1); 470*7cdd61b2SBarry Smith ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetPreSolve_C",(void (**)(void))&f);CHKERRQ(ierr); 471*7cdd61b2SBarry Smith if (f) { 472*7cdd61b2SBarry Smith ierr = (*f)(pc,presolve);CHKERRQ(ierr); 473*7cdd61b2SBarry Smith } 474*7cdd61b2SBarry Smith PetscFunctionReturn(0); 475*7cdd61b2SBarry Smith } 476*7cdd61b2SBarry Smith 477*7cdd61b2SBarry Smith #undef __FUNCT__ 478*7cdd61b2SBarry Smith #define __FUNCT__ "PCShellSetPostSolve" 479*7cdd61b2SBarry Smith /*@C 480*7cdd61b2SBarry Smith PCShellSetPostSolve - Sets routine to apply to the operators/vectors before a KSPSolve() is 481*7cdd61b2SBarry Smith applied. This usually does something like scale the linear system in some application 482*7cdd61b2SBarry Smith specific way. 483*7cdd61b2SBarry Smith 484*7cdd61b2SBarry Smith Collective on PC 485*7cdd61b2SBarry Smith 486*7cdd61b2SBarry Smith Input Parameters: 487*7cdd61b2SBarry Smith + pc - the preconditioner context 488*7cdd61b2SBarry Smith - postsolve - the application-provided presolve routine 489*7cdd61b2SBarry Smith 490*7cdd61b2SBarry Smith Calling sequence of postsolve: 491*7cdd61b2SBarry Smith .vb 492*7cdd61b2SBarry Smith PetscErrorCode postsolve(void *ptr,KSP ksp,Vec b,Vec x) 493*7cdd61b2SBarry Smith .ve 494*7cdd61b2SBarry Smith 495*7cdd61b2SBarry Smith + ptr - the application context 496*7cdd61b2SBarry Smith . xin - input vector 497*7cdd61b2SBarry Smith - xout - output vector 498*7cdd61b2SBarry Smith 499*7cdd61b2SBarry Smith Level: developer 500*7cdd61b2SBarry Smith 501*7cdd61b2SBarry Smith .keywords: PC, shell, set, apply, user-provided 502*7cdd61b2SBarry Smith 503*7cdd61b2SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose(), PCShellSetPreSolve() 504*7cdd61b2SBarry Smith @*/ 505*7cdd61b2SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetPostSolve(PC pc,PetscErrorCode (*postsolve)(void*,KSP,Vec,Vec)) 506*7cdd61b2SBarry Smith { 507*7cdd61b2SBarry Smith PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*,KSP,Vec,Vec)); 508*7cdd61b2SBarry Smith 509*7cdd61b2SBarry Smith PetscFunctionBegin; 510*7cdd61b2SBarry Smith PetscValidHeaderSpecific(pc,PC_COOKIE,1); 511*7cdd61b2SBarry Smith ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetPostSolve_C",(void (**)(void))&f);CHKERRQ(ierr); 512*7cdd61b2SBarry Smith if (f) { 513*7cdd61b2SBarry Smith ierr = (*f)(pc,postsolve);CHKERRQ(ierr); 514*7cdd61b2SBarry Smith } 515*7cdd61b2SBarry Smith PetscFunctionReturn(0); 516*7cdd61b2SBarry Smith } 517*7cdd61b2SBarry Smith 518*7cdd61b2SBarry Smith #undef __FUNCT__ 5194b9ad928SBarry Smith #define __FUNCT__ "PCShellSetName" 5204b9ad928SBarry Smith /*@C 5214b9ad928SBarry Smith PCShellSetName - Sets an optional name to associate with a shell 5224b9ad928SBarry Smith preconditioner. 5234b9ad928SBarry Smith 5244b9ad928SBarry Smith Not Collective 5254b9ad928SBarry Smith 5264b9ad928SBarry Smith Input Parameters: 5274b9ad928SBarry Smith + pc - the preconditioner context 5284b9ad928SBarry Smith - name - character string describing shell preconditioner 5294b9ad928SBarry Smith 5304b9ad928SBarry Smith Level: developer 5314b9ad928SBarry Smith 5324b9ad928SBarry Smith .keywords: PC, shell, set, name, user-provided 5334b9ad928SBarry Smith 5344b9ad928SBarry Smith .seealso: PCShellGetName() 5354b9ad928SBarry Smith @*/ 536dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetName(PC pc,const char name[]) 5374b9ad928SBarry Smith { 538dfbe8321SBarry Smith PetscErrorCode ierr,(*f)(PC,const char []); 5394b9ad928SBarry Smith 5404b9ad928SBarry Smith PetscFunctionBegin; 5414482741eSBarry Smith PetscValidHeaderSpecific(pc,PC_COOKIE,1); 5424b9ad928SBarry Smith ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetName_C",(void (**)(void))&f);CHKERRQ(ierr); 5434b9ad928SBarry Smith if (f) { 5444b9ad928SBarry Smith ierr = (*f)(pc,name);CHKERRQ(ierr); 5454b9ad928SBarry Smith } 5464b9ad928SBarry Smith PetscFunctionReturn(0); 5474b9ad928SBarry Smith } 5484b9ad928SBarry Smith 5494b9ad928SBarry Smith #undef __FUNCT__ 5504b9ad928SBarry Smith #define __FUNCT__ "PCShellGetName" 5514b9ad928SBarry Smith /*@C 5524b9ad928SBarry Smith PCShellGetName - Gets an optional name that the user has set for a shell 5534b9ad928SBarry Smith preconditioner. 5544b9ad928SBarry Smith 5554b9ad928SBarry Smith Not Collective 5564b9ad928SBarry Smith 5574b9ad928SBarry Smith Input Parameter: 5584b9ad928SBarry Smith . pc - the preconditioner context 5594b9ad928SBarry Smith 5604b9ad928SBarry Smith Output Parameter: 5614b9ad928SBarry Smith . name - character string describing shell preconditioner (you should not free this) 5624b9ad928SBarry Smith 5634b9ad928SBarry Smith Level: developer 5644b9ad928SBarry Smith 5654b9ad928SBarry Smith .keywords: PC, shell, get, name, user-provided 5664b9ad928SBarry Smith 5674b9ad928SBarry Smith .seealso: PCShellSetName() 5684b9ad928SBarry Smith @*/ 569dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellGetName(PC pc,char *name[]) 5704b9ad928SBarry Smith { 571dfbe8321SBarry Smith PetscErrorCode ierr,(*f)(PC,char *[]); 5724b9ad928SBarry Smith 5734b9ad928SBarry Smith PetscFunctionBegin; 5744482741eSBarry Smith PetscValidHeaderSpecific(pc,PC_COOKIE,1); 5754482741eSBarry Smith PetscValidPointer(name,2); 5764b9ad928SBarry Smith ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellGetName_C",(void (**)(void))&f);CHKERRQ(ierr); 5774b9ad928SBarry Smith if (f) { 5784b9ad928SBarry Smith ierr = (*f)(pc,name);CHKERRQ(ierr); 5794b9ad928SBarry Smith } else { 5801302d50aSBarry Smith SETERRQ(PETSC_ERR_ARG_WRONG,"Not shell preconditioner, cannot get name"); 5814b9ad928SBarry Smith } 5824b9ad928SBarry Smith PetscFunctionReturn(0); 5834b9ad928SBarry Smith } 5844b9ad928SBarry Smith 5854b9ad928SBarry Smith #undef __FUNCT__ 5864b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApplyRichardson" 5874b9ad928SBarry Smith /*@C 5884b9ad928SBarry Smith PCShellSetApplyRichardson - Sets routine to use as preconditioner 5894b9ad928SBarry Smith in Richardson iteration. 5904b9ad928SBarry Smith 5914b9ad928SBarry Smith Collective on PC 5924b9ad928SBarry Smith 5934b9ad928SBarry Smith Input Parameters: 5944b9ad928SBarry Smith + pc - the preconditioner context 5954b9ad928SBarry Smith . apply - the application-provided preconditioning routine 5964b9ad928SBarry Smith - ptr - pointer to data needed by this routine 5974b9ad928SBarry Smith 5984b9ad928SBarry Smith Calling sequence of apply: 5994b9ad928SBarry Smith .vb 60013f74950SBarry Smith PetscErrorCode apply (void *ptr,Vec b,Vec x,Vec r,PetscReal rtol,PetscReal abstol,PetscReal dtol,PetscInt maxits) 6014b9ad928SBarry Smith .ve 6024b9ad928SBarry Smith 6034b9ad928SBarry Smith + ptr - the application context 6044b9ad928SBarry Smith . b - right-hand-side 6054b9ad928SBarry Smith . x - current iterate 6064b9ad928SBarry Smith . r - work space 6074b9ad928SBarry Smith . rtol - relative tolerance of residual norm to stop at 60870441072SBarry Smith . abstol - absolute tolerance of residual norm to stop at 6094b9ad928SBarry Smith . dtol - if residual norm increases by this factor than return 6104b9ad928SBarry Smith - maxits - number of iterations to run 6114b9ad928SBarry Smith 6124b9ad928SBarry Smith Level: developer 6134b9ad928SBarry Smith 6144b9ad928SBarry Smith .keywords: PC, shell, set, apply, Richardson, user-provided 6154b9ad928SBarry Smith 6164b9ad928SBarry Smith .seealso: PCShellSetApply() 6174b9ad928SBarry Smith @*/ 618dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApplyRichardson(PC pc,PetscErrorCode (*apply)(void*,Vec,Vec,Vec,PetscReal,PetscReal,PetscReal,PetscInt),void *ptr) 6194b9ad928SBarry Smith { 62013f74950SBarry Smith PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*,Vec,Vec,Vec,PetscReal,PetscReal,PetscReal,PetscInt),void *); 6214b9ad928SBarry Smith 6224b9ad928SBarry Smith PetscFunctionBegin; 6234482741eSBarry Smith PetscValidHeaderSpecific(pc,PC_COOKIE,1); 6244b9ad928SBarry Smith ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetApplyRichardson_C",(void (**)(void))&f);CHKERRQ(ierr); 6254b9ad928SBarry Smith if (f) { 6264b9ad928SBarry Smith ierr = (*f)(pc,apply,ptr);CHKERRQ(ierr); 6274b9ad928SBarry Smith } 6284b9ad928SBarry Smith PetscFunctionReturn(0); 6294b9ad928SBarry Smith } 6304b9ad928SBarry Smith 6314b9ad928SBarry Smith /*MC 6324b9ad928SBarry Smith PCSHELL - Creates a new preconditioner class for use with your 6334b9ad928SBarry Smith own private data storage format. 6344b9ad928SBarry Smith 6354b9ad928SBarry Smith Level: advanced 6364b9ad928SBarry Smith 6374b9ad928SBarry Smith Concepts: providing your own preconditioner 6384b9ad928SBarry Smith 6394b9ad928SBarry Smith Usage: 6406849ba73SBarry Smith $ PetscErrorCode (*mult)(void*,Vec,Vec); 6416849ba73SBarry Smith $ PetscErrorCode (*setup)(void*); 6424b9ad928SBarry Smith $ PCCreate(comm,&pc); 6434b9ad928SBarry Smith $ PCSetType(pc,PCSHELL); 6444b9ad928SBarry Smith $ PCShellSetApply(pc,mult,ctx); 6454b9ad928SBarry Smith $ PCShellSetSetUp(pc,setup); (optional) 6464b9ad928SBarry Smith 6474b9ad928SBarry Smith .seealso: PCCreate(), PCSetType(), PCType (for list of available types), PC, 648d07a9264SSatish Balay MATSHELL, PCShellSetUp(), PCShellSetApply(), PCShellSetView(), 6494b9ad928SBarry Smith PCShellSetApplyTranpose(), PCShellSetName(), PCShellSetApplyRichardson(), 6504b9ad928SBarry Smith PCShellGetName() 6514b9ad928SBarry Smith M*/ 6524b9ad928SBarry Smith 6534b9ad928SBarry Smith EXTERN_C_BEGIN 6544b9ad928SBarry Smith #undef __FUNCT__ 6554b9ad928SBarry Smith #define __FUNCT__ "PCCreate_Shell" 656dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCCreate_Shell(PC pc) 6574b9ad928SBarry Smith { 658dfbe8321SBarry Smith PetscErrorCode ierr; 6594b9ad928SBarry Smith PC_Shell *shell; 6604b9ad928SBarry Smith 6614b9ad928SBarry Smith PetscFunctionBegin; 6624b9ad928SBarry Smith pc->ops->destroy = PCDestroy_Shell; 6634b9ad928SBarry Smith ierr = PetscNew(PC_Shell,&shell);CHKERRQ(ierr); 66452e6d16bSBarry Smith ierr = PetscLogObjectMemory(pc,sizeof(PC_Shell));CHKERRQ(ierr); 6654b9ad928SBarry Smith pc->data = (void*)shell; 6664b9ad928SBarry Smith pc->name = 0; 6674b9ad928SBarry Smith 6684b9ad928SBarry Smith pc->ops->apply = PCApply_Shell; 6694b9ad928SBarry Smith pc->ops->view = PCView_Shell; 6704b9ad928SBarry Smith pc->ops->applytranspose = PCApplyTranspose_Shell; 6714b9ad928SBarry Smith pc->ops->applyrichardson = 0; 6724b9ad928SBarry Smith pc->ops->setup = PCSetUp_Shell; 673*7cdd61b2SBarry Smith pc->ops->presolve = PCPreSolve_Shell; 674*7cdd61b2SBarry Smith pc->ops->postsolve = PCPostSolve_Shell; 6754b9ad928SBarry Smith pc->ops->view = PCView_Shell; 6764b9ad928SBarry Smith 6774b9ad928SBarry Smith shell->apply = 0; 6784b9ad928SBarry Smith shell->applytranspose = 0; 6794b9ad928SBarry Smith shell->name = 0; 6804b9ad928SBarry Smith shell->applyrich = 0; 681*7cdd61b2SBarry Smith shell->presolve = 0; 682*7cdd61b2SBarry Smith shell->postsolve = 0; 6834b9ad928SBarry Smith shell->ctxrich = 0; 6844b9ad928SBarry Smith shell->ctx = 0; 6854b9ad928SBarry Smith shell->setup = 0; 6864b9ad928SBarry Smith shell->view = 0; 6874b9ad928SBarry Smith 6884b9ad928SBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetSetUp_C","PCShellSetSetUp_Shell", 6894b9ad928SBarry Smith PCShellSetSetUp_Shell);CHKERRQ(ierr); 6904b9ad928SBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetApply_C","PCShellSetApply_Shell", 6914b9ad928SBarry Smith PCShellSetApply_Shell);CHKERRQ(ierr); 692*7cdd61b2SBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetPreSolve_C","PCShellSetPreSolve_Shell", 693*7cdd61b2SBarry Smith PCShellSetPreSolve_Shell);CHKERRQ(ierr); 694*7cdd61b2SBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetPostSolve_C","PCShellSetPostSolve_Shell", 695*7cdd61b2SBarry Smith PCShellSetPostSolve_Shell);CHKERRQ(ierr); 6964b9ad928SBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetView_C","PCShellSetView_Shell", 6974b9ad928SBarry Smith PCShellSetView_Shell);CHKERRQ(ierr); 6984b9ad928SBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetApplyTranspose_C", 6994b9ad928SBarry Smith "PCShellSetApplyTranspose_Shell", 7004b9ad928SBarry Smith PCShellSetApplyTranspose_Shell);CHKERRQ(ierr); 7014b9ad928SBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetName_C","PCShellSetName_Shell", 7024b9ad928SBarry Smith PCShellSetName_Shell);CHKERRQ(ierr); 7034b9ad928SBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellGetName_C","PCShellGetName_Shell", 7044b9ad928SBarry Smith PCShellGetName_Shell);CHKERRQ(ierr); 7054b9ad928SBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetApplyRichardson_C", 7064b9ad928SBarry Smith "PCShellSetApplyRichardson_Shell", 7074b9ad928SBarry Smith PCShellSetApplyRichardson_Shell);CHKERRQ(ierr); 7084b9ad928SBarry Smith 7094b9ad928SBarry Smith PetscFunctionReturn(0); 7104b9ad928SBarry Smith } 7114b9ad928SBarry Smith EXTERN_C_END 7124b9ad928SBarry Smith 7134b9ad928SBarry Smith 7144b9ad928SBarry Smith 7154b9ad928SBarry Smith 7164b9ad928SBarry Smith 7174b9ad928SBarry Smith 718