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*/ 9*1d8d5f9aSSatish Balay #include "private/vecimpl.h" 104b9ad928SBarry Smith 11ac226902SBarry Smith EXTERN_C_BEGIN 124b9ad928SBarry Smith typedef struct { 13be29d3c6SBarry Smith void *ctx; /* user provided contexts for preconditioner */ 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__ 26be29d3c6SBarry Smith #define __FUNCT__ "PCShellGetContext" 27be29d3c6SBarry Smith /*@ 28be29d3c6SBarry Smith PCShellGetContext - Returns the user-provided context associated with a shell PC 29be29d3c6SBarry Smith 30be29d3c6SBarry Smith Not Collective 31be29d3c6SBarry Smith 32be29d3c6SBarry Smith Input Parameter: 33be29d3c6SBarry Smith . pc - should have been created with PCCreateShell() 34be29d3c6SBarry Smith 35be29d3c6SBarry Smith Output Parameter: 36be29d3c6SBarry Smith . ctx - the user provided context 37be29d3c6SBarry Smith 38be29d3c6SBarry Smith Level: advanced 39be29d3c6SBarry Smith 40be29d3c6SBarry Smith Notes: 41be29d3c6SBarry Smith This routine is intended for use within various shell routines 42be29d3c6SBarry Smith 43be29d3c6SBarry Smith .keywords: PC, shell, get, context 44be29d3c6SBarry Smith 45be29d3c6SBarry Smith .seealso: PCCreateShell(), PCShellSetContext() 46be29d3c6SBarry Smith @*/ 47be29d3c6SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellGetContext(PC pc,void **ctx) 48be29d3c6SBarry Smith { 49be29d3c6SBarry Smith PetscErrorCode ierr; 50be29d3c6SBarry Smith PetscTruth flg; 51be29d3c6SBarry Smith 52be29d3c6SBarry Smith PetscFunctionBegin; 53be29d3c6SBarry Smith PetscValidHeaderSpecific(pc,PC_COOKIE,1); 54be29d3c6SBarry Smith PetscValidPointer(ctx,2); 55be29d3c6SBarry Smith ierr = PetscTypeCompare((PetscObject)pc,PCSHELL,&flg);CHKERRQ(ierr); 56be29d3c6SBarry Smith if (!flg) *ctx = 0; 57be29d3c6SBarry Smith else *ctx = ((PC_Shell*)(pc->data))->ctx; 58be29d3c6SBarry Smith PetscFunctionReturn(0); 59be29d3c6SBarry Smith } 60be29d3c6SBarry Smith 61be29d3c6SBarry Smith #undef __FUNCT__ 62be29d3c6SBarry Smith #define __FUNCT__ "PCShellSetContext" 63be29d3c6SBarry Smith /*@C 64be29d3c6SBarry Smith PCShellSetContext - sets the context for a shell PC 65be29d3c6SBarry Smith 66be29d3c6SBarry Smith Collective on PC 67be29d3c6SBarry Smith 68be29d3c6SBarry Smith Input Parameters: 69be29d3c6SBarry Smith + pc - the shell PC 70be29d3c6SBarry Smith - ctx - the context 71be29d3c6SBarry Smith 72be29d3c6SBarry Smith Level: advanced 73be29d3c6SBarry Smith 74be29d3c6SBarry Smith Fortran Notes: The context can only be an integer or a PetscObject 75be29d3c6SBarry Smith unfortunately it cannot be a Fortran array or derived type. 76be29d3c6SBarry Smith 77be29d3c6SBarry Smith .seealso: PCCreateShell(), PCShellGetContext() 78be29d3c6SBarry Smith @*/ 79be29d3c6SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetContext(PC pc,void *ctx) 80be29d3c6SBarry Smith { 81be29d3c6SBarry Smith PC_Shell *shell = (PC_Shell*)pc->data; 82be29d3c6SBarry Smith PetscErrorCode ierr; 83be29d3c6SBarry Smith PetscTruth flg; 84be29d3c6SBarry Smith 85be29d3c6SBarry Smith PetscFunctionBegin; 86be29d3c6SBarry Smith PetscValidHeaderSpecific(pc,PC_COOKIE,1); 87be29d3c6SBarry Smith ierr = PetscTypeCompare((PetscObject)pc,PCSHELL,&flg);CHKERRQ(ierr); 88be29d3c6SBarry Smith if (flg) { 89be29d3c6SBarry Smith shell->ctx = ctx; 90be29d3c6SBarry Smith } 91be29d3c6SBarry Smith PetscFunctionReturn(0); 92be29d3c6SBarry Smith } 93be29d3c6SBarry Smith 94be29d3c6SBarry 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) { 104e9a2bbcdSBarry Smith CHKMEMQ; 1054b9ad928SBarry Smith ierr = (*shell->setup)(shell->ctx);CHKERRQ(ierr); 106e9a2bbcdSBarry Smith CHKMEMQ; 1074b9ad928SBarry Smith } 1084b9ad928SBarry Smith PetscFunctionReturn(0); 1094b9ad928SBarry Smith } 1104b9ad928SBarry Smith 1114b9ad928SBarry Smith #undef __FUNCT__ 1124b9ad928SBarry Smith #define __FUNCT__ "PCApply_Shell" 1136849ba73SBarry Smith static PetscErrorCode PCApply_Shell(PC pc,Vec x,Vec y) 1144b9ad928SBarry Smith { 1154b9ad928SBarry Smith PC_Shell *shell; 116dfbe8321SBarry Smith PetscErrorCode ierr; 1174b9ad928SBarry Smith 1184b9ad928SBarry Smith PetscFunctionBegin; 1194b9ad928SBarry Smith shell = (PC_Shell*)pc->data; 1201302d50aSBarry Smith if (!shell->apply) SETERRQ(PETSC_ERR_USER,"No apply() routine provided to Shell PC"); 121e9a2bbcdSBarry Smith PetscStackPush("PCSHELL user function"); 122e9a2bbcdSBarry Smith CHKMEMQ; 1234b9ad928SBarry Smith ierr = (*shell->apply)(shell->ctx,x,y);CHKERRQ(ierr); 124e9a2bbcdSBarry Smith CHKMEMQ; 125e9a2bbcdSBarry Smith PetscStackPop; 1264b9ad928SBarry Smith PetscFunctionReturn(0); 1274b9ad928SBarry Smith } 1284b9ad928SBarry Smith 1294b9ad928SBarry Smith #undef __FUNCT__ 1307cdd61b2SBarry Smith #define __FUNCT__ "PCPreSolve_Shell" 1317cdd61b2SBarry Smith static PetscErrorCode PCPreSolve_Shell(PC pc,KSP ksp,Vec b,Vec x) 1327cdd61b2SBarry Smith { 1337cdd61b2SBarry Smith PC_Shell *shell; 1347cdd61b2SBarry Smith PetscErrorCode ierr; 1357cdd61b2SBarry Smith 1367cdd61b2SBarry Smith PetscFunctionBegin; 1377cdd61b2SBarry Smith shell = (PC_Shell*)pc->data; 13891ad8336SSatish Balay if (!shell->presolve) SETERRQ(PETSC_ERR_USER,"No presolve() routine provided to Shell PC"); 1397cdd61b2SBarry Smith ierr = (*shell->presolve)(shell->ctx,ksp,b,x);CHKERRQ(ierr); 1407cdd61b2SBarry Smith PetscFunctionReturn(0); 1417cdd61b2SBarry Smith } 1427cdd61b2SBarry Smith 1437cdd61b2SBarry Smith #undef __FUNCT__ 1447cdd61b2SBarry Smith #define __FUNCT__ "PCPostSolve_Shell" 1457cdd61b2SBarry Smith static PetscErrorCode PCPostSolve_Shell(PC pc,KSP ksp,Vec b,Vec x) 1467cdd61b2SBarry Smith { 1477cdd61b2SBarry Smith PC_Shell *shell; 1487cdd61b2SBarry Smith PetscErrorCode ierr; 1497cdd61b2SBarry Smith 1507cdd61b2SBarry Smith PetscFunctionBegin; 1517cdd61b2SBarry Smith shell = (PC_Shell*)pc->data; 15291ad8336SSatish Balay if (!shell->postsolve) SETERRQ(PETSC_ERR_USER,"No postsolve() routine provided to Shell PC"); 15391ad8336SSatish Balay ierr = (*shell->postsolve)(shell->ctx,ksp,b,x);CHKERRQ(ierr); 1547cdd61b2SBarry Smith PetscFunctionReturn(0); 1557cdd61b2SBarry Smith } 1567cdd61b2SBarry Smith 1577cdd61b2SBarry Smith #undef __FUNCT__ 1584b9ad928SBarry Smith #define __FUNCT__ "PCApplyTranspose_Shell" 1596849ba73SBarry Smith static PetscErrorCode PCApplyTranspose_Shell(PC pc,Vec x,Vec y) 1604b9ad928SBarry Smith { 1614b9ad928SBarry Smith PC_Shell *shell; 162dfbe8321SBarry Smith PetscErrorCode ierr; 1634b9ad928SBarry Smith 1644b9ad928SBarry Smith PetscFunctionBegin; 1654b9ad928SBarry Smith shell = (PC_Shell*)pc->data; 1661302d50aSBarry Smith if (!shell->applytranspose) SETERRQ(PETSC_ERR_USER,"No applytranspose() routine provided to Shell PC"); 1674b9ad928SBarry Smith ierr = (*shell->applytranspose)(shell->ctx,x,y);CHKERRQ(ierr); 1684b9ad928SBarry Smith PetscFunctionReturn(0); 1694b9ad928SBarry Smith } 1704b9ad928SBarry Smith 1714b9ad928SBarry Smith #undef __FUNCT__ 1724b9ad928SBarry Smith #define __FUNCT__ "PCApplyRichardson_Shell" 17313f74950SBarry Smith static PetscErrorCode PCApplyRichardson_Shell(PC pc,Vec x,Vec y,Vec w,PetscReal rtol,PetscReal abstol, PetscReal dtol,PetscInt it) 1744b9ad928SBarry Smith { 175dfbe8321SBarry Smith PetscErrorCode ierr; 1764b9ad928SBarry Smith PC_Shell *shell; 1774b9ad928SBarry Smith 1784b9ad928SBarry Smith PetscFunctionBegin; 1794b9ad928SBarry Smith shell = (PC_Shell*)pc->data; 180be29d3c6SBarry Smith ierr = (*shell->applyrich)(shell->ctx,x,y,w,rtol,abstol,dtol,it);CHKERRQ(ierr); 1814b9ad928SBarry Smith PetscFunctionReturn(0); 1824b9ad928SBarry Smith } 1834b9ad928SBarry Smith 1844b9ad928SBarry Smith #undef __FUNCT__ 1854b9ad928SBarry Smith #define __FUNCT__ "PCDestroy_Shell" 1866849ba73SBarry Smith static PetscErrorCode PCDestroy_Shell(PC pc) 1874b9ad928SBarry Smith { 1884b9ad928SBarry Smith PC_Shell *shell = (PC_Shell*)pc->data; 189dfbe8321SBarry Smith PetscErrorCode ierr; 1904b9ad928SBarry Smith 1914b9ad928SBarry Smith PetscFunctionBegin; 1924b9ad928SBarry Smith if (shell->name) {ierr = PetscFree(shell->name);} 1934b9ad928SBarry Smith ierr = PetscFree(shell);CHKERRQ(ierr); 1944b9ad928SBarry Smith PetscFunctionReturn(0); 1954b9ad928SBarry Smith } 1964b9ad928SBarry Smith 1974b9ad928SBarry Smith #undef __FUNCT__ 1984b9ad928SBarry Smith #define __FUNCT__ "PCView_Shell" 1996849ba73SBarry Smith static PetscErrorCode PCView_Shell(PC pc,PetscViewer viewer) 2004b9ad928SBarry Smith { 2014b9ad928SBarry Smith PC_Shell *shell = (PC_Shell*)pc->data; 202dfbe8321SBarry Smith PetscErrorCode ierr; 20332077d6dSBarry Smith PetscTruth iascii; 2044b9ad928SBarry Smith 2054b9ad928SBarry Smith PetscFunctionBegin; 20632077d6dSBarry Smith ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_ASCII,&iascii);CHKERRQ(ierr); 20732077d6dSBarry Smith if (iascii) { 2084b9ad928SBarry Smith if (shell->name) {ierr = PetscViewerASCIIPrintf(viewer," Shell: %s\n",shell->name);CHKERRQ(ierr);} 2094b9ad928SBarry Smith else {ierr = PetscViewerASCIIPrintf(viewer," Shell: no name\n");CHKERRQ(ierr);} 2104b9ad928SBarry Smith } 2114b9ad928SBarry Smith if (shell->view) { 2124b9ad928SBarry Smith ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 2134b9ad928SBarry Smith ierr = (*shell->view)(shell->ctx,viewer);CHKERRQ(ierr); 2144b9ad928SBarry Smith ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 2154b9ad928SBarry Smith } 2164b9ad928SBarry Smith PetscFunctionReturn(0); 2174b9ad928SBarry Smith } 2184b9ad928SBarry Smith 2194b9ad928SBarry Smith /* ------------------------------------------------------------------------------*/ 2204b9ad928SBarry Smith EXTERN_C_BEGIN 2214b9ad928SBarry Smith #undef __FUNCT__ 2224b9ad928SBarry Smith #define __FUNCT__ "PCShellSetSetUp_Shell" 223dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetSetUp_Shell(PC pc, PetscErrorCode (*setup)(void*)) 2244b9ad928SBarry Smith { 2254b9ad928SBarry Smith PC_Shell *shell; 2264b9ad928SBarry Smith 2274b9ad928SBarry Smith PetscFunctionBegin; 2284b9ad928SBarry Smith shell = (PC_Shell*)pc->data; 2294b9ad928SBarry Smith shell->setup = setup; 2304b9ad928SBarry Smith PetscFunctionReturn(0); 2314b9ad928SBarry Smith } 2324b9ad928SBarry Smith EXTERN_C_END 2334b9ad928SBarry Smith 2344b9ad928SBarry Smith EXTERN_C_BEGIN 2354b9ad928SBarry Smith #undef __FUNCT__ 2364b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApply_Shell" 237be29d3c6SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApply_Shell(PC pc,PetscErrorCode (*apply)(void*,Vec,Vec)) 2384b9ad928SBarry Smith { 2394b9ad928SBarry Smith PC_Shell *shell; 2404b9ad928SBarry Smith 2414b9ad928SBarry Smith PetscFunctionBegin; 2424b9ad928SBarry Smith shell = (PC_Shell*)pc->data; 2434b9ad928SBarry Smith shell->apply = apply; 2444b9ad928SBarry Smith PetscFunctionReturn(0); 2454b9ad928SBarry Smith } 2464b9ad928SBarry Smith EXTERN_C_END 2474b9ad928SBarry Smith 2484b9ad928SBarry Smith EXTERN_C_BEGIN 2494b9ad928SBarry Smith #undef __FUNCT__ 2507cdd61b2SBarry Smith #define __FUNCT__ "PCShellSetPreSolve_Shell" 251be29d3c6SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetPreSolve_Shell(PC pc,PetscErrorCode (*presolve)(void*,KSP,Vec,Vec)) 2527cdd61b2SBarry Smith { 2537cdd61b2SBarry Smith PC_Shell *shell; 2547cdd61b2SBarry Smith 2557cdd61b2SBarry Smith PetscFunctionBegin; 2567cdd61b2SBarry Smith shell = (PC_Shell*)pc->data; 2577cdd61b2SBarry Smith shell->presolve = presolve; 2589bbb2c88SBarry Smith if (presolve) { 2599bbb2c88SBarry Smith pc->ops->presolve = PCPreSolve_Shell; 2609bbb2c88SBarry Smith } else { 2619bbb2c88SBarry Smith pc->ops->presolve = 0; 2629bbb2c88SBarry Smith } 2637cdd61b2SBarry Smith PetscFunctionReturn(0); 2647cdd61b2SBarry Smith } 2657cdd61b2SBarry Smith EXTERN_C_END 2667cdd61b2SBarry Smith 2677cdd61b2SBarry Smith EXTERN_C_BEGIN 2687cdd61b2SBarry Smith #undef __FUNCT__ 2697cdd61b2SBarry Smith #define __FUNCT__ "PCShellSetPostSolve_Shell" 270be29d3c6SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetPostSolve_Shell(PC pc,PetscErrorCode (*postsolve)(void*,KSP,Vec,Vec)) 2717cdd61b2SBarry Smith { 2727cdd61b2SBarry Smith PC_Shell *shell; 2737cdd61b2SBarry Smith 2747cdd61b2SBarry Smith PetscFunctionBegin; 2757cdd61b2SBarry Smith shell = (PC_Shell*)pc->data; 2767cdd61b2SBarry Smith shell->postsolve = postsolve; 2779bbb2c88SBarry Smith if (postsolve) { 2789bbb2c88SBarry Smith pc->ops->postsolve = PCPostSolve_Shell; 2799bbb2c88SBarry Smith } else { 2809bbb2c88SBarry Smith pc->ops->postsolve = 0; 2819bbb2c88SBarry Smith } 2827cdd61b2SBarry Smith PetscFunctionReturn(0); 2837cdd61b2SBarry Smith } 2847cdd61b2SBarry Smith EXTERN_C_END 2857cdd61b2SBarry Smith 2867cdd61b2SBarry Smith EXTERN_C_BEGIN 2877cdd61b2SBarry Smith #undef __FUNCT__ 2884b9ad928SBarry Smith #define __FUNCT__ "PCShellSetView_Shell" 289dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetView_Shell(PC pc,PetscErrorCode (*view)(void*,PetscViewer)) 2904b9ad928SBarry Smith { 2914b9ad928SBarry Smith PC_Shell *shell; 2924b9ad928SBarry Smith 2934b9ad928SBarry Smith PetscFunctionBegin; 2944b9ad928SBarry Smith shell = (PC_Shell*)pc->data; 2954b9ad928SBarry Smith shell->view = view; 2964b9ad928SBarry Smith PetscFunctionReturn(0); 2974b9ad928SBarry Smith } 2984b9ad928SBarry Smith EXTERN_C_END 2994b9ad928SBarry Smith 3004b9ad928SBarry Smith EXTERN_C_BEGIN 3014b9ad928SBarry Smith #undef __FUNCT__ 3024b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApplyTranspose_Shell" 303dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApplyTranspose_Shell(PC pc,PetscErrorCode (*applytranspose)(void*,Vec,Vec)) 3044b9ad928SBarry Smith { 3054b9ad928SBarry Smith PC_Shell *shell; 3064b9ad928SBarry Smith 3074b9ad928SBarry Smith PetscFunctionBegin; 3084b9ad928SBarry Smith shell = (PC_Shell*)pc->data; 3094b9ad928SBarry Smith shell->applytranspose = applytranspose; 3104b9ad928SBarry Smith PetscFunctionReturn(0); 3114b9ad928SBarry Smith } 3124b9ad928SBarry Smith EXTERN_C_END 3134b9ad928SBarry Smith 3144b9ad928SBarry Smith EXTERN_C_BEGIN 3154b9ad928SBarry Smith #undef __FUNCT__ 3164b9ad928SBarry Smith #define __FUNCT__ "PCShellSetName_Shell" 317dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetName_Shell(PC pc,const char name[]) 3184b9ad928SBarry Smith { 3194b9ad928SBarry Smith PC_Shell *shell; 320dfbe8321SBarry Smith PetscErrorCode ierr; 3214b9ad928SBarry Smith 3224b9ad928SBarry Smith PetscFunctionBegin; 3234b9ad928SBarry Smith shell = (PC_Shell*)pc->data; 3244b9ad928SBarry Smith ierr = PetscStrallocpy(name,&shell->name);CHKERRQ(ierr); 3254b9ad928SBarry Smith PetscFunctionReturn(0); 3264b9ad928SBarry Smith } 3274b9ad928SBarry Smith EXTERN_C_END 3284b9ad928SBarry Smith 3294b9ad928SBarry Smith EXTERN_C_BEGIN 3304b9ad928SBarry Smith #undef __FUNCT__ 3314b9ad928SBarry Smith #define __FUNCT__ "PCShellGetName_Shell" 332dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellGetName_Shell(PC pc,char *name[]) 3334b9ad928SBarry Smith { 3344b9ad928SBarry Smith PC_Shell *shell; 3354b9ad928SBarry Smith 3364b9ad928SBarry Smith PetscFunctionBegin; 3374b9ad928SBarry Smith shell = (PC_Shell*)pc->data; 3384b9ad928SBarry Smith *name = shell->name; 3394b9ad928SBarry Smith PetscFunctionReturn(0); 3404b9ad928SBarry Smith } 3414b9ad928SBarry Smith EXTERN_C_END 3424b9ad928SBarry Smith 3434b9ad928SBarry Smith EXTERN_C_BEGIN 3444b9ad928SBarry Smith #undef __FUNCT__ 3454b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApplyRichardson_Shell" 346be29d3c6SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApplyRichardson_Shell(PC pc,PetscErrorCode (*apply)(void*,Vec,Vec,Vec,PetscReal,PetscReal,PetscReal,PetscInt)) 3474b9ad928SBarry Smith { 3484b9ad928SBarry Smith PC_Shell *shell; 3494b9ad928SBarry Smith 3504b9ad928SBarry Smith PetscFunctionBegin; 3514b9ad928SBarry Smith shell = (PC_Shell*)pc->data; 3524b9ad928SBarry Smith pc->ops->applyrichardson = PCApplyRichardson_Shell; 3534b9ad928SBarry Smith shell->applyrich = apply; 3544b9ad928SBarry Smith PetscFunctionReturn(0); 3554b9ad928SBarry Smith } 3564b9ad928SBarry Smith EXTERN_C_END 3574b9ad928SBarry Smith 3584b9ad928SBarry Smith /* -------------------------------------------------------------------------------*/ 3594b9ad928SBarry Smith 3604b9ad928SBarry Smith #undef __FUNCT__ 3614b9ad928SBarry Smith #define __FUNCT__ "PCShellSetSetUp" 3624b9ad928SBarry Smith /*@C 3634b9ad928SBarry Smith PCShellSetSetUp - Sets routine to use to "setup" the preconditioner whenever the 3644b9ad928SBarry Smith matrix operator is changed. 3654b9ad928SBarry Smith 3664b9ad928SBarry Smith Collective on PC 3674b9ad928SBarry Smith 3684b9ad928SBarry Smith Input Parameters: 3694b9ad928SBarry Smith + pc - the preconditioner context 3704b9ad928SBarry Smith . setup - the application-provided setup routine 3714b9ad928SBarry Smith 3724b9ad928SBarry Smith Calling sequence of setup: 3734b9ad928SBarry Smith .vb 37413f74950SBarry Smith PetscErrorCode setup (void *ptr) 3754b9ad928SBarry Smith .ve 3764b9ad928SBarry Smith 3774b9ad928SBarry Smith . ptr - the application context 3784b9ad928SBarry Smith 3794b9ad928SBarry Smith Level: developer 3804b9ad928SBarry Smith 3814b9ad928SBarry Smith .keywords: PC, shell, set, setup, user-provided 3824b9ad928SBarry Smith 383be29d3c6SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetApply(), PCShellSetContext() 3844b9ad928SBarry Smith @*/ 385dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetSetUp(PC pc,PetscErrorCode (*setup)(void*)) 3864b9ad928SBarry Smith { 3876849ba73SBarry Smith PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*)); 3884b9ad928SBarry Smith 3894b9ad928SBarry Smith PetscFunctionBegin; 3904482741eSBarry Smith PetscValidHeaderSpecific(pc,PC_COOKIE,1); 3914b9ad928SBarry Smith ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetSetUp_C",(void (**)(void))&f);CHKERRQ(ierr); 3924b9ad928SBarry Smith if (f) { 3934b9ad928SBarry Smith ierr = (*f)(pc,setup);CHKERRQ(ierr); 3944b9ad928SBarry Smith } 3954b9ad928SBarry Smith PetscFunctionReturn(0); 3964b9ad928SBarry Smith } 3974b9ad928SBarry Smith 3984b9ad928SBarry Smith 3994b9ad928SBarry Smith #undef __FUNCT__ 4004b9ad928SBarry Smith #define __FUNCT__ "PCShellSetView" 4014b9ad928SBarry Smith /*@C 4024b9ad928SBarry Smith PCShellSetView - Sets routine to use as viewer of shell preconditioner 4034b9ad928SBarry Smith 4044b9ad928SBarry Smith Collective on PC 4054b9ad928SBarry Smith 4064b9ad928SBarry Smith Input Parameters: 4074b9ad928SBarry Smith + pc - the preconditioner context 4084b9ad928SBarry Smith - view - the application-provided view routine 4094b9ad928SBarry Smith 4104b9ad928SBarry Smith Calling sequence of apply: 4114b9ad928SBarry Smith .vb 41213f74950SBarry Smith PetscErrorCode view(void *ptr,PetscViewer v) 4134b9ad928SBarry Smith .ve 4144b9ad928SBarry Smith 4154b9ad928SBarry Smith + ptr - the application context 4164b9ad928SBarry Smith - v - viewer 4174b9ad928SBarry Smith 4184b9ad928SBarry Smith Level: developer 4194b9ad928SBarry Smith 4204b9ad928SBarry Smith .keywords: PC, shell, set, apply, user-provided 4214b9ad928SBarry Smith 4224b9ad928SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose() 4234b9ad928SBarry Smith @*/ 424dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetView(PC pc,PetscErrorCode (*view)(void*,PetscViewer)) 4254b9ad928SBarry Smith { 4266849ba73SBarry Smith PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*,PetscViewer)); 4274b9ad928SBarry Smith 4284b9ad928SBarry Smith PetscFunctionBegin; 4294482741eSBarry Smith PetscValidHeaderSpecific(pc,PC_COOKIE,1); 4304b9ad928SBarry Smith ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetView_C",(void (**)(void))&f);CHKERRQ(ierr); 4314b9ad928SBarry Smith if (f) { 4324b9ad928SBarry Smith ierr = (*f)(pc,view);CHKERRQ(ierr); 4334b9ad928SBarry Smith } 4344b9ad928SBarry Smith PetscFunctionReturn(0); 4354b9ad928SBarry Smith } 4364b9ad928SBarry Smith 4374b9ad928SBarry Smith #undef __FUNCT__ 4384b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApply" 4394b9ad928SBarry Smith /*@C 4404b9ad928SBarry Smith PCShellSetApply - Sets routine to use as preconditioner. 4414b9ad928SBarry Smith 4424b9ad928SBarry Smith Collective on PC 4434b9ad928SBarry Smith 4444b9ad928SBarry Smith Input Parameters: 4454b9ad928SBarry Smith + pc - the preconditioner context 446be29d3c6SBarry Smith - apply - the application-provided preconditioning routine 4474b9ad928SBarry Smith 4484b9ad928SBarry Smith Calling sequence of apply: 4494b9ad928SBarry Smith .vb 45013f74950SBarry Smith PetscErrorCode apply (void *ptr,Vec xin,Vec xout) 4514b9ad928SBarry Smith .ve 4524b9ad928SBarry Smith 4534b9ad928SBarry Smith + ptr - the application context 4544b9ad928SBarry Smith . xin - input vector 4554b9ad928SBarry Smith - xout - output vector 4564b9ad928SBarry Smith 4574b9ad928SBarry Smith Level: developer 4584b9ad928SBarry Smith 4594b9ad928SBarry Smith .keywords: PC, shell, set, apply, user-provided 4604b9ad928SBarry Smith 461be29d3c6SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose(), PCShellSetContext() 4624b9ad928SBarry Smith @*/ 463be29d3c6SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApply(PC pc,PetscErrorCode (*apply)(void*,Vec,Vec)) 4644b9ad928SBarry Smith { 465be29d3c6SBarry Smith PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*,Vec,Vec)); 4664b9ad928SBarry Smith 4674b9ad928SBarry Smith PetscFunctionBegin; 4684482741eSBarry Smith PetscValidHeaderSpecific(pc,PC_COOKIE,1); 4694b9ad928SBarry Smith ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetApply_C",(void (**)(void))&f);CHKERRQ(ierr); 4704b9ad928SBarry Smith if (f) { 471be29d3c6SBarry Smith ierr = (*f)(pc,apply);CHKERRQ(ierr); 4724b9ad928SBarry Smith } 4734b9ad928SBarry Smith PetscFunctionReturn(0); 4744b9ad928SBarry Smith } 4754b9ad928SBarry Smith 4764b9ad928SBarry Smith #undef __FUNCT__ 4774b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApplyTranspose" 4784b9ad928SBarry Smith /*@C 4794b9ad928SBarry Smith PCShellSetApplyTranspose - Sets routine to use as preconditioner transpose. 4804b9ad928SBarry Smith 4814b9ad928SBarry Smith Collective on PC 4824b9ad928SBarry Smith 4834b9ad928SBarry Smith Input Parameters: 4844b9ad928SBarry Smith + pc - the preconditioner context 4854b9ad928SBarry Smith - apply - the application-provided preconditioning transpose routine 4864b9ad928SBarry Smith 4874b9ad928SBarry Smith Calling sequence of apply: 4884b9ad928SBarry Smith .vb 48913f74950SBarry Smith PetscErrorCode applytranspose (void *ptr,Vec xin,Vec xout) 4904b9ad928SBarry Smith .ve 4914b9ad928SBarry Smith 4924b9ad928SBarry Smith + ptr - the application context 4934b9ad928SBarry Smith . xin - input vector 4944b9ad928SBarry Smith - xout - output vector 4954b9ad928SBarry Smith 4964b9ad928SBarry Smith Level: developer 4974b9ad928SBarry Smith 4984b9ad928SBarry Smith Notes: 4994b9ad928SBarry Smith Uses the same context variable as PCShellSetApply(). 5004b9ad928SBarry Smith 5014b9ad928SBarry Smith .keywords: PC, shell, set, apply, user-provided 5024b9ad928SBarry Smith 503be29d3c6SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApply(), PCSetContext() 5044b9ad928SBarry Smith @*/ 505dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApplyTranspose(PC pc,PetscErrorCode (*applytranspose)(void*,Vec,Vec)) 5064b9ad928SBarry Smith { 5076849ba73SBarry Smith PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*,Vec,Vec)); 5084b9ad928SBarry Smith 5094b9ad928SBarry Smith PetscFunctionBegin; 5104482741eSBarry Smith PetscValidHeaderSpecific(pc,PC_COOKIE,1); 5114b9ad928SBarry Smith ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetApplyTranspose_C",(void (**)(void))&f);CHKERRQ(ierr); 5124b9ad928SBarry Smith if (f) { 5134b9ad928SBarry Smith ierr = (*f)(pc,applytranspose);CHKERRQ(ierr); 5144b9ad928SBarry Smith } 5154b9ad928SBarry Smith PetscFunctionReturn(0); 5164b9ad928SBarry Smith } 5174b9ad928SBarry Smith 5184b9ad928SBarry Smith #undef __FUNCT__ 5197cdd61b2SBarry Smith #define __FUNCT__ "PCShellSetPreSolve" 5207cdd61b2SBarry Smith /*@C 5217cdd61b2SBarry Smith PCShellSetPreSolve - Sets routine to apply to the operators/vectors before a KSPSolve() is 5227cdd61b2SBarry Smith applied. This usually does something like scale the linear system in some application 5237cdd61b2SBarry Smith specific way. 5247cdd61b2SBarry Smith 5257cdd61b2SBarry Smith Collective on PC 5267cdd61b2SBarry Smith 5277cdd61b2SBarry Smith Input Parameters: 5287cdd61b2SBarry Smith + pc - the preconditioner context 5297cdd61b2SBarry Smith - presolve - the application-provided presolve routine 5307cdd61b2SBarry Smith 5317cdd61b2SBarry Smith Calling sequence of presolve: 5327cdd61b2SBarry Smith .vb 5337cdd61b2SBarry Smith PetscErrorCode presolve (void *ptr,KSP ksp,Vec b,Vec x) 5347cdd61b2SBarry Smith .ve 5357cdd61b2SBarry Smith 5367cdd61b2SBarry Smith + ptr - the application context 5377cdd61b2SBarry Smith . xin - input vector 5387cdd61b2SBarry Smith - xout - output vector 5397cdd61b2SBarry Smith 5407cdd61b2SBarry Smith Level: developer 5417cdd61b2SBarry Smith 5427cdd61b2SBarry Smith .keywords: PC, shell, set, apply, user-provided 5437cdd61b2SBarry Smith 544be29d3c6SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose(), PCShellSetPostSolve(), PCShellSetContext() 5457cdd61b2SBarry Smith @*/ 5467cdd61b2SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetPreSolve(PC pc,PetscErrorCode (*presolve)(void*,KSP,Vec,Vec)) 5477cdd61b2SBarry Smith { 5487cdd61b2SBarry Smith PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*,KSP,Vec,Vec)); 5497cdd61b2SBarry Smith 5507cdd61b2SBarry Smith PetscFunctionBegin; 5517cdd61b2SBarry Smith PetscValidHeaderSpecific(pc,PC_COOKIE,1); 5527cdd61b2SBarry Smith ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetPreSolve_C",(void (**)(void))&f);CHKERRQ(ierr); 5537cdd61b2SBarry Smith if (f) { 5547cdd61b2SBarry Smith ierr = (*f)(pc,presolve);CHKERRQ(ierr); 5557cdd61b2SBarry Smith } 5567cdd61b2SBarry Smith PetscFunctionReturn(0); 5577cdd61b2SBarry Smith } 5587cdd61b2SBarry Smith 5597cdd61b2SBarry Smith #undef __FUNCT__ 5607cdd61b2SBarry Smith #define __FUNCT__ "PCShellSetPostSolve" 5617cdd61b2SBarry Smith /*@C 5627cdd61b2SBarry Smith PCShellSetPostSolve - Sets routine to apply to the operators/vectors before a KSPSolve() is 5637cdd61b2SBarry Smith applied. This usually does something like scale the linear system in some application 5647cdd61b2SBarry Smith specific way. 5657cdd61b2SBarry Smith 5667cdd61b2SBarry Smith Collective on PC 5677cdd61b2SBarry Smith 5687cdd61b2SBarry Smith Input Parameters: 5697cdd61b2SBarry Smith + pc - the preconditioner context 5707cdd61b2SBarry Smith - postsolve - the application-provided presolve routine 5717cdd61b2SBarry Smith 5727cdd61b2SBarry Smith Calling sequence of postsolve: 5737cdd61b2SBarry Smith .vb 5747cdd61b2SBarry Smith PetscErrorCode postsolve(void *ptr,KSP ksp,Vec b,Vec x) 5757cdd61b2SBarry Smith .ve 5767cdd61b2SBarry Smith 5777cdd61b2SBarry Smith + ptr - the application context 5787cdd61b2SBarry Smith . xin - input vector 5797cdd61b2SBarry Smith - xout - output vector 5807cdd61b2SBarry Smith 5817cdd61b2SBarry Smith Level: developer 5827cdd61b2SBarry Smith 5837cdd61b2SBarry Smith .keywords: PC, shell, set, apply, user-provided 5847cdd61b2SBarry Smith 585be29d3c6SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose(), PCShellSetPreSolve(), PCShellSetContext() 5867cdd61b2SBarry Smith @*/ 5877cdd61b2SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetPostSolve(PC pc,PetscErrorCode (*postsolve)(void*,KSP,Vec,Vec)) 5887cdd61b2SBarry Smith { 5897cdd61b2SBarry Smith PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*,KSP,Vec,Vec)); 5907cdd61b2SBarry Smith 5917cdd61b2SBarry Smith PetscFunctionBegin; 5927cdd61b2SBarry Smith PetscValidHeaderSpecific(pc,PC_COOKIE,1); 5937cdd61b2SBarry Smith ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetPostSolve_C",(void (**)(void))&f);CHKERRQ(ierr); 5947cdd61b2SBarry Smith if (f) { 5957cdd61b2SBarry Smith ierr = (*f)(pc,postsolve);CHKERRQ(ierr); 5967cdd61b2SBarry Smith } 5977cdd61b2SBarry Smith PetscFunctionReturn(0); 5987cdd61b2SBarry Smith } 5997cdd61b2SBarry Smith 6007cdd61b2SBarry Smith #undef __FUNCT__ 6014b9ad928SBarry Smith #define __FUNCT__ "PCShellSetName" 6024b9ad928SBarry Smith /*@C 6034b9ad928SBarry Smith PCShellSetName - Sets an optional name to associate with a shell 6044b9ad928SBarry Smith preconditioner. 6054b9ad928SBarry Smith 6064b9ad928SBarry Smith Not Collective 6074b9ad928SBarry Smith 6084b9ad928SBarry Smith Input Parameters: 6094b9ad928SBarry Smith + pc - the preconditioner context 6104b9ad928SBarry Smith - name - character string describing shell preconditioner 6114b9ad928SBarry Smith 6124b9ad928SBarry Smith Level: developer 6134b9ad928SBarry Smith 6144b9ad928SBarry Smith .keywords: PC, shell, set, name, user-provided 6154b9ad928SBarry Smith 6164b9ad928SBarry Smith .seealso: PCShellGetName() 6174b9ad928SBarry Smith @*/ 618dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetName(PC pc,const char name[]) 6194b9ad928SBarry Smith { 620dfbe8321SBarry Smith PetscErrorCode ierr,(*f)(PC,const char []); 6214b9ad928SBarry Smith 6224b9ad928SBarry Smith PetscFunctionBegin; 6234482741eSBarry Smith PetscValidHeaderSpecific(pc,PC_COOKIE,1); 6244b9ad928SBarry Smith ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetName_C",(void (**)(void))&f);CHKERRQ(ierr); 6254b9ad928SBarry Smith if (f) { 6264b9ad928SBarry Smith ierr = (*f)(pc,name);CHKERRQ(ierr); 6274b9ad928SBarry Smith } 6284b9ad928SBarry Smith PetscFunctionReturn(0); 6294b9ad928SBarry Smith } 6304b9ad928SBarry Smith 6314b9ad928SBarry Smith #undef __FUNCT__ 6324b9ad928SBarry Smith #define __FUNCT__ "PCShellGetName" 6334b9ad928SBarry Smith /*@C 6344b9ad928SBarry Smith PCShellGetName - Gets an optional name that the user has set for a shell 6354b9ad928SBarry Smith preconditioner. 6364b9ad928SBarry Smith 6374b9ad928SBarry Smith Not Collective 6384b9ad928SBarry Smith 6394b9ad928SBarry Smith Input Parameter: 6404b9ad928SBarry Smith . pc - the preconditioner context 6414b9ad928SBarry Smith 6424b9ad928SBarry Smith Output Parameter: 6434b9ad928SBarry Smith . name - character string describing shell preconditioner (you should not free this) 6444b9ad928SBarry Smith 6454b9ad928SBarry Smith Level: developer 6464b9ad928SBarry Smith 6474b9ad928SBarry Smith .keywords: PC, shell, get, name, user-provided 6484b9ad928SBarry Smith 6494b9ad928SBarry Smith .seealso: PCShellSetName() 6504b9ad928SBarry Smith @*/ 651dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellGetName(PC pc,char *name[]) 6524b9ad928SBarry Smith { 653dfbe8321SBarry Smith PetscErrorCode ierr,(*f)(PC,char *[]); 6544b9ad928SBarry Smith 6554b9ad928SBarry Smith PetscFunctionBegin; 6564482741eSBarry Smith PetscValidHeaderSpecific(pc,PC_COOKIE,1); 6574482741eSBarry Smith PetscValidPointer(name,2); 6584b9ad928SBarry Smith ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellGetName_C",(void (**)(void))&f);CHKERRQ(ierr); 6594b9ad928SBarry Smith if (f) { 6604b9ad928SBarry Smith ierr = (*f)(pc,name);CHKERRQ(ierr); 6614b9ad928SBarry Smith } else { 6621302d50aSBarry Smith SETERRQ(PETSC_ERR_ARG_WRONG,"Not shell preconditioner, cannot get name"); 6634b9ad928SBarry Smith } 6644b9ad928SBarry Smith PetscFunctionReturn(0); 6654b9ad928SBarry Smith } 6664b9ad928SBarry Smith 6674b9ad928SBarry Smith #undef __FUNCT__ 6684b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApplyRichardson" 6694b9ad928SBarry Smith /*@C 6704b9ad928SBarry Smith PCShellSetApplyRichardson - Sets routine to use as preconditioner 6714b9ad928SBarry Smith in Richardson iteration. 6724b9ad928SBarry Smith 6734b9ad928SBarry Smith Collective on PC 6744b9ad928SBarry Smith 6754b9ad928SBarry Smith Input Parameters: 6764b9ad928SBarry Smith + pc - the preconditioner context 677be29d3c6SBarry Smith - apply - the application-provided preconditioning routine 6784b9ad928SBarry Smith 6794b9ad928SBarry Smith Calling sequence of apply: 6804b9ad928SBarry Smith .vb 68113f74950SBarry Smith PetscErrorCode apply (void *ptr,Vec b,Vec x,Vec r,PetscReal rtol,PetscReal abstol,PetscReal dtol,PetscInt maxits) 6824b9ad928SBarry Smith .ve 6834b9ad928SBarry Smith 6844b9ad928SBarry Smith + ptr - the application context 6854b9ad928SBarry Smith . b - right-hand-side 6864b9ad928SBarry Smith . x - current iterate 6874b9ad928SBarry Smith . r - work space 6884b9ad928SBarry Smith . rtol - relative tolerance of residual norm to stop at 68970441072SBarry Smith . abstol - absolute tolerance of residual norm to stop at 6904b9ad928SBarry Smith . dtol - if residual norm increases by this factor than return 6914b9ad928SBarry Smith - maxits - number of iterations to run 6924b9ad928SBarry Smith 6934b9ad928SBarry Smith Level: developer 6944b9ad928SBarry Smith 6954b9ad928SBarry Smith .keywords: PC, shell, set, apply, Richardson, user-provided 6964b9ad928SBarry Smith 697be29d3c6SBarry Smith .seealso: PCShellSetApply(), PCShellSetContext() 6984b9ad928SBarry Smith @*/ 699be29d3c6SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApplyRichardson(PC pc,PetscErrorCode (*apply)(void*,Vec,Vec,Vec,PetscReal,PetscReal,PetscReal,PetscInt)) 7004b9ad928SBarry Smith { 701be29d3c6SBarry Smith PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*,Vec,Vec,Vec,PetscReal,PetscReal,PetscReal,PetscInt)); 7024b9ad928SBarry Smith 7034b9ad928SBarry Smith PetscFunctionBegin; 7044482741eSBarry Smith PetscValidHeaderSpecific(pc,PC_COOKIE,1); 7054b9ad928SBarry Smith ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetApplyRichardson_C",(void (**)(void))&f);CHKERRQ(ierr); 7064b9ad928SBarry Smith if (f) { 707be29d3c6SBarry Smith ierr = (*f)(pc,apply);CHKERRQ(ierr); 7084b9ad928SBarry Smith } 7094b9ad928SBarry Smith PetscFunctionReturn(0); 7104b9ad928SBarry Smith } 7114b9ad928SBarry Smith 7124b9ad928SBarry Smith /*MC 7134b9ad928SBarry Smith PCSHELL - Creates a new preconditioner class for use with your 7144b9ad928SBarry Smith own private data storage format. 7154b9ad928SBarry Smith 7164b9ad928SBarry Smith Level: advanced 7174b9ad928SBarry Smith 7184b9ad928SBarry Smith Concepts: providing your own preconditioner 7194b9ad928SBarry Smith 7204b9ad928SBarry Smith Usage: 7216849ba73SBarry Smith $ PetscErrorCode (*mult)(void*,Vec,Vec); 7226849ba73SBarry Smith $ PetscErrorCode (*setup)(void*); 7234b9ad928SBarry Smith $ PCCreate(comm,&pc); 7244b9ad928SBarry Smith $ PCSetType(pc,PCSHELL); 725be29d3c6SBarry Smith $ PCShellSetApply(pc,mult); 726be29d3c6SBarry Smith $ PCShellSetContext(pc,ctx) 7274b9ad928SBarry Smith $ PCShellSetSetUp(pc,setup); (optional) 7284b9ad928SBarry Smith 7294b9ad928SBarry Smith .seealso: PCCreate(), PCSetType(), PCType (for list of available types), PC, 730d07a9264SSatish Balay MATSHELL, PCShellSetUp(), PCShellSetApply(), PCShellSetView(), 7314b9ad928SBarry Smith PCShellSetApplyTranpose(), PCShellSetName(), PCShellSetApplyRichardson(), 732be29d3c6SBarry Smith PCShellGetName(), PCShellSetContext(), PCShellGetContext() 7334b9ad928SBarry Smith M*/ 7344b9ad928SBarry Smith 7354b9ad928SBarry Smith EXTERN_C_BEGIN 7364b9ad928SBarry Smith #undef __FUNCT__ 7374b9ad928SBarry Smith #define __FUNCT__ "PCCreate_Shell" 738dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCCreate_Shell(PC pc) 7394b9ad928SBarry Smith { 740dfbe8321SBarry Smith PetscErrorCode ierr; 7414b9ad928SBarry Smith PC_Shell *shell; 7424b9ad928SBarry Smith 7434b9ad928SBarry Smith PetscFunctionBegin; 7444b9ad928SBarry Smith pc->ops->destroy = PCDestroy_Shell; 7454b9ad928SBarry Smith ierr = PetscNew(PC_Shell,&shell);CHKERRQ(ierr); 74652e6d16bSBarry Smith ierr = PetscLogObjectMemory(pc,sizeof(PC_Shell));CHKERRQ(ierr); 7474b9ad928SBarry Smith pc->data = (void*)shell; 7484b9ad928SBarry Smith pc->name = 0; 7494b9ad928SBarry Smith 7504b9ad928SBarry Smith pc->ops->apply = PCApply_Shell; 7514b9ad928SBarry Smith pc->ops->view = PCView_Shell; 7524b9ad928SBarry Smith pc->ops->applytranspose = PCApplyTranspose_Shell; 7534b9ad928SBarry Smith pc->ops->applyrichardson = 0; 7544b9ad928SBarry Smith pc->ops->setup = PCSetUp_Shell; 7559bbb2c88SBarry Smith pc->ops->presolve = 0; 7569bbb2c88SBarry Smith pc->ops->postsolve = 0; 7574b9ad928SBarry Smith pc->ops->view = PCView_Shell; 7584b9ad928SBarry Smith 7594b9ad928SBarry Smith shell->apply = 0; 7604b9ad928SBarry Smith shell->applytranspose = 0; 7614b9ad928SBarry Smith shell->name = 0; 7624b9ad928SBarry Smith shell->applyrich = 0; 7637cdd61b2SBarry Smith shell->presolve = 0; 7647cdd61b2SBarry Smith shell->postsolve = 0; 7654b9ad928SBarry Smith shell->ctx = 0; 7664b9ad928SBarry Smith shell->setup = 0; 7674b9ad928SBarry Smith shell->view = 0; 7684b9ad928SBarry Smith 7694b9ad928SBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetSetUp_C","PCShellSetSetUp_Shell", 7704b9ad928SBarry Smith PCShellSetSetUp_Shell);CHKERRQ(ierr); 7714b9ad928SBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetApply_C","PCShellSetApply_Shell", 7724b9ad928SBarry Smith PCShellSetApply_Shell);CHKERRQ(ierr); 7737cdd61b2SBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetPreSolve_C","PCShellSetPreSolve_Shell", 7747cdd61b2SBarry Smith PCShellSetPreSolve_Shell);CHKERRQ(ierr); 7757cdd61b2SBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetPostSolve_C","PCShellSetPostSolve_Shell", 7767cdd61b2SBarry Smith PCShellSetPostSolve_Shell);CHKERRQ(ierr); 7774b9ad928SBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetView_C","PCShellSetView_Shell", 7784b9ad928SBarry Smith PCShellSetView_Shell);CHKERRQ(ierr); 779be29d3c6SBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetApplyTranspose_C","PCShellSetApplyTranspose_Shell", 7804b9ad928SBarry Smith PCShellSetApplyTranspose_Shell);CHKERRQ(ierr); 7814b9ad928SBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetName_C","PCShellSetName_Shell", 7824b9ad928SBarry Smith PCShellSetName_Shell);CHKERRQ(ierr); 7834b9ad928SBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellGetName_C","PCShellGetName_Shell", 7844b9ad928SBarry Smith PCShellGetName_Shell);CHKERRQ(ierr); 785be29d3c6SBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetApplyRichardson_C","PCShellSetApplyRichardson_Shell", 7864b9ad928SBarry Smith PCShellSetApplyRichardson_Shell);CHKERRQ(ierr); 7874b9ad928SBarry Smith PetscFunctionReturn(0); 7884b9ad928SBarry Smith } 7894b9ad928SBarry Smith EXTERN_C_END 7904b9ad928SBarry Smith 7914b9ad928SBarry Smith 7924b9ad928SBarry Smith 7934b9ad928SBarry Smith 7944b9ad928SBarry Smith 7954b9ad928SBarry Smith 796