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 { 13*be29d3c6SBarry Smith void *ctx; /* 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__ 26*be29d3c6SBarry Smith #define __FUNCT__ "PCShellGetContext" 27*be29d3c6SBarry Smith /*@ 28*be29d3c6SBarry Smith PCShellGetContext - Returns the user-provided context associated with a shell PC 29*be29d3c6SBarry Smith 30*be29d3c6SBarry Smith Not Collective 31*be29d3c6SBarry Smith 32*be29d3c6SBarry Smith Input Parameter: 33*be29d3c6SBarry Smith . pc - should have been created with PCCreateShell() 34*be29d3c6SBarry Smith 35*be29d3c6SBarry Smith Output Parameter: 36*be29d3c6SBarry Smith . ctx - the user provided context 37*be29d3c6SBarry Smith 38*be29d3c6SBarry Smith Level: advanced 39*be29d3c6SBarry Smith 40*be29d3c6SBarry Smith Notes: 41*be29d3c6SBarry Smith This routine is intended for use within various shell routines 42*be29d3c6SBarry Smith 43*be29d3c6SBarry Smith .keywords: PC, shell, get, context 44*be29d3c6SBarry Smith 45*be29d3c6SBarry Smith .seealso: PCCreateShell(), PCShellSetContext() 46*be29d3c6SBarry Smith @*/ 47*be29d3c6SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellGetContext(PC pc,void **ctx) 48*be29d3c6SBarry Smith { 49*be29d3c6SBarry Smith PetscErrorCode ierr; 50*be29d3c6SBarry Smith PetscTruth flg; 51*be29d3c6SBarry Smith 52*be29d3c6SBarry Smith PetscFunctionBegin; 53*be29d3c6SBarry Smith PetscValidHeaderSpecific(pc,PC_COOKIE,1); 54*be29d3c6SBarry Smith PetscValidPointer(ctx,2); 55*be29d3c6SBarry Smith ierr = PetscTypeCompare((PetscObject)pc,PCSHELL,&flg);CHKERRQ(ierr); 56*be29d3c6SBarry Smith if (!flg) *ctx = 0; 57*be29d3c6SBarry Smith else *ctx = ((PC_Shell*)(pc->data))->ctx; 58*be29d3c6SBarry Smith PetscFunctionReturn(0); 59*be29d3c6SBarry Smith } 60*be29d3c6SBarry Smith 61*be29d3c6SBarry Smith #undef __FUNCT__ 62*be29d3c6SBarry Smith #define __FUNCT__ "PCShellSetContext" 63*be29d3c6SBarry Smith /*@C 64*be29d3c6SBarry Smith PCShellSetContext - sets the context for a shell PC 65*be29d3c6SBarry Smith 66*be29d3c6SBarry Smith Collective on PC 67*be29d3c6SBarry Smith 68*be29d3c6SBarry Smith Input Parameters: 69*be29d3c6SBarry Smith + pc - the shell PC 70*be29d3c6SBarry Smith - ctx - the context 71*be29d3c6SBarry Smith 72*be29d3c6SBarry Smith Level: advanced 73*be29d3c6SBarry Smith 74*be29d3c6SBarry Smith Fortran Notes: The context can only be an integer or a PetscObject 75*be29d3c6SBarry Smith unfortunately it cannot be a Fortran array or derived type. 76*be29d3c6SBarry Smith 77*be29d3c6SBarry Smith .seealso: PCCreateShell(), PCShellGetContext() 78*be29d3c6SBarry Smith @*/ 79*be29d3c6SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetContext(PC pc,void *ctx) 80*be29d3c6SBarry Smith { 81*be29d3c6SBarry Smith PC_Shell *shell = (PC_Shell*)pc->data; 82*be29d3c6SBarry Smith PetscErrorCode ierr; 83*be29d3c6SBarry Smith PetscTruth flg; 84*be29d3c6SBarry Smith 85*be29d3c6SBarry Smith PetscFunctionBegin; 86*be29d3c6SBarry Smith PetscValidHeaderSpecific(pc,PC_COOKIE,1); 87*be29d3c6SBarry Smith ierr = PetscTypeCompare((PetscObject)pc,PCSHELL,&flg);CHKERRQ(ierr); 88*be29d3c6SBarry Smith if (flg) { 89*be29d3c6SBarry Smith shell->ctx = ctx; 90*be29d3c6SBarry Smith } 91*be29d3c6SBarry Smith PetscFunctionReturn(0); 92*be29d3c6SBarry Smith } 93*be29d3c6SBarry Smith 94*be29d3c6SBarry Smith #undef __FUNCT__ 954b9ad928SBarry Smith #define __FUNCT__ "PCApply_SetUp" 966849ba73SBarry Smith static PetscErrorCode PCSetUp_Shell(PC pc) 974b9ad928SBarry Smith { 984b9ad928SBarry Smith PC_Shell *shell; 99dfbe8321SBarry Smith PetscErrorCode ierr; 1004b9ad928SBarry Smith 1014b9ad928SBarry Smith PetscFunctionBegin; 1024b9ad928SBarry Smith shell = (PC_Shell*)pc->data; 1034b9ad928SBarry Smith if (shell->setup) { 1044b9ad928SBarry Smith ierr = (*shell->setup)(shell->ctx);CHKERRQ(ierr); 1054b9ad928SBarry Smith } 1064b9ad928SBarry Smith PetscFunctionReturn(0); 1074b9ad928SBarry Smith } 1084b9ad928SBarry Smith 1094b9ad928SBarry Smith #undef __FUNCT__ 1104b9ad928SBarry Smith #define __FUNCT__ "PCApply_Shell" 1116849ba73SBarry Smith static PetscErrorCode PCApply_Shell(PC pc,Vec x,Vec y) 1124b9ad928SBarry Smith { 1134b9ad928SBarry Smith PC_Shell *shell; 114dfbe8321SBarry Smith PetscErrorCode ierr; 1154b9ad928SBarry Smith 1164b9ad928SBarry Smith PetscFunctionBegin; 1174b9ad928SBarry Smith shell = (PC_Shell*)pc->data; 1181302d50aSBarry Smith if (!shell->apply) SETERRQ(PETSC_ERR_USER,"No apply() routine provided to Shell PC"); 1194b9ad928SBarry Smith ierr = (*shell->apply)(shell->ctx,x,y);CHKERRQ(ierr); 1204b9ad928SBarry Smith PetscFunctionReturn(0); 1214b9ad928SBarry Smith } 1224b9ad928SBarry Smith 1234b9ad928SBarry Smith #undef __FUNCT__ 1247cdd61b2SBarry Smith #define __FUNCT__ "PCPreSolve_Shell" 1257cdd61b2SBarry Smith static PetscErrorCode PCPreSolve_Shell(PC pc,KSP ksp,Vec b,Vec x) 1267cdd61b2SBarry Smith { 1277cdd61b2SBarry Smith PC_Shell *shell; 1287cdd61b2SBarry Smith PetscErrorCode ierr; 1297cdd61b2SBarry Smith 1307cdd61b2SBarry Smith PetscFunctionBegin; 1317cdd61b2SBarry Smith shell = (PC_Shell*)pc->data; 13291ad8336SSatish Balay if (!shell->presolve) SETERRQ(PETSC_ERR_USER,"No presolve() routine provided to Shell PC"); 1337cdd61b2SBarry Smith ierr = (*shell->presolve)(shell->ctx,ksp,b,x);CHKERRQ(ierr); 1347cdd61b2SBarry Smith PetscFunctionReturn(0); 1357cdd61b2SBarry Smith } 1367cdd61b2SBarry Smith 1377cdd61b2SBarry Smith #undef __FUNCT__ 1387cdd61b2SBarry Smith #define __FUNCT__ "PCPostSolve_Shell" 1397cdd61b2SBarry Smith static PetscErrorCode PCPostSolve_Shell(PC pc,KSP ksp,Vec b,Vec x) 1407cdd61b2SBarry Smith { 1417cdd61b2SBarry Smith PC_Shell *shell; 1427cdd61b2SBarry Smith PetscErrorCode ierr; 1437cdd61b2SBarry Smith 1447cdd61b2SBarry Smith PetscFunctionBegin; 1457cdd61b2SBarry Smith shell = (PC_Shell*)pc->data; 14691ad8336SSatish Balay if (!shell->postsolve) SETERRQ(PETSC_ERR_USER,"No postsolve() routine provided to Shell PC"); 14791ad8336SSatish Balay ierr = (*shell->postsolve)(shell->ctx,ksp,b,x);CHKERRQ(ierr); 1487cdd61b2SBarry Smith PetscFunctionReturn(0); 1497cdd61b2SBarry Smith } 1507cdd61b2SBarry Smith 1517cdd61b2SBarry Smith #undef __FUNCT__ 1524b9ad928SBarry Smith #define __FUNCT__ "PCApplyTranspose_Shell" 1536849ba73SBarry Smith static PetscErrorCode PCApplyTranspose_Shell(PC pc,Vec x,Vec y) 1544b9ad928SBarry Smith { 1554b9ad928SBarry Smith PC_Shell *shell; 156dfbe8321SBarry Smith PetscErrorCode ierr; 1574b9ad928SBarry Smith 1584b9ad928SBarry Smith PetscFunctionBegin; 1594b9ad928SBarry Smith shell = (PC_Shell*)pc->data; 1601302d50aSBarry Smith if (!shell->applytranspose) SETERRQ(PETSC_ERR_USER,"No applytranspose() routine provided to Shell PC"); 1614b9ad928SBarry Smith ierr = (*shell->applytranspose)(shell->ctx,x,y);CHKERRQ(ierr); 1624b9ad928SBarry Smith PetscFunctionReturn(0); 1634b9ad928SBarry Smith } 1644b9ad928SBarry Smith 1654b9ad928SBarry Smith #undef __FUNCT__ 1664b9ad928SBarry Smith #define __FUNCT__ "PCApplyRichardson_Shell" 16713f74950SBarry Smith static PetscErrorCode PCApplyRichardson_Shell(PC pc,Vec x,Vec y,Vec w,PetscReal rtol,PetscReal abstol, PetscReal dtol,PetscInt it) 1684b9ad928SBarry Smith { 169dfbe8321SBarry Smith PetscErrorCode ierr; 1704b9ad928SBarry Smith PC_Shell *shell; 1714b9ad928SBarry Smith 1724b9ad928SBarry Smith PetscFunctionBegin; 1734b9ad928SBarry Smith shell = (PC_Shell*)pc->data; 174*be29d3c6SBarry Smith ierr = (*shell->applyrich)(shell->ctx,x,y,w,rtol,abstol,dtol,it);CHKERRQ(ierr); 1754b9ad928SBarry Smith PetscFunctionReturn(0); 1764b9ad928SBarry Smith } 1774b9ad928SBarry Smith 1784b9ad928SBarry Smith #undef __FUNCT__ 1794b9ad928SBarry Smith #define __FUNCT__ "PCDestroy_Shell" 1806849ba73SBarry Smith static PetscErrorCode PCDestroy_Shell(PC pc) 1814b9ad928SBarry Smith { 1824b9ad928SBarry Smith PC_Shell *shell = (PC_Shell*)pc->data; 183dfbe8321SBarry Smith PetscErrorCode ierr; 1844b9ad928SBarry Smith 1854b9ad928SBarry Smith PetscFunctionBegin; 1864b9ad928SBarry Smith if (shell->name) {ierr = PetscFree(shell->name);} 1874b9ad928SBarry Smith ierr = PetscFree(shell);CHKERRQ(ierr); 1884b9ad928SBarry Smith PetscFunctionReturn(0); 1894b9ad928SBarry Smith } 1904b9ad928SBarry Smith 1914b9ad928SBarry Smith #undef __FUNCT__ 1924b9ad928SBarry Smith #define __FUNCT__ "PCView_Shell" 1936849ba73SBarry Smith static PetscErrorCode PCView_Shell(PC pc,PetscViewer viewer) 1944b9ad928SBarry Smith { 1954b9ad928SBarry Smith PC_Shell *shell = (PC_Shell*)pc->data; 196dfbe8321SBarry Smith PetscErrorCode ierr; 19732077d6dSBarry Smith PetscTruth iascii; 1984b9ad928SBarry Smith 1994b9ad928SBarry Smith PetscFunctionBegin; 20032077d6dSBarry Smith ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_ASCII,&iascii);CHKERRQ(ierr); 20132077d6dSBarry Smith if (iascii) { 2024b9ad928SBarry Smith if (shell->name) {ierr = PetscViewerASCIIPrintf(viewer," Shell: %s\n",shell->name);CHKERRQ(ierr);} 2034b9ad928SBarry Smith else {ierr = PetscViewerASCIIPrintf(viewer," Shell: no name\n");CHKERRQ(ierr);} 2044b9ad928SBarry Smith } 2054b9ad928SBarry Smith if (shell->view) { 2064b9ad928SBarry Smith ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 2074b9ad928SBarry Smith ierr = (*shell->view)(shell->ctx,viewer);CHKERRQ(ierr); 2084b9ad928SBarry Smith ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 2094b9ad928SBarry Smith } 2104b9ad928SBarry Smith PetscFunctionReturn(0); 2114b9ad928SBarry Smith } 2124b9ad928SBarry Smith 2134b9ad928SBarry Smith /* ------------------------------------------------------------------------------*/ 2144b9ad928SBarry Smith EXTERN_C_BEGIN 2154b9ad928SBarry Smith #undef __FUNCT__ 2164b9ad928SBarry Smith #define __FUNCT__ "PCShellSetSetUp_Shell" 217dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetSetUp_Shell(PC pc, PetscErrorCode (*setup)(void*)) 2184b9ad928SBarry Smith { 2194b9ad928SBarry Smith PC_Shell *shell; 2204b9ad928SBarry Smith 2214b9ad928SBarry Smith PetscFunctionBegin; 2224b9ad928SBarry Smith shell = (PC_Shell*)pc->data; 2234b9ad928SBarry Smith shell->setup = setup; 2244b9ad928SBarry Smith PetscFunctionReturn(0); 2254b9ad928SBarry Smith } 2264b9ad928SBarry Smith EXTERN_C_END 2274b9ad928SBarry Smith 2284b9ad928SBarry Smith EXTERN_C_BEGIN 2294b9ad928SBarry Smith #undef __FUNCT__ 2304b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApply_Shell" 231*be29d3c6SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApply_Shell(PC pc,PetscErrorCode (*apply)(void*,Vec,Vec)) 2324b9ad928SBarry Smith { 2334b9ad928SBarry Smith PC_Shell *shell; 2344b9ad928SBarry Smith 2354b9ad928SBarry Smith PetscFunctionBegin; 2364b9ad928SBarry Smith shell = (PC_Shell*)pc->data; 2374b9ad928SBarry Smith shell->apply = apply; 2384b9ad928SBarry Smith PetscFunctionReturn(0); 2394b9ad928SBarry Smith } 2404b9ad928SBarry Smith EXTERN_C_END 2414b9ad928SBarry Smith 2424b9ad928SBarry Smith EXTERN_C_BEGIN 2434b9ad928SBarry Smith #undef __FUNCT__ 2447cdd61b2SBarry Smith #define __FUNCT__ "PCShellSetPreSolve_Shell" 245*be29d3c6SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetPreSolve_Shell(PC pc,PetscErrorCode (*presolve)(void*,KSP,Vec,Vec)) 2467cdd61b2SBarry Smith { 2477cdd61b2SBarry Smith PC_Shell *shell; 2487cdd61b2SBarry Smith 2497cdd61b2SBarry Smith PetscFunctionBegin; 2507cdd61b2SBarry Smith shell = (PC_Shell*)pc->data; 2517cdd61b2SBarry Smith shell->presolve = presolve; 2529bbb2c88SBarry Smith if (presolve) { 2539bbb2c88SBarry Smith pc->ops->presolve = PCPreSolve_Shell; 2549bbb2c88SBarry Smith } else { 2559bbb2c88SBarry Smith pc->ops->presolve = 0; 2569bbb2c88SBarry Smith } 2577cdd61b2SBarry Smith PetscFunctionReturn(0); 2587cdd61b2SBarry Smith } 2597cdd61b2SBarry Smith EXTERN_C_END 2607cdd61b2SBarry Smith 2617cdd61b2SBarry Smith EXTERN_C_BEGIN 2627cdd61b2SBarry Smith #undef __FUNCT__ 2637cdd61b2SBarry Smith #define __FUNCT__ "PCShellSetPostSolve_Shell" 264*be29d3c6SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetPostSolve_Shell(PC pc,PetscErrorCode (*postsolve)(void*,KSP,Vec,Vec)) 2657cdd61b2SBarry Smith { 2667cdd61b2SBarry Smith PC_Shell *shell; 2677cdd61b2SBarry Smith 2687cdd61b2SBarry Smith PetscFunctionBegin; 2697cdd61b2SBarry Smith shell = (PC_Shell*)pc->data; 2707cdd61b2SBarry Smith shell->postsolve = postsolve; 2719bbb2c88SBarry Smith if (postsolve) { 2729bbb2c88SBarry Smith pc->ops->postsolve = PCPostSolve_Shell; 2739bbb2c88SBarry Smith } else { 2749bbb2c88SBarry Smith pc->ops->postsolve = 0; 2759bbb2c88SBarry Smith } 2767cdd61b2SBarry Smith PetscFunctionReturn(0); 2777cdd61b2SBarry Smith } 2787cdd61b2SBarry Smith EXTERN_C_END 2797cdd61b2SBarry Smith 2807cdd61b2SBarry Smith EXTERN_C_BEGIN 2817cdd61b2SBarry Smith #undef __FUNCT__ 2824b9ad928SBarry Smith #define __FUNCT__ "PCShellSetView_Shell" 283dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetView_Shell(PC pc,PetscErrorCode (*view)(void*,PetscViewer)) 2844b9ad928SBarry Smith { 2854b9ad928SBarry Smith PC_Shell *shell; 2864b9ad928SBarry Smith 2874b9ad928SBarry Smith PetscFunctionBegin; 2884b9ad928SBarry Smith shell = (PC_Shell*)pc->data; 2894b9ad928SBarry Smith shell->view = view; 2904b9ad928SBarry Smith PetscFunctionReturn(0); 2914b9ad928SBarry Smith } 2924b9ad928SBarry Smith EXTERN_C_END 2934b9ad928SBarry Smith 2944b9ad928SBarry Smith EXTERN_C_BEGIN 2954b9ad928SBarry Smith #undef __FUNCT__ 2964b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApplyTranspose_Shell" 297dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApplyTranspose_Shell(PC pc,PetscErrorCode (*applytranspose)(void*,Vec,Vec)) 2984b9ad928SBarry Smith { 2994b9ad928SBarry Smith PC_Shell *shell; 3004b9ad928SBarry Smith 3014b9ad928SBarry Smith PetscFunctionBegin; 3024b9ad928SBarry Smith shell = (PC_Shell*)pc->data; 3034b9ad928SBarry Smith shell->applytranspose = applytranspose; 3044b9ad928SBarry Smith PetscFunctionReturn(0); 3054b9ad928SBarry Smith } 3064b9ad928SBarry Smith EXTERN_C_END 3074b9ad928SBarry Smith 3084b9ad928SBarry Smith EXTERN_C_BEGIN 3094b9ad928SBarry Smith #undef __FUNCT__ 3104b9ad928SBarry Smith #define __FUNCT__ "PCShellSetName_Shell" 311dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetName_Shell(PC pc,const char name[]) 3124b9ad928SBarry Smith { 3134b9ad928SBarry Smith PC_Shell *shell; 314dfbe8321SBarry Smith PetscErrorCode ierr; 3154b9ad928SBarry Smith 3164b9ad928SBarry Smith PetscFunctionBegin; 3174b9ad928SBarry Smith shell = (PC_Shell*)pc->data; 3184b9ad928SBarry Smith ierr = PetscStrallocpy(name,&shell->name);CHKERRQ(ierr); 3194b9ad928SBarry Smith PetscFunctionReturn(0); 3204b9ad928SBarry Smith } 3214b9ad928SBarry Smith EXTERN_C_END 3224b9ad928SBarry Smith 3234b9ad928SBarry Smith EXTERN_C_BEGIN 3244b9ad928SBarry Smith #undef __FUNCT__ 3254b9ad928SBarry Smith #define __FUNCT__ "PCShellGetName_Shell" 326dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellGetName_Shell(PC pc,char *name[]) 3274b9ad928SBarry Smith { 3284b9ad928SBarry Smith PC_Shell *shell; 3294b9ad928SBarry Smith 3304b9ad928SBarry Smith PetscFunctionBegin; 3314b9ad928SBarry Smith shell = (PC_Shell*)pc->data; 3324b9ad928SBarry Smith *name = shell->name; 3334b9ad928SBarry Smith PetscFunctionReturn(0); 3344b9ad928SBarry Smith } 3354b9ad928SBarry Smith EXTERN_C_END 3364b9ad928SBarry Smith 3374b9ad928SBarry Smith EXTERN_C_BEGIN 3384b9ad928SBarry Smith #undef __FUNCT__ 3394b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApplyRichardson_Shell" 340*be29d3c6SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApplyRichardson_Shell(PC pc,PetscErrorCode (*apply)(void*,Vec,Vec,Vec,PetscReal,PetscReal,PetscReal,PetscInt)) 3414b9ad928SBarry Smith { 3424b9ad928SBarry Smith PC_Shell *shell; 3434b9ad928SBarry Smith 3444b9ad928SBarry Smith PetscFunctionBegin; 3454b9ad928SBarry Smith shell = (PC_Shell*)pc->data; 3464b9ad928SBarry Smith pc->ops->applyrichardson = PCApplyRichardson_Shell; 3474b9ad928SBarry Smith shell->applyrich = apply; 3484b9ad928SBarry Smith PetscFunctionReturn(0); 3494b9ad928SBarry Smith } 3504b9ad928SBarry Smith EXTERN_C_END 3514b9ad928SBarry Smith 3524b9ad928SBarry Smith /* -------------------------------------------------------------------------------*/ 3534b9ad928SBarry Smith 3544b9ad928SBarry Smith #undef __FUNCT__ 3554b9ad928SBarry Smith #define __FUNCT__ "PCShellSetSetUp" 3564b9ad928SBarry Smith /*@C 3574b9ad928SBarry Smith PCShellSetSetUp - Sets routine to use to "setup" the preconditioner whenever the 3584b9ad928SBarry Smith matrix operator is changed. 3594b9ad928SBarry Smith 3604b9ad928SBarry Smith Collective on PC 3614b9ad928SBarry Smith 3624b9ad928SBarry Smith Input Parameters: 3634b9ad928SBarry Smith + pc - the preconditioner context 3644b9ad928SBarry Smith . setup - the application-provided setup routine 3654b9ad928SBarry Smith 3664b9ad928SBarry Smith Calling sequence of setup: 3674b9ad928SBarry Smith .vb 36813f74950SBarry Smith PetscErrorCode setup (void *ptr) 3694b9ad928SBarry Smith .ve 3704b9ad928SBarry Smith 3714b9ad928SBarry Smith . ptr - the application context 3724b9ad928SBarry Smith 3734b9ad928SBarry Smith Level: developer 3744b9ad928SBarry Smith 3754b9ad928SBarry Smith .keywords: PC, shell, set, setup, user-provided 3764b9ad928SBarry Smith 377*be29d3c6SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetApply(), PCShellSetContext() 3784b9ad928SBarry Smith @*/ 379dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetSetUp(PC pc,PetscErrorCode (*setup)(void*)) 3804b9ad928SBarry Smith { 3816849ba73SBarry Smith PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*)); 3824b9ad928SBarry Smith 3834b9ad928SBarry Smith PetscFunctionBegin; 3844482741eSBarry Smith PetscValidHeaderSpecific(pc,PC_COOKIE,1); 3854b9ad928SBarry Smith ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetSetUp_C",(void (**)(void))&f);CHKERRQ(ierr); 3864b9ad928SBarry Smith if (f) { 3874b9ad928SBarry Smith ierr = (*f)(pc,setup);CHKERRQ(ierr); 3884b9ad928SBarry Smith } 3894b9ad928SBarry Smith PetscFunctionReturn(0); 3904b9ad928SBarry Smith } 3914b9ad928SBarry Smith 3924b9ad928SBarry Smith 3934b9ad928SBarry Smith #undef __FUNCT__ 3944b9ad928SBarry Smith #define __FUNCT__ "PCShellSetView" 3954b9ad928SBarry Smith /*@C 3964b9ad928SBarry Smith PCShellSetView - Sets routine to use as viewer of shell preconditioner 3974b9ad928SBarry Smith 3984b9ad928SBarry Smith Collective on PC 3994b9ad928SBarry Smith 4004b9ad928SBarry Smith Input Parameters: 4014b9ad928SBarry Smith + pc - the preconditioner context 4024b9ad928SBarry Smith - view - the application-provided view routine 4034b9ad928SBarry Smith 4044b9ad928SBarry Smith Calling sequence of apply: 4054b9ad928SBarry Smith .vb 40613f74950SBarry Smith PetscErrorCode view(void *ptr,PetscViewer v) 4074b9ad928SBarry Smith .ve 4084b9ad928SBarry Smith 4094b9ad928SBarry Smith + ptr - the application context 4104b9ad928SBarry Smith - v - viewer 4114b9ad928SBarry Smith 4124b9ad928SBarry Smith Level: developer 4134b9ad928SBarry Smith 4144b9ad928SBarry Smith .keywords: PC, shell, set, apply, user-provided 4154b9ad928SBarry Smith 4164b9ad928SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose() 4174b9ad928SBarry Smith @*/ 418dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetView(PC pc,PetscErrorCode (*view)(void*,PetscViewer)) 4194b9ad928SBarry Smith { 4206849ba73SBarry Smith PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*,PetscViewer)); 4214b9ad928SBarry Smith 4224b9ad928SBarry Smith PetscFunctionBegin; 4234482741eSBarry Smith PetscValidHeaderSpecific(pc,PC_COOKIE,1); 4244b9ad928SBarry Smith ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetView_C",(void (**)(void))&f);CHKERRQ(ierr); 4254b9ad928SBarry Smith if (f) { 4264b9ad928SBarry Smith ierr = (*f)(pc,view);CHKERRQ(ierr); 4274b9ad928SBarry Smith } 4284b9ad928SBarry Smith PetscFunctionReturn(0); 4294b9ad928SBarry Smith } 4304b9ad928SBarry Smith 4314b9ad928SBarry Smith #undef __FUNCT__ 4324b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApply" 4334b9ad928SBarry Smith /*@C 4344b9ad928SBarry Smith PCShellSetApply - Sets routine to use as preconditioner. 4354b9ad928SBarry Smith 4364b9ad928SBarry Smith Collective on PC 4374b9ad928SBarry Smith 4384b9ad928SBarry Smith Input Parameters: 4394b9ad928SBarry Smith + pc - the preconditioner context 440*be29d3c6SBarry Smith - apply - the application-provided preconditioning routine 4414b9ad928SBarry Smith 4424b9ad928SBarry Smith Calling sequence of apply: 4434b9ad928SBarry Smith .vb 44413f74950SBarry Smith PetscErrorCode apply (void *ptr,Vec xin,Vec xout) 4454b9ad928SBarry Smith .ve 4464b9ad928SBarry Smith 4474b9ad928SBarry Smith + ptr - the application context 4484b9ad928SBarry Smith . xin - input vector 4494b9ad928SBarry Smith - xout - output vector 4504b9ad928SBarry Smith 4514b9ad928SBarry Smith Level: developer 4524b9ad928SBarry Smith 4534b9ad928SBarry Smith .keywords: PC, shell, set, apply, user-provided 4544b9ad928SBarry Smith 455*be29d3c6SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose(), PCShellSetContext() 4564b9ad928SBarry Smith @*/ 457*be29d3c6SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApply(PC pc,PetscErrorCode (*apply)(void*,Vec,Vec)) 4584b9ad928SBarry Smith { 459*be29d3c6SBarry Smith PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*,Vec,Vec)); 4604b9ad928SBarry Smith 4614b9ad928SBarry Smith PetscFunctionBegin; 4624482741eSBarry Smith PetscValidHeaderSpecific(pc,PC_COOKIE,1); 4634b9ad928SBarry Smith ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetApply_C",(void (**)(void))&f);CHKERRQ(ierr); 4644b9ad928SBarry Smith if (f) { 465*be29d3c6SBarry Smith ierr = (*f)(pc,apply);CHKERRQ(ierr); 4664b9ad928SBarry Smith } 4674b9ad928SBarry Smith PetscFunctionReturn(0); 4684b9ad928SBarry Smith } 4694b9ad928SBarry Smith 4704b9ad928SBarry Smith #undef __FUNCT__ 4714b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApplyTranspose" 4724b9ad928SBarry Smith /*@C 4734b9ad928SBarry Smith PCShellSetApplyTranspose - Sets routine to use as preconditioner transpose. 4744b9ad928SBarry Smith 4754b9ad928SBarry Smith Collective on PC 4764b9ad928SBarry Smith 4774b9ad928SBarry Smith Input Parameters: 4784b9ad928SBarry Smith + pc - the preconditioner context 4794b9ad928SBarry Smith - apply - the application-provided preconditioning transpose routine 4804b9ad928SBarry Smith 4814b9ad928SBarry Smith Calling sequence of apply: 4824b9ad928SBarry Smith .vb 48313f74950SBarry Smith PetscErrorCode applytranspose (void *ptr,Vec xin,Vec xout) 4844b9ad928SBarry Smith .ve 4854b9ad928SBarry Smith 4864b9ad928SBarry Smith + ptr - the application context 4874b9ad928SBarry Smith . xin - input vector 4884b9ad928SBarry Smith - xout - output vector 4894b9ad928SBarry Smith 4904b9ad928SBarry Smith Level: developer 4914b9ad928SBarry Smith 4924b9ad928SBarry Smith Notes: 4934b9ad928SBarry Smith Uses the same context variable as PCShellSetApply(). 4944b9ad928SBarry Smith 4954b9ad928SBarry Smith .keywords: PC, shell, set, apply, user-provided 4964b9ad928SBarry Smith 497*be29d3c6SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApply(), PCSetContext() 4984b9ad928SBarry Smith @*/ 499dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApplyTranspose(PC pc,PetscErrorCode (*applytranspose)(void*,Vec,Vec)) 5004b9ad928SBarry Smith { 5016849ba73SBarry Smith PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*,Vec,Vec)); 5024b9ad928SBarry Smith 5034b9ad928SBarry Smith PetscFunctionBegin; 5044482741eSBarry Smith PetscValidHeaderSpecific(pc,PC_COOKIE,1); 5054b9ad928SBarry Smith ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetApplyTranspose_C",(void (**)(void))&f);CHKERRQ(ierr); 5064b9ad928SBarry Smith if (f) { 5074b9ad928SBarry Smith ierr = (*f)(pc,applytranspose);CHKERRQ(ierr); 5084b9ad928SBarry Smith } 5094b9ad928SBarry Smith PetscFunctionReturn(0); 5104b9ad928SBarry Smith } 5114b9ad928SBarry Smith 5124b9ad928SBarry Smith #undef __FUNCT__ 5137cdd61b2SBarry Smith #define __FUNCT__ "PCShellSetPreSolve" 5147cdd61b2SBarry Smith /*@C 5157cdd61b2SBarry Smith PCShellSetPreSolve - Sets routine to apply to the operators/vectors before a KSPSolve() is 5167cdd61b2SBarry Smith applied. This usually does something like scale the linear system in some application 5177cdd61b2SBarry Smith specific way. 5187cdd61b2SBarry Smith 5197cdd61b2SBarry Smith Collective on PC 5207cdd61b2SBarry Smith 5217cdd61b2SBarry Smith Input Parameters: 5227cdd61b2SBarry Smith + pc - the preconditioner context 5237cdd61b2SBarry Smith - presolve - the application-provided presolve routine 5247cdd61b2SBarry Smith 5257cdd61b2SBarry Smith Calling sequence of presolve: 5267cdd61b2SBarry Smith .vb 5277cdd61b2SBarry Smith PetscErrorCode presolve (void *ptr,KSP ksp,Vec b,Vec x) 5287cdd61b2SBarry Smith .ve 5297cdd61b2SBarry Smith 5307cdd61b2SBarry Smith + ptr - the application context 5317cdd61b2SBarry Smith . xin - input vector 5327cdd61b2SBarry Smith - xout - output vector 5337cdd61b2SBarry Smith 5347cdd61b2SBarry Smith Level: developer 5357cdd61b2SBarry Smith 5367cdd61b2SBarry Smith .keywords: PC, shell, set, apply, user-provided 5377cdd61b2SBarry Smith 538*be29d3c6SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose(), PCShellSetPostSolve(), PCShellSetContext() 5397cdd61b2SBarry Smith @*/ 5407cdd61b2SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetPreSolve(PC pc,PetscErrorCode (*presolve)(void*,KSP,Vec,Vec)) 5417cdd61b2SBarry Smith { 5427cdd61b2SBarry Smith PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*,KSP,Vec,Vec)); 5437cdd61b2SBarry Smith 5447cdd61b2SBarry Smith PetscFunctionBegin; 5457cdd61b2SBarry Smith PetscValidHeaderSpecific(pc,PC_COOKIE,1); 5467cdd61b2SBarry Smith ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetPreSolve_C",(void (**)(void))&f);CHKERRQ(ierr); 5477cdd61b2SBarry Smith if (f) { 5487cdd61b2SBarry Smith ierr = (*f)(pc,presolve);CHKERRQ(ierr); 5497cdd61b2SBarry Smith } 5507cdd61b2SBarry Smith PetscFunctionReturn(0); 5517cdd61b2SBarry Smith } 5527cdd61b2SBarry Smith 5537cdd61b2SBarry Smith #undef __FUNCT__ 5547cdd61b2SBarry Smith #define __FUNCT__ "PCShellSetPostSolve" 5557cdd61b2SBarry Smith /*@C 5567cdd61b2SBarry Smith PCShellSetPostSolve - Sets routine to apply to the operators/vectors before a KSPSolve() is 5577cdd61b2SBarry Smith applied. This usually does something like scale the linear system in some application 5587cdd61b2SBarry Smith specific way. 5597cdd61b2SBarry Smith 5607cdd61b2SBarry Smith Collective on PC 5617cdd61b2SBarry Smith 5627cdd61b2SBarry Smith Input Parameters: 5637cdd61b2SBarry Smith + pc - the preconditioner context 5647cdd61b2SBarry Smith - postsolve - the application-provided presolve routine 5657cdd61b2SBarry Smith 5667cdd61b2SBarry Smith Calling sequence of postsolve: 5677cdd61b2SBarry Smith .vb 5687cdd61b2SBarry Smith PetscErrorCode postsolve(void *ptr,KSP ksp,Vec b,Vec x) 5697cdd61b2SBarry Smith .ve 5707cdd61b2SBarry Smith 5717cdd61b2SBarry Smith + ptr - the application context 5727cdd61b2SBarry Smith . xin - input vector 5737cdd61b2SBarry Smith - xout - output vector 5747cdd61b2SBarry Smith 5757cdd61b2SBarry Smith Level: developer 5767cdd61b2SBarry Smith 5777cdd61b2SBarry Smith .keywords: PC, shell, set, apply, user-provided 5787cdd61b2SBarry Smith 579*be29d3c6SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose(), PCShellSetPreSolve(), PCShellSetContext() 5807cdd61b2SBarry Smith @*/ 5817cdd61b2SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetPostSolve(PC pc,PetscErrorCode (*postsolve)(void*,KSP,Vec,Vec)) 5827cdd61b2SBarry Smith { 5837cdd61b2SBarry Smith PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*,KSP,Vec,Vec)); 5847cdd61b2SBarry Smith 5857cdd61b2SBarry Smith PetscFunctionBegin; 5867cdd61b2SBarry Smith PetscValidHeaderSpecific(pc,PC_COOKIE,1); 5877cdd61b2SBarry Smith ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetPostSolve_C",(void (**)(void))&f);CHKERRQ(ierr); 5887cdd61b2SBarry Smith if (f) { 5897cdd61b2SBarry Smith ierr = (*f)(pc,postsolve);CHKERRQ(ierr); 5907cdd61b2SBarry Smith } 5917cdd61b2SBarry Smith PetscFunctionReturn(0); 5927cdd61b2SBarry Smith } 5937cdd61b2SBarry Smith 5947cdd61b2SBarry Smith #undef __FUNCT__ 5954b9ad928SBarry Smith #define __FUNCT__ "PCShellSetName" 5964b9ad928SBarry Smith /*@C 5974b9ad928SBarry Smith PCShellSetName - Sets an optional name to associate with a shell 5984b9ad928SBarry Smith preconditioner. 5994b9ad928SBarry Smith 6004b9ad928SBarry Smith Not Collective 6014b9ad928SBarry Smith 6024b9ad928SBarry Smith Input Parameters: 6034b9ad928SBarry Smith + pc - the preconditioner context 6044b9ad928SBarry Smith - name - character string describing shell preconditioner 6054b9ad928SBarry Smith 6064b9ad928SBarry Smith Level: developer 6074b9ad928SBarry Smith 6084b9ad928SBarry Smith .keywords: PC, shell, set, name, user-provided 6094b9ad928SBarry Smith 6104b9ad928SBarry Smith .seealso: PCShellGetName() 6114b9ad928SBarry Smith @*/ 612dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetName(PC pc,const char name[]) 6134b9ad928SBarry Smith { 614dfbe8321SBarry Smith PetscErrorCode ierr,(*f)(PC,const char []); 6154b9ad928SBarry Smith 6164b9ad928SBarry Smith PetscFunctionBegin; 6174482741eSBarry Smith PetscValidHeaderSpecific(pc,PC_COOKIE,1); 6184b9ad928SBarry Smith ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetName_C",(void (**)(void))&f);CHKERRQ(ierr); 6194b9ad928SBarry Smith if (f) { 6204b9ad928SBarry Smith ierr = (*f)(pc,name);CHKERRQ(ierr); 6214b9ad928SBarry Smith } 6224b9ad928SBarry Smith PetscFunctionReturn(0); 6234b9ad928SBarry Smith } 6244b9ad928SBarry Smith 6254b9ad928SBarry Smith #undef __FUNCT__ 6264b9ad928SBarry Smith #define __FUNCT__ "PCShellGetName" 6274b9ad928SBarry Smith /*@C 6284b9ad928SBarry Smith PCShellGetName - Gets an optional name that the user has set for a shell 6294b9ad928SBarry Smith preconditioner. 6304b9ad928SBarry Smith 6314b9ad928SBarry Smith Not Collective 6324b9ad928SBarry Smith 6334b9ad928SBarry Smith Input Parameter: 6344b9ad928SBarry Smith . pc - the preconditioner context 6354b9ad928SBarry Smith 6364b9ad928SBarry Smith Output Parameter: 6374b9ad928SBarry Smith . name - character string describing shell preconditioner (you should not free this) 6384b9ad928SBarry Smith 6394b9ad928SBarry Smith Level: developer 6404b9ad928SBarry Smith 6414b9ad928SBarry Smith .keywords: PC, shell, get, name, user-provided 6424b9ad928SBarry Smith 6434b9ad928SBarry Smith .seealso: PCShellSetName() 6444b9ad928SBarry Smith @*/ 645dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellGetName(PC pc,char *name[]) 6464b9ad928SBarry Smith { 647dfbe8321SBarry Smith PetscErrorCode ierr,(*f)(PC,char *[]); 6484b9ad928SBarry Smith 6494b9ad928SBarry Smith PetscFunctionBegin; 6504482741eSBarry Smith PetscValidHeaderSpecific(pc,PC_COOKIE,1); 6514482741eSBarry Smith PetscValidPointer(name,2); 6524b9ad928SBarry Smith ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellGetName_C",(void (**)(void))&f);CHKERRQ(ierr); 6534b9ad928SBarry Smith if (f) { 6544b9ad928SBarry Smith ierr = (*f)(pc,name);CHKERRQ(ierr); 6554b9ad928SBarry Smith } else { 6561302d50aSBarry Smith SETERRQ(PETSC_ERR_ARG_WRONG,"Not shell preconditioner, cannot get name"); 6574b9ad928SBarry Smith } 6584b9ad928SBarry Smith PetscFunctionReturn(0); 6594b9ad928SBarry Smith } 6604b9ad928SBarry Smith 6614b9ad928SBarry Smith #undef __FUNCT__ 6624b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApplyRichardson" 6634b9ad928SBarry Smith /*@C 6644b9ad928SBarry Smith PCShellSetApplyRichardson - Sets routine to use as preconditioner 6654b9ad928SBarry Smith in Richardson iteration. 6664b9ad928SBarry Smith 6674b9ad928SBarry Smith Collective on PC 6684b9ad928SBarry Smith 6694b9ad928SBarry Smith Input Parameters: 6704b9ad928SBarry Smith + pc - the preconditioner context 671*be29d3c6SBarry Smith - apply - the application-provided preconditioning routine 6724b9ad928SBarry Smith 6734b9ad928SBarry Smith Calling sequence of apply: 6744b9ad928SBarry Smith .vb 67513f74950SBarry Smith PetscErrorCode apply (void *ptr,Vec b,Vec x,Vec r,PetscReal rtol,PetscReal abstol,PetscReal dtol,PetscInt maxits) 6764b9ad928SBarry Smith .ve 6774b9ad928SBarry Smith 6784b9ad928SBarry Smith + ptr - the application context 6794b9ad928SBarry Smith . b - right-hand-side 6804b9ad928SBarry Smith . x - current iterate 6814b9ad928SBarry Smith . r - work space 6824b9ad928SBarry Smith . rtol - relative tolerance of residual norm to stop at 68370441072SBarry Smith . abstol - absolute tolerance of residual norm to stop at 6844b9ad928SBarry Smith . dtol - if residual norm increases by this factor than return 6854b9ad928SBarry Smith - maxits - number of iterations to run 6864b9ad928SBarry Smith 6874b9ad928SBarry Smith Level: developer 6884b9ad928SBarry Smith 6894b9ad928SBarry Smith .keywords: PC, shell, set, apply, Richardson, user-provided 6904b9ad928SBarry Smith 691*be29d3c6SBarry Smith .seealso: PCShellSetApply(), PCShellSetContext() 6924b9ad928SBarry Smith @*/ 693*be29d3c6SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApplyRichardson(PC pc,PetscErrorCode (*apply)(void*,Vec,Vec,Vec,PetscReal,PetscReal,PetscReal,PetscInt)) 6944b9ad928SBarry Smith { 695*be29d3c6SBarry Smith PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*,Vec,Vec,Vec,PetscReal,PetscReal,PetscReal,PetscInt)); 6964b9ad928SBarry Smith 6974b9ad928SBarry Smith PetscFunctionBegin; 6984482741eSBarry Smith PetscValidHeaderSpecific(pc,PC_COOKIE,1); 6994b9ad928SBarry Smith ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetApplyRichardson_C",(void (**)(void))&f);CHKERRQ(ierr); 7004b9ad928SBarry Smith if (f) { 701*be29d3c6SBarry Smith ierr = (*f)(pc,apply);CHKERRQ(ierr); 7024b9ad928SBarry Smith } 7034b9ad928SBarry Smith PetscFunctionReturn(0); 7044b9ad928SBarry Smith } 7054b9ad928SBarry Smith 7064b9ad928SBarry Smith /*MC 7074b9ad928SBarry Smith PCSHELL - Creates a new preconditioner class for use with your 7084b9ad928SBarry Smith own private data storage format. 7094b9ad928SBarry Smith 7104b9ad928SBarry Smith Level: advanced 7114b9ad928SBarry Smith 7124b9ad928SBarry Smith Concepts: providing your own preconditioner 7134b9ad928SBarry Smith 7144b9ad928SBarry Smith Usage: 7156849ba73SBarry Smith $ PetscErrorCode (*mult)(void*,Vec,Vec); 7166849ba73SBarry Smith $ PetscErrorCode (*setup)(void*); 7174b9ad928SBarry Smith $ PCCreate(comm,&pc); 7184b9ad928SBarry Smith $ PCSetType(pc,PCSHELL); 719*be29d3c6SBarry Smith $ PCShellSetApply(pc,mult); 720*be29d3c6SBarry Smith $ PCShellSetContext(pc,ctx) 7214b9ad928SBarry Smith $ PCShellSetSetUp(pc,setup); (optional) 7224b9ad928SBarry Smith 7234b9ad928SBarry Smith .seealso: PCCreate(), PCSetType(), PCType (for list of available types), PC, 724d07a9264SSatish Balay MATSHELL, PCShellSetUp(), PCShellSetApply(), PCShellSetView(), 7254b9ad928SBarry Smith PCShellSetApplyTranpose(), PCShellSetName(), PCShellSetApplyRichardson(), 726*be29d3c6SBarry Smith PCShellGetName(), PCShellSetContext(), PCShellGetContext() 7274b9ad928SBarry Smith M*/ 7284b9ad928SBarry Smith 7294b9ad928SBarry Smith EXTERN_C_BEGIN 7304b9ad928SBarry Smith #undef __FUNCT__ 7314b9ad928SBarry Smith #define __FUNCT__ "PCCreate_Shell" 732dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCCreate_Shell(PC pc) 7334b9ad928SBarry Smith { 734dfbe8321SBarry Smith PetscErrorCode ierr; 7354b9ad928SBarry Smith PC_Shell *shell; 7364b9ad928SBarry Smith 7374b9ad928SBarry Smith PetscFunctionBegin; 7384b9ad928SBarry Smith pc->ops->destroy = PCDestroy_Shell; 7394b9ad928SBarry Smith ierr = PetscNew(PC_Shell,&shell);CHKERRQ(ierr); 74052e6d16bSBarry Smith ierr = PetscLogObjectMemory(pc,sizeof(PC_Shell));CHKERRQ(ierr); 7414b9ad928SBarry Smith pc->data = (void*)shell; 7424b9ad928SBarry Smith pc->name = 0; 7434b9ad928SBarry Smith 7444b9ad928SBarry Smith pc->ops->apply = PCApply_Shell; 7454b9ad928SBarry Smith pc->ops->view = PCView_Shell; 7464b9ad928SBarry Smith pc->ops->applytranspose = PCApplyTranspose_Shell; 7474b9ad928SBarry Smith pc->ops->applyrichardson = 0; 7484b9ad928SBarry Smith pc->ops->setup = PCSetUp_Shell; 7499bbb2c88SBarry Smith pc->ops->presolve = 0; 7509bbb2c88SBarry Smith pc->ops->postsolve = 0; 7514b9ad928SBarry Smith pc->ops->view = PCView_Shell; 7524b9ad928SBarry Smith 7534b9ad928SBarry Smith shell->apply = 0; 7544b9ad928SBarry Smith shell->applytranspose = 0; 7554b9ad928SBarry Smith shell->name = 0; 7564b9ad928SBarry Smith shell->applyrich = 0; 7577cdd61b2SBarry Smith shell->presolve = 0; 7587cdd61b2SBarry Smith shell->postsolve = 0; 7594b9ad928SBarry Smith shell->ctx = 0; 7604b9ad928SBarry Smith shell->setup = 0; 7614b9ad928SBarry Smith shell->view = 0; 7624b9ad928SBarry Smith 7634b9ad928SBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetSetUp_C","PCShellSetSetUp_Shell", 7644b9ad928SBarry Smith PCShellSetSetUp_Shell);CHKERRQ(ierr); 7654b9ad928SBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetApply_C","PCShellSetApply_Shell", 7664b9ad928SBarry Smith PCShellSetApply_Shell);CHKERRQ(ierr); 7677cdd61b2SBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetPreSolve_C","PCShellSetPreSolve_Shell", 7687cdd61b2SBarry Smith PCShellSetPreSolve_Shell);CHKERRQ(ierr); 7697cdd61b2SBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetPostSolve_C","PCShellSetPostSolve_Shell", 7707cdd61b2SBarry Smith PCShellSetPostSolve_Shell);CHKERRQ(ierr); 7714b9ad928SBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetView_C","PCShellSetView_Shell", 7724b9ad928SBarry Smith PCShellSetView_Shell);CHKERRQ(ierr); 773*be29d3c6SBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetApplyTranspose_C","PCShellSetApplyTranspose_Shell", 7744b9ad928SBarry Smith PCShellSetApplyTranspose_Shell);CHKERRQ(ierr); 7754b9ad928SBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetName_C","PCShellSetName_Shell", 7764b9ad928SBarry Smith PCShellSetName_Shell);CHKERRQ(ierr); 7774b9ad928SBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellGetName_C","PCShellGetName_Shell", 7784b9ad928SBarry Smith PCShellGetName_Shell);CHKERRQ(ierr); 779*be29d3c6SBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetApplyRichardson_C","PCShellSetApplyRichardson_Shell", 7804b9ad928SBarry Smith PCShellSetApplyRichardson_Shell);CHKERRQ(ierr); 7814b9ad928SBarry Smith PetscFunctionReturn(0); 7824b9ad928SBarry Smith } 7834b9ad928SBarry Smith EXTERN_C_END 7844b9ad928SBarry Smith 7854b9ad928SBarry Smith 7864b9ad928SBarry Smith 7874b9ad928SBarry Smith 7884b9ad928SBarry Smith 7894b9ad928SBarry Smith 790