1dba47a55SKris Buschelman #define PETSCKSP_DLL 2dba47a55SKris Buschelman 34b9ad928SBarry Smith /* 44b9ad928SBarry Smith This provides a simple shell for Fortran (and C programmers) to 54b9ad928SBarry Smith create their own preconditioner without writing much interface code. 64b9ad928SBarry Smith */ 74b9ad928SBarry Smith 86356e834SBarry Smith #include "private/pcimpl.h" /*I "petscpc.h" I*/ 91d8d5f9aSSatish Balay #include "private/vecimpl.h" 104b9ad928SBarry Smith 11ac226902SBarry Smith EXTERN_C_BEGIN 124b9ad928SBarry Smith typedef struct { 13be29d3c6SBarry Smith void *ctx; /* user provided contexts for preconditioner */ 1418be62a5SSatish Balay PetscErrorCode (*destroy)(void*); 156849ba73SBarry Smith PetscErrorCode (*setup)(void*); 166849ba73SBarry Smith PetscErrorCode (*apply)(void*,Vec,Vec); 177cdd61b2SBarry Smith PetscErrorCode (*presolve)(void*,KSP,Vec,Vec); 187cdd61b2SBarry Smith PetscErrorCode (*postsolve)(void*,KSP,Vec,Vec); 196849ba73SBarry Smith PetscErrorCode (*view)(void*,PetscViewer); 206849ba73SBarry Smith PetscErrorCode (*applytranspose)(void*,Vec,Vec); 2113f74950SBarry Smith PetscErrorCode (*applyrich)(void*,Vec,Vec,Vec,PetscReal,PetscReal,PetscReal,PetscInt); 224b9ad928SBarry Smith char *name; 234b9ad928SBarry Smith } PC_Shell; 24ac226902SBarry Smith EXTERN_C_END 254b9ad928SBarry Smith 264b9ad928SBarry Smith #undef __FUNCT__ 27be29d3c6SBarry Smith #define __FUNCT__ "PCShellGetContext" 28be29d3c6SBarry Smith /*@ 29be29d3c6SBarry Smith PCShellGetContext - Returns the user-provided context associated with a shell PC 30be29d3c6SBarry Smith 31be29d3c6SBarry Smith Not Collective 32be29d3c6SBarry Smith 33be29d3c6SBarry Smith Input Parameter: 34be29d3c6SBarry Smith . pc - should have been created with PCCreateShell() 35be29d3c6SBarry Smith 36be29d3c6SBarry Smith Output Parameter: 37be29d3c6SBarry Smith . ctx - the user provided context 38be29d3c6SBarry Smith 39be29d3c6SBarry Smith Level: advanced 40be29d3c6SBarry Smith 41be29d3c6SBarry Smith Notes: 42be29d3c6SBarry Smith This routine is intended for use within various shell routines 43be29d3c6SBarry Smith 44be29d3c6SBarry Smith .keywords: PC, shell, get, context 45be29d3c6SBarry Smith 46be29d3c6SBarry Smith .seealso: PCCreateShell(), PCShellSetContext() 47be29d3c6SBarry Smith @*/ 48be29d3c6SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellGetContext(PC pc,void **ctx) 49be29d3c6SBarry Smith { 50be29d3c6SBarry Smith PetscErrorCode ierr; 51be29d3c6SBarry Smith PetscTruth flg; 52be29d3c6SBarry Smith 53be29d3c6SBarry Smith PetscFunctionBegin; 54be29d3c6SBarry Smith PetscValidHeaderSpecific(pc,PC_COOKIE,1); 55be29d3c6SBarry Smith PetscValidPointer(ctx,2); 56be29d3c6SBarry Smith ierr = PetscTypeCompare((PetscObject)pc,PCSHELL,&flg);CHKERRQ(ierr); 57be29d3c6SBarry Smith if (!flg) *ctx = 0; 58be29d3c6SBarry Smith else *ctx = ((PC_Shell*)(pc->data))->ctx; 59be29d3c6SBarry Smith PetscFunctionReturn(0); 60be29d3c6SBarry Smith } 61be29d3c6SBarry Smith 62be29d3c6SBarry Smith #undef __FUNCT__ 63be29d3c6SBarry Smith #define __FUNCT__ "PCShellSetContext" 64be29d3c6SBarry Smith /*@C 65be29d3c6SBarry Smith PCShellSetContext - sets the context for a shell PC 66be29d3c6SBarry Smith 67be29d3c6SBarry Smith Collective on PC 68be29d3c6SBarry Smith 69be29d3c6SBarry Smith Input Parameters: 70be29d3c6SBarry Smith + pc - the shell PC 71be29d3c6SBarry Smith - ctx - the context 72be29d3c6SBarry Smith 73be29d3c6SBarry Smith Level: advanced 74be29d3c6SBarry Smith 75be29d3c6SBarry Smith Fortran Notes: The context can only be an integer or a PetscObject 76be29d3c6SBarry Smith unfortunately it cannot be a Fortran array or derived type. 77be29d3c6SBarry Smith 78be29d3c6SBarry Smith .seealso: PCCreateShell(), PCShellGetContext() 79be29d3c6SBarry Smith @*/ 80be29d3c6SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetContext(PC pc,void *ctx) 81be29d3c6SBarry Smith { 82be29d3c6SBarry Smith PC_Shell *shell = (PC_Shell*)pc->data; 83be29d3c6SBarry Smith PetscErrorCode ierr; 84be29d3c6SBarry Smith PetscTruth flg; 85be29d3c6SBarry Smith 86be29d3c6SBarry Smith PetscFunctionBegin; 87be29d3c6SBarry Smith PetscValidHeaderSpecific(pc,PC_COOKIE,1); 88be29d3c6SBarry Smith ierr = PetscTypeCompare((PetscObject)pc,PCSHELL,&flg);CHKERRQ(ierr); 89be29d3c6SBarry Smith if (flg) { 90be29d3c6SBarry Smith shell->ctx = ctx; 91be29d3c6SBarry Smith } 92be29d3c6SBarry Smith PetscFunctionReturn(0); 93be29d3c6SBarry Smith } 94be29d3c6SBarry Smith 95be29d3c6SBarry Smith #undef __FUNCT__ 9618be62a5SSatish Balay #define __FUNCT__ "PCSetUp_Shell" 976849ba73SBarry Smith static PetscErrorCode PCSetUp_Shell(PC pc) 984b9ad928SBarry Smith { 994b9ad928SBarry Smith PC_Shell *shell; 100dfbe8321SBarry Smith PetscErrorCode ierr; 1014b9ad928SBarry Smith 1024b9ad928SBarry Smith PetscFunctionBegin; 1034b9ad928SBarry Smith shell = (PC_Shell*)pc->data; 1044b9ad928SBarry Smith if (shell->setup) { 105e9a2bbcdSBarry Smith CHKMEMQ; 1064b9ad928SBarry Smith ierr = (*shell->setup)(shell->ctx);CHKERRQ(ierr); 107e9a2bbcdSBarry Smith CHKMEMQ; 1084b9ad928SBarry Smith } 1094b9ad928SBarry Smith PetscFunctionReturn(0); 1104b9ad928SBarry Smith } 1114b9ad928SBarry Smith 1124b9ad928SBarry Smith #undef __FUNCT__ 1134b9ad928SBarry Smith #define __FUNCT__ "PCApply_Shell" 1146849ba73SBarry Smith static PetscErrorCode PCApply_Shell(PC pc,Vec x,Vec y) 1154b9ad928SBarry Smith { 1164b9ad928SBarry Smith PC_Shell *shell; 117dfbe8321SBarry Smith PetscErrorCode ierr; 1184b9ad928SBarry Smith 1194b9ad928SBarry Smith PetscFunctionBegin; 1204b9ad928SBarry Smith shell = (PC_Shell*)pc->data; 1211302d50aSBarry Smith if (!shell->apply) SETERRQ(PETSC_ERR_USER,"No apply() routine provided to Shell PC"); 122e9a2bbcdSBarry Smith PetscStackPush("PCSHELL user function"); 123e9a2bbcdSBarry Smith CHKMEMQ; 1244b9ad928SBarry Smith ierr = (*shell->apply)(shell->ctx,x,y);CHKERRQ(ierr); 125e9a2bbcdSBarry Smith CHKMEMQ; 126e9a2bbcdSBarry Smith PetscStackPop; 1274b9ad928SBarry Smith PetscFunctionReturn(0); 1284b9ad928SBarry Smith } 1294b9ad928SBarry Smith 1304b9ad928SBarry Smith #undef __FUNCT__ 1317cdd61b2SBarry Smith #define __FUNCT__ "PCPreSolve_Shell" 1327cdd61b2SBarry Smith static PetscErrorCode PCPreSolve_Shell(PC pc,KSP ksp,Vec b,Vec x) 1337cdd61b2SBarry Smith { 1347cdd61b2SBarry Smith PC_Shell *shell; 1357cdd61b2SBarry Smith PetscErrorCode ierr; 1367cdd61b2SBarry Smith 1377cdd61b2SBarry Smith PetscFunctionBegin; 1387cdd61b2SBarry Smith shell = (PC_Shell*)pc->data; 13991ad8336SSatish Balay if (!shell->presolve) SETERRQ(PETSC_ERR_USER,"No presolve() routine provided to Shell PC"); 1407cdd61b2SBarry Smith ierr = (*shell->presolve)(shell->ctx,ksp,b,x);CHKERRQ(ierr); 1417cdd61b2SBarry Smith PetscFunctionReturn(0); 1427cdd61b2SBarry Smith } 1437cdd61b2SBarry Smith 1447cdd61b2SBarry Smith #undef __FUNCT__ 1457cdd61b2SBarry Smith #define __FUNCT__ "PCPostSolve_Shell" 1467cdd61b2SBarry Smith static PetscErrorCode PCPostSolve_Shell(PC pc,KSP ksp,Vec b,Vec x) 1477cdd61b2SBarry Smith { 1487cdd61b2SBarry Smith PC_Shell *shell; 1497cdd61b2SBarry Smith PetscErrorCode ierr; 1507cdd61b2SBarry Smith 1517cdd61b2SBarry Smith PetscFunctionBegin; 1527cdd61b2SBarry Smith shell = (PC_Shell*)pc->data; 15391ad8336SSatish Balay if (!shell->postsolve) SETERRQ(PETSC_ERR_USER,"No postsolve() routine provided to Shell PC"); 15491ad8336SSatish Balay ierr = (*shell->postsolve)(shell->ctx,ksp,b,x);CHKERRQ(ierr); 1557cdd61b2SBarry Smith PetscFunctionReturn(0); 1567cdd61b2SBarry Smith } 1577cdd61b2SBarry Smith 1587cdd61b2SBarry Smith #undef __FUNCT__ 1594b9ad928SBarry Smith #define __FUNCT__ "PCApplyTranspose_Shell" 1606849ba73SBarry Smith static PetscErrorCode PCApplyTranspose_Shell(PC pc,Vec x,Vec y) 1614b9ad928SBarry Smith { 1624b9ad928SBarry Smith PC_Shell *shell; 163dfbe8321SBarry Smith PetscErrorCode ierr; 1644b9ad928SBarry Smith 1654b9ad928SBarry Smith PetscFunctionBegin; 1664b9ad928SBarry Smith shell = (PC_Shell*)pc->data; 1671302d50aSBarry Smith if (!shell->applytranspose) SETERRQ(PETSC_ERR_USER,"No applytranspose() routine provided to Shell PC"); 1684b9ad928SBarry Smith ierr = (*shell->applytranspose)(shell->ctx,x,y);CHKERRQ(ierr); 1694b9ad928SBarry Smith PetscFunctionReturn(0); 1704b9ad928SBarry Smith } 1714b9ad928SBarry Smith 1724b9ad928SBarry Smith #undef __FUNCT__ 1734b9ad928SBarry Smith #define __FUNCT__ "PCApplyRichardson_Shell" 17413f74950SBarry Smith static PetscErrorCode PCApplyRichardson_Shell(PC pc,Vec x,Vec y,Vec w,PetscReal rtol,PetscReal abstol, PetscReal dtol,PetscInt it) 1754b9ad928SBarry Smith { 176dfbe8321SBarry Smith PetscErrorCode ierr; 1774b9ad928SBarry Smith PC_Shell *shell; 1784b9ad928SBarry Smith 1794b9ad928SBarry Smith PetscFunctionBegin; 1804b9ad928SBarry Smith shell = (PC_Shell*)pc->data; 181be29d3c6SBarry Smith ierr = (*shell->applyrich)(shell->ctx,x,y,w,rtol,abstol,dtol,it);CHKERRQ(ierr); 1824b9ad928SBarry Smith PetscFunctionReturn(0); 1834b9ad928SBarry Smith } 1844b9ad928SBarry Smith 1854b9ad928SBarry Smith #undef __FUNCT__ 1864b9ad928SBarry Smith #define __FUNCT__ "PCDestroy_Shell" 1876849ba73SBarry Smith static PetscErrorCode PCDestroy_Shell(PC pc) 1884b9ad928SBarry Smith { 1894b9ad928SBarry Smith PC_Shell *shell = (PC_Shell*)pc->data; 190dfbe8321SBarry Smith PetscErrorCode ierr; 1914b9ad928SBarry Smith 1924b9ad928SBarry Smith PetscFunctionBegin; 193*05b42c5fSBarry Smith ierr = PetscStrfree(shell->name);CHKERRQ(ierr); 19418be62a5SSatish Balay if (shell->destroy) { 19518be62a5SSatish Balay ierr = (*shell->destroy)(shell->ctx);CHKERRQ(ierr); 19618be62a5SSatish Balay } 1974b9ad928SBarry Smith ierr = PetscFree(shell);CHKERRQ(ierr); 1984b9ad928SBarry Smith PetscFunctionReturn(0); 1994b9ad928SBarry Smith } 2004b9ad928SBarry Smith 2014b9ad928SBarry Smith #undef __FUNCT__ 2024b9ad928SBarry Smith #define __FUNCT__ "PCView_Shell" 2036849ba73SBarry Smith static PetscErrorCode PCView_Shell(PC pc,PetscViewer viewer) 2044b9ad928SBarry Smith { 2054b9ad928SBarry Smith PC_Shell *shell = (PC_Shell*)pc->data; 206dfbe8321SBarry Smith PetscErrorCode ierr; 20732077d6dSBarry Smith PetscTruth iascii; 2084b9ad928SBarry Smith 2094b9ad928SBarry Smith PetscFunctionBegin; 21032077d6dSBarry Smith ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_ASCII,&iascii);CHKERRQ(ierr); 21132077d6dSBarry Smith if (iascii) { 2124b9ad928SBarry Smith if (shell->name) {ierr = PetscViewerASCIIPrintf(viewer," Shell: %s\n",shell->name);CHKERRQ(ierr);} 2134b9ad928SBarry Smith else {ierr = PetscViewerASCIIPrintf(viewer," Shell: no name\n");CHKERRQ(ierr);} 2144b9ad928SBarry Smith } 2154b9ad928SBarry Smith if (shell->view) { 2164b9ad928SBarry Smith ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 2174b9ad928SBarry Smith ierr = (*shell->view)(shell->ctx,viewer);CHKERRQ(ierr); 2184b9ad928SBarry Smith ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 2194b9ad928SBarry Smith } 2204b9ad928SBarry Smith PetscFunctionReturn(0); 2214b9ad928SBarry Smith } 2224b9ad928SBarry Smith 2234b9ad928SBarry Smith /* ------------------------------------------------------------------------------*/ 2244b9ad928SBarry Smith EXTERN_C_BEGIN 2254b9ad928SBarry Smith #undef __FUNCT__ 22618be62a5SSatish Balay #define __FUNCT__ "PCShellSetDestroy_Shell" 22718be62a5SSatish Balay PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetDestroy_Shell(PC pc, PetscErrorCode (*destroy)(void*)) 22818be62a5SSatish Balay { 22918be62a5SSatish Balay PC_Shell *shell; 23018be62a5SSatish Balay 23118be62a5SSatish Balay PetscFunctionBegin; 23218be62a5SSatish Balay shell = (PC_Shell*)pc->data; 23318be62a5SSatish Balay shell->destroy = destroy; 23418be62a5SSatish Balay PetscFunctionReturn(0); 23518be62a5SSatish Balay } 23618be62a5SSatish Balay EXTERN_C_END 23718be62a5SSatish Balay 23818be62a5SSatish Balay EXTERN_C_BEGIN 23918be62a5SSatish Balay #undef __FUNCT__ 2404b9ad928SBarry Smith #define __FUNCT__ "PCShellSetSetUp_Shell" 241dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetSetUp_Shell(PC pc, PetscErrorCode (*setup)(void*)) 2424b9ad928SBarry Smith { 2434b9ad928SBarry Smith PC_Shell *shell; 2444b9ad928SBarry Smith 2454b9ad928SBarry Smith PetscFunctionBegin; 2464b9ad928SBarry Smith shell = (PC_Shell*)pc->data; 2474b9ad928SBarry Smith shell->setup = setup; 2484b9ad928SBarry Smith PetscFunctionReturn(0); 2494b9ad928SBarry Smith } 2504b9ad928SBarry Smith EXTERN_C_END 2514b9ad928SBarry Smith 2524b9ad928SBarry Smith EXTERN_C_BEGIN 2534b9ad928SBarry Smith #undef __FUNCT__ 2544b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApply_Shell" 255be29d3c6SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApply_Shell(PC pc,PetscErrorCode (*apply)(void*,Vec,Vec)) 2564b9ad928SBarry Smith { 2574b9ad928SBarry Smith PC_Shell *shell; 2584b9ad928SBarry Smith 2594b9ad928SBarry Smith PetscFunctionBegin; 2604b9ad928SBarry Smith shell = (PC_Shell*)pc->data; 2614b9ad928SBarry Smith shell->apply = apply; 2624b9ad928SBarry Smith PetscFunctionReturn(0); 2634b9ad928SBarry Smith } 2644b9ad928SBarry Smith EXTERN_C_END 2654b9ad928SBarry Smith 2664b9ad928SBarry Smith EXTERN_C_BEGIN 2674b9ad928SBarry Smith #undef __FUNCT__ 2687cdd61b2SBarry Smith #define __FUNCT__ "PCShellSetPreSolve_Shell" 269be29d3c6SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetPreSolve_Shell(PC pc,PetscErrorCode (*presolve)(void*,KSP,Vec,Vec)) 2707cdd61b2SBarry Smith { 2717cdd61b2SBarry Smith PC_Shell *shell; 2727cdd61b2SBarry Smith 2737cdd61b2SBarry Smith PetscFunctionBegin; 2747cdd61b2SBarry Smith shell = (PC_Shell*)pc->data; 2757cdd61b2SBarry Smith shell->presolve = presolve; 2769bbb2c88SBarry Smith if (presolve) { 2779bbb2c88SBarry Smith pc->ops->presolve = PCPreSolve_Shell; 2789bbb2c88SBarry Smith } else { 2799bbb2c88SBarry Smith pc->ops->presolve = 0; 2809bbb2c88SBarry Smith } 2817cdd61b2SBarry Smith PetscFunctionReturn(0); 2827cdd61b2SBarry Smith } 2837cdd61b2SBarry Smith EXTERN_C_END 2847cdd61b2SBarry Smith 2857cdd61b2SBarry Smith EXTERN_C_BEGIN 2867cdd61b2SBarry Smith #undef __FUNCT__ 2877cdd61b2SBarry Smith #define __FUNCT__ "PCShellSetPostSolve_Shell" 288be29d3c6SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetPostSolve_Shell(PC pc,PetscErrorCode (*postsolve)(void*,KSP,Vec,Vec)) 2897cdd61b2SBarry Smith { 2907cdd61b2SBarry Smith PC_Shell *shell; 2917cdd61b2SBarry Smith 2927cdd61b2SBarry Smith PetscFunctionBegin; 2937cdd61b2SBarry Smith shell = (PC_Shell*)pc->data; 2947cdd61b2SBarry Smith shell->postsolve = postsolve; 2959bbb2c88SBarry Smith if (postsolve) { 2969bbb2c88SBarry Smith pc->ops->postsolve = PCPostSolve_Shell; 2979bbb2c88SBarry Smith } else { 2989bbb2c88SBarry Smith pc->ops->postsolve = 0; 2999bbb2c88SBarry Smith } 3007cdd61b2SBarry Smith PetscFunctionReturn(0); 3017cdd61b2SBarry Smith } 3027cdd61b2SBarry Smith EXTERN_C_END 3037cdd61b2SBarry Smith 3047cdd61b2SBarry Smith EXTERN_C_BEGIN 3057cdd61b2SBarry Smith #undef __FUNCT__ 3064b9ad928SBarry Smith #define __FUNCT__ "PCShellSetView_Shell" 307dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetView_Shell(PC pc,PetscErrorCode (*view)(void*,PetscViewer)) 3084b9ad928SBarry Smith { 3094b9ad928SBarry Smith PC_Shell *shell; 3104b9ad928SBarry Smith 3114b9ad928SBarry Smith PetscFunctionBegin; 3124b9ad928SBarry Smith shell = (PC_Shell*)pc->data; 3134b9ad928SBarry Smith shell->view = view; 3144b9ad928SBarry Smith PetscFunctionReturn(0); 3154b9ad928SBarry Smith } 3164b9ad928SBarry Smith EXTERN_C_END 3174b9ad928SBarry Smith 3184b9ad928SBarry Smith EXTERN_C_BEGIN 3194b9ad928SBarry Smith #undef __FUNCT__ 3204b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApplyTranspose_Shell" 321dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApplyTranspose_Shell(PC pc,PetscErrorCode (*applytranspose)(void*,Vec,Vec)) 3224b9ad928SBarry Smith { 3234b9ad928SBarry Smith PC_Shell *shell; 3244b9ad928SBarry Smith 3254b9ad928SBarry Smith PetscFunctionBegin; 3264b9ad928SBarry Smith shell = (PC_Shell*)pc->data; 3274b9ad928SBarry Smith shell->applytranspose = applytranspose; 3284b9ad928SBarry Smith PetscFunctionReturn(0); 3294b9ad928SBarry Smith } 3304b9ad928SBarry Smith EXTERN_C_END 3314b9ad928SBarry Smith 3324b9ad928SBarry Smith EXTERN_C_BEGIN 3334b9ad928SBarry Smith #undef __FUNCT__ 3344b9ad928SBarry Smith #define __FUNCT__ "PCShellSetName_Shell" 335dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetName_Shell(PC pc,const char name[]) 3364b9ad928SBarry Smith { 3374b9ad928SBarry Smith PC_Shell *shell; 338dfbe8321SBarry Smith PetscErrorCode ierr; 3394b9ad928SBarry Smith 3404b9ad928SBarry Smith PetscFunctionBegin; 3414b9ad928SBarry Smith shell = (PC_Shell*)pc->data; 342f259bd47SBarry Smith ierr = PetscStrfree(shell->name);CHKERRQ(ierr); 3434b9ad928SBarry Smith ierr = PetscStrallocpy(name,&shell->name);CHKERRQ(ierr); 3444b9ad928SBarry Smith PetscFunctionReturn(0); 3454b9ad928SBarry Smith } 3464b9ad928SBarry Smith EXTERN_C_END 3474b9ad928SBarry Smith 3484b9ad928SBarry Smith EXTERN_C_BEGIN 3494b9ad928SBarry Smith #undef __FUNCT__ 3504b9ad928SBarry Smith #define __FUNCT__ "PCShellGetName_Shell" 351dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellGetName_Shell(PC pc,char *name[]) 3524b9ad928SBarry Smith { 3534b9ad928SBarry Smith PC_Shell *shell; 3544b9ad928SBarry Smith 3554b9ad928SBarry Smith PetscFunctionBegin; 3564b9ad928SBarry Smith shell = (PC_Shell*)pc->data; 3574b9ad928SBarry Smith *name = shell->name; 3584b9ad928SBarry Smith PetscFunctionReturn(0); 3594b9ad928SBarry Smith } 3604b9ad928SBarry Smith EXTERN_C_END 3614b9ad928SBarry Smith 3624b9ad928SBarry Smith EXTERN_C_BEGIN 3634b9ad928SBarry Smith #undef __FUNCT__ 3644b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApplyRichardson_Shell" 365be29d3c6SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApplyRichardson_Shell(PC pc,PetscErrorCode (*apply)(void*,Vec,Vec,Vec,PetscReal,PetscReal,PetscReal,PetscInt)) 3664b9ad928SBarry Smith { 3674b9ad928SBarry Smith PC_Shell *shell; 3684b9ad928SBarry Smith 3694b9ad928SBarry Smith PetscFunctionBegin; 3704b9ad928SBarry Smith shell = (PC_Shell*)pc->data; 3714b9ad928SBarry Smith pc->ops->applyrichardson = PCApplyRichardson_Shell; 3724b9ad928SBarry Smith shell->applyrich = apply; 3734b9ad928SBarry Smith PetscFunctionReturn(0); 3744b9ad928SBarry Smith } 3754b9ad928SBarry Smith EXTERN_C_END 3764b9ad928SBarry Smith 3774b9ad928SBarry Smith /* -------------------------------------------------------------------------------*/ 3784b9ad928SBarry Smith 3794b9ad928SBarry Smith #undef __FUNCT__ 38018be62a5SSatish Balay #define __FUNCT__ "PCShellSetDestroy" 38118be62a5SSatish Balay /*@C 38218be62a5SSatish Balay PCShellSetDestroy - Sets routine to use to destroy the user-provided 38318be62a5SSatish Balay application context. 38418be62a5SSatish Balay 38518be62a5SSatish Balay Collective on PC 38618be62a5SSatish Balay 38718be62a5SSatish Balay Input Parameters: 38818be62a5SSatish Balay + pc - the preconditioner context 38918be62a5SSatish Balay . destroy - the application-provided destroy routine 39018be62a5SSatish Balay 39118be62a5SSatish Balay Calling sequence of destroy: 39218be62a5SSatish Balay .vb 39318be62a5SSatish Balay PetscErrorCode destroy (void *ptr) 39418be62a5SSatish Balay .ve 39518be62a5SSatish Balay 39618be62a5SSatish Balay . ptr - the application context 39718be62a5SSatish Balay 39818be62a5SSatish Balay Level: developer 39918be62a5SSatish Balay 40018be62a5SSatish Balay .keywords: PC, shell, set, destroy, user-provided 40118be62a5SSatish Balay 40218be62a5SSatish Balay .seealso: PCShellSetApply(), PCShellSetContext() 40318be62a5SSatish Balay @*/ 40418be62a5SSatish Balay PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetDestroy(PC pc,PetscErrorCode (*destroy)(void*)) 40518be62a5SSatish Balay { 40618be62a5SSatish Balay PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*)); 40718be62a5SSatish Balay 40818be62a5SSatish Balay PetscFunctionBegin; 40918be62a5SSatish Balay PetscValidHeaderSpecific(pc,PC_COOKIE,1); 41018be62a5SSatish Balay ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetDestroy_C",(void (**)(void))&f);CHKERRQ(ierr); 41118be62a5SSatish Balay if (f) { 41218be62a5SSatish Balay ierr = (*f)(pc,destroy);CHKERRQ(ierr); 41318be62a5SSatish Balay } 41418be62a5SSatish Balay PetscFunctionReturn(0); 41518be62a5SSatish Balay } 41618be62a5SSatish Balay 41718be62a5SSatish Balay 41818be62a5SSatish Balay #undef __FUNCT__ 4194b9ad928SBarry Smith #define __FUNCT__ "PCShellSetSetUp" 4204b9ad928SBarry Smith /*@C 4214b9ad928SBarry Smith PCShellSetSetUp - Sets routine to use to "setup" the preconditioner whenever the 4224b9ad928SBarry Smith matrix operator is changed. 4234b9ad928SBarry Smith 4244b9ad928SBarry Smith Collective on PC 4254b9ad928SBarry Smith 4264b9ad928SBarry Smith Input Parameters: 4274b9ad928SBarry Smith + pc - the preconditioner context 4284b9ad928SBarry Smith . setup - the application-provided setup routine 4294b9ad928SBarry Smith 4304b9ad928SBarry Smith Calling sequence of setup: 4314b9ad928SBarry Smith .vb 43213f74950SBarry Smith PetscErrorCode setup (void *ptr) 4334b9ad928SBarry Smith .ve 4344b9ad928SBarry Smith 4354b9ad928SBarry Smith . ptr - the application context 4364b9ad928SBarry Smith 4374b9ad928SBarry Smith Level: developer 4384b9ad928SBarry Smith 4394b9ad928SBarry Smith .keywords: PC, shell, set, setup, user-provided 4404b9ad928SBarry Smith 441be29d3c6SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetApply(), PCShellSetContext() 4424b9ad928SBarry Smith @*/ 443dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetSetUp(PC pc,PetscErrorCode (*setup)(void*)) 4444b9ad928SBarry Smith { 4456849ba73SBarry Smith PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*)); 4464b9ad928SBarry Smith 4474b9ad928SBarry Smith PetscFunctionBegin; 4484482741eSBarry Smith PetscValidHeaderSpecific(pc,PC_COOKIE,1); 4494b9ad928SBarry Smith ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetSetUp_C",(void (**)(void))&f);CHKERRQ(ierr); 4504b9ad928SBarry Smith if (f) { 4514b9ad928SBarry Smith ierr = (*f)(pc,setup);CHKERRQ(ierr); 4524b9ad928SBarry Smith } 4534b9ad928SBarry Smith PetscFunctionReturn(0); 4544b9ad928SBarry Smith } 4554b9ad928SBarry Smith 4564b9ad928SBarry Smith 4574b9ad928SBarry Smith #undef __FUNCT__ 4584b9ad928SBarry Smith #define __FUNCT__ "PCShellSetView" 4594b9ad928SBarry Smith /*@C 4604b9ad928SBarry Smith PCShellSetView - Sets routine to use as viewer of shell preconditioner 4614b9ad928SBarry Smith 4624b9ad928SBarry Smith Collective on PC 4634b9ad928SBarry Smith 4644b9ad928SBarry Smith Input Parameters: 4654b9ad928SBarry Smith + pc - the preconditioner context 4664b9ad928SBarry Smith - view - the application-provided view routine 4674b9ad928SBarry Smith 4684b9ad928SBarry Smith Calling sequence of apply: 4694b9ad928SBarry Smith .vb 47013f74950SBarry Smith PetscErrorCode view(void *ptr,PetscViewer v) 4714b9ad928SBarry Smith .ve 4724b9ad928SBarry Smith 4734b9ad928SBarry Smith + ptr - the application context 4744b9ad928SBarry Smith - v - viewer 4754b9ad928SBarry Smith 4764b9ad928SBarry Smith Level: developer 4774b9ad928SBarry Smith 4784b9ad928SBarry Smith .keywords: PC, shell, set, apply, user-provided 4794b9ad928SBarry Smith 4804b9ad928SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose() 4814b9ad928SBarry Smith @*/ 482dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetView(PC pc,PetscErrorCode (*view)(void*,PetscViewer)) 4834b9ad928SBarry Smith { 4846849ba73SBarry Smith PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*,PetscViewer)); 4854b9ad928SBarry Smith 4864b9ad928SBarry Smith PetscFunctionBegin; 4874482741eSBarry Smith PetscValidHeaderSpecific(pc,PC_COOKIE,1); 4884b9ad928SBarry Smith ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetView_C",(void (**)(void))&f);CHKERRQ(ierr); 4894b9ad928SBarry Smith if (f) { 4904b9ad928SBarry Smith ierr = (*f)(pc,view);CHKERRQ(ierr); 4914b9ad928SBarry Smith } 4924b9ad928SBarry Smith PetscFunctionReturn(0); 4934b9ad928SBarry Smith } 4944b9ad928SBarry Smith 4954b9ad928SBarry Smith #undef __FUNCT__ 4964b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApply" 4974b9ad928SBarry Smith /*@C 4984b9ad928SBarry Smith PCShellSetApply - Sets routine to use as preconditioner. 4994b9ad928SBarry Smith 5004b9ad928SBarry Smith Collective on PC 5014b9ad928SBarry Smith 5024b9ad928SBarry Smith Input Parameters: 5034b9ad928SBarry Smith + pc - the preconditioner context 504be29d3c6SBarry Smith - apply - the application-provided preconditioning routine 5054b9ad928SBarry Smith 5064b9ad928SBarry Smith Calling sequence of apply: 5074b9ad928SBarry Smith .vb 50813f74950SBarry Smith PetscErrorCode apply (void *ptr,Vec xin,Vec xout) 5094b9ad928SBarry Smith .ve 5104b9ad928SBarry Smith 5114b9ad928SBarry Smith + ptr - the application context 5124b9ad928SBarry Smith . xin - input vector 5134b9ad928SBarry Smith - xout - output vector 5144b9ad928SBarry Smith 5154b9ad928SBarry Smith Level: developer 5164b9ad928SBarry Smith 5174b9ad928SBarry Smith .keywords: PC, shell, set, apply, user-provided 5184b9ad928SBarry Smith 519be29d3c6SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose(), PCShellSetContext() 5204b9ad928SBarry Smith @*/ 521be29d3c6SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApply(PC pc,PetscErrorCode (*apply)(void*,Vec,Vec)) 5224b9ad928SBarry Smith { 523be29d3c6SBarry Smith PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*,Vec,Vec)); 5244b9ad928SBarry Smith 5254b9ad928SBarry Smith PetscFunctionBegin; 5264482741eSBarry Smith PetscValidHeaderSpecific(pc,PC_COOKIE,1); 5274b9ad928SBarry Smith ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetApply_C",(void (**)(void))&f);CHKERRQ(ierr); 5284b9ad928SBarry Smith if (f) { 529be29d3c6SBarry Smith ierr = (*f)(pc,apply);CHKERRQ(ierr); 5304b9ad928SBarry Smith } 5314b9ad928SBarry Smith PetscFunctionReturn(0); 5324b9ad928SBarry Smith } 5334b9ad928SBarry Smith 5344b9ad928SBarry Smith #undef __FUNCT__ 5354b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApplyTranspose" 5364b9ad928SBarry Smith /*@C 5374b9ad928SBarry Smith PCShellSetApplyTranspose - Sets routine to use as preconditioner transpose. 5384b9ad928SBarry Smith 5394b9ad928SBarry Smith Collective on PC 5404b9ad928SBarry Smith 5414b9ad928SBarry Smith Input Parameters: 5424b9ad928SBarry Smith + pc - the preconditioner context 5434b9ad928SBarry Smith - apply - the application-provided preconditioning transpose routine 5444b9ad928SBarry Smith 5454b9ad928SBarry Smith Calling sequence of apply: 5464b9ad928SBarry Smith .vb 54713f74950SBarry Smith PetscErrorCode applytranspose (void *ptr,Vec xin,Vec xout) 5484b9ad928SBarry Smith .ve 5494b9ad928SBarry Smith 5504b9ad928SBarry Smith + ptr - the application context 5514b9ad928SBarry Smith . xin - input vector 5524b9ad928SBarry Smith - xout - output vector 5534b9ad928SBarry Smith 5544b9ad928SBarry Smith Level: developer 5554b9ad928SBarry Smith 5564b9ad928SBarry Smith Notes: 5574b9ad928SBarry Smith Uses the same context variable as PCShellSetApply(). 5584b9ad928SBarry Smith 5594b9ad928SBarry Smith .keywords: PC, shell, set, apply, user-provided 5604b9ad928SBarry Smith 561be29d3c6SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApply(), PCSetContext() 5624b9ad928SBarry Smith @*/ 563dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApplyTranspose(PC pc,PetscErrorCode (*applytranspose)(void*,Vec,Vec)) 5644b9ad928SBarry Smith { 5656849ba73SBarry Smith PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*,Vec,Vec)); 5664b9ad928SBarry Smith 5674b9ad928SBarry Smith PetscFunctionBegin; 5684482741eSBarry Smith PetscValidHeaderSpecific(pc,PC_COOKIE,1); 5694b9ad928SBarry Smith ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetApplyTranspose_C",(void (**)(void))&f);CHKERRQ(ierr); 5704b9ad928SBarry Smith if (f) { 5714b9ad928SBarry Smith ierr = (*f)(pc,applytranspose);CHKERRQ(ierr); 5724b9ad928SBarry Smith } 5734b9ad928SBarry Smith PetscFunctionReturn(0); 5744b9ad928SBarry Smith } 5754b9ad928SBarry Smith 5764b9ad928SBarry Smith #undef __FUNCT__ 5777cdd61b2SBarry Smith #define __FUNCT__ "PCShellSetPreSolve" 5787cdd61b2SBarry Smith /*@C 5797cdd61b2SBarry Smith PCShellSetPreSolve - Sets routine to apply to the operators/vectors before a KSPSolve() is 5807cdd61b2SBarry Smith applied. This usually does something like scale the linear system in some application 5817cdd61b2SBarry Smith specific way. 5827cdd61b2SBarry Smith 5837cdd61b2SBarry Smith Collective on PC 5847cdd61b2SBarry Smith 5857cdd61b2SBarry Smith Input Parameters: 5867cdd61b2SBarry Smith + pc - the preconditioner context 5877cdd61b2SBarry Smith - presolve - the application-provided presolve routine 5887cdd61b2SBarry Smith 5897cdd61b2SBarry Smith Calling sequence of presolve: 5907cdd61b2SBarry Smith .vb 5917cdd61b2SBarry Smith PetscErrorCode presolve (void *ptr,KSP ksp,Vec b,Vec x) 5927cdd61b2SBarry Smith .ve 5937cdd61b2SBarry Smith 5947cdd61b2SBarry Smith + ptr - the application context 5957cdd61b2SBarry Smith . xin - input vector 5967cdd61b2SBarry Smith - xout - output vector 5977cdd61b2SBarry Smith 5987cdd61b2SBarry Smith Level: developer 5997cdd61b2SBarry Smith 6007cdd61b2SBarry Smith .keywords: PC, shell, set, apply, user-provided 6017cdd61b2SBarry Smith 602be29d3c6SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose(), PCShellSetPostSolve(), PCShellSetContext() 6037cdd61b2SBarry Smith @*/ 6047cdd61b2SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetPreSolve(PC pc,PetscErrorCode (*presolve)(void*,KSP,Vec,Vec)) 6057cdd61b2SBarry Smith { 6067cdd61b2SBarry Smith PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*,KSP,Vec,Vec)); 6077cdd61b2SBarry Smith 6087cdd61b2SBarry Smith PetscFunctionBegin; 6097cdd61b2SBarry Smith PetscValidHeaderSpecific(pc,PC_COOKIE,1); 6107cdd61b2SBarry Smith ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetPreSolve_C",(void (**)(void))&f);CHKERRQ(ierr); 6117cdd61b2SBarry Smith if (f) { 6127cdd61b2SBarry Smith ierr = (*f)(pc,presolve);CHKERRQ(ierr); 6137cdd61b2SBarry Smith } 6147cdd61b2SBarry Smith PetscFunctionReturn(0); 6157cdd61b2SBarry Smith } 6167cdd61b2SBarry Smith 6177cdd61b2SBarry Smith #undef __FUNCT__ 6187cdd61b2SBarry Smith #define __FUNCT__ "PCShellSetPostSolve" 6197cdd61b2SBarry Smith /*@C 6207cdd61b2SBarry Smith PCShellSetPostSolve - Sets routine to apply to the operators/vectors before a KSPSolve() is 6217cdd61b2SBarry Smith applied. This usually does something like scale the linear system in some application 6227cdd61b2SBarry Smith specific way. 6237cdd61b2SBarry Smith 6247cdd61b2SBarry Smith Collective on PC 6257cdd61b2SBarry Smith 6267cdd61b2SBarry Smith Input Parameters: 6277cdd61b2SBarry Smith + pc - the preconditioner context 6287cdd61b2SBarry Smith - postsolve - the application-provided presolve routine 6297cdd61b2SBarry Smith 6307cdd61b2SBarry Smith Calling sequence of postsolve: 6317cdd61b2SBarry Smith .vb 6327cdd61b2SBarry Smith PetscErrorCode postsolve(void *ptr,KSP ksp,Vec b,Vec x) 6337cdd61b2SBarry Smith .ve 6347cdd61b2SBarry Smith 6357cdd61b2SBarry Smith + ptr - the application context 6367cdd61b2SBarry Smith . xin - input vector 6377cdd61b2SBarry Smith - xout - output vector 6387cdd61b2SBarry Smith 6397cdd61b2SBarry Smith Level: developer 6407cdd61b2SBarry Smith 6417cdd61b2SBarry Smith .keywords: PC, shell, set, apply, user-provided 6427cdd61b2SBarry Smith 643be29d3c6SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose(), PCShellSetPreSolve(), PCShellSetContext() 6447cdd61b2SBarry Smith @*/ 6457cdd61b2SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetPostSolve(PC pc,PetscErrorCode (*postsolve)(void*,KSP,Vec,Vec)) 6467cdd61b2SBarry Smith { 6477cdd61b2SBarry Smith PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*,KSP,Vec,Vec)); 6487cdd61b2SBarry Smith 6497cdd61b2SBarry Smith PetscFunctionBegin; 6507cdd61b2SBarry Smith PetscValidHeaderSpecific(pc,PC_COOKIE,1); 6517cdd61b2SBarry Smith ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetPostSolve_C",(void (**)(void))&f);CHKERRQ(ierr); 6527cdd61b2SBarry Smith if (f) { 6537cdd61b2SBarry Smith ierr = (*f)(pc,postsolve);CHKERRQ(ierr); 6547cdd61b2SBarry Smith } 6557cdd61b2SBarry Smith PetscFunctionReturn(0); 6567cdd61b2SBarry Smith } 6577cdd61b2SBarry Smith 6587cdd61b2SBarry Smith #undef __FUNCT__ 6594b9ad928SBarry Smith #define __FUNCT__ "PCShellSetName" 6604b9ad928SBarry Smith /*@C 6614b9ad928SBarry Smith PCShellSetName - Sets an optional name to associate with a shell 6624b9ad928SBarry Smith preconditioner. 6634b9ad928SBarry Smith 6644b9ad928SBarry Smith Not Collective 6654b9ad928SBarry Smith 6664b9ad928SBarry Smith Input Parameters: 6674b9ad928SBarry Smith + pc - the preconditioner context 6684b9ad928SBarry Smith - name - character string describing shell preconditioner 6694b9ad928SBarry Smith 6704b9ad928SBarry Smith Level: developer 6714b9ad928SBarry Smith 6724b9ad928SBarry Smith .keywords: PC, shell, set, name, user-provided 6734b9ad928SBarry Smith 6744b9ad928SBarry Smith .seealso: PCShellGetName() 6754b9ad928SBarry Smith @*/ 676dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetName(PC pc,const char name[]) 6774b9ad928SBarry Smith { 678dfbe8321SBarry Smith PetscErrorCode ierr,(*f)(PC,const char []); 6794b9ad928SBarry Smith 6804b9ad928SBarry Smith PetscFunctionBegin; 6814482741eSBarry Smith PetscValidHeaderSpecific(pc,PC_COOKIE,1); 6824b9ad928SBarry Smith ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetName_C",(void (**)(void))&f);CHKERRQ(ierr); 6834b9ad928SBarry Smith if (f) { 6844b9ad928SBarry Smith ierr = (*f)(pc,name);CHKERRQ(ierr); 6854b9ad928SBarry Smith } 6864b9ad928SBarry Smith PetscFunctionReturn(0); 6874b9ad928SBarry Smith } 6884b9ad928SBarry Smith 6894b9ad928SBarry Smith #undef __FUNCT__ 6904b9ad928SBarry Smith #define __FUNCT__ "PCShellGetName" 6914b9ad928SBarry Smith /*@C 6924b9ad928SBarry Smith PCShellGetName - Gets an optional name that the user has set for a shell 6934b9ad928SBarry Smith preconditioner. 6944b9ad928SBarry Smith 6954b9ad928SBarry Smith Not Collective 6964b9ad928SBarry Smith 6974b9ad928SBarry Smith Input Parameter: 6984b9ad928SBarry Smith . pc - the preconditioner context 6994b9ad928SBarry Smith 7004b9ad928SBarry Smith Output Parameter: 7014b9ad928SBarry Smith . name - character string describing shell preconditioner (you should not free this) 7024b9ad928SBarry Smith 7034b9ad928SBarry Smith Level: developer 7044b9ad928SBarry Smith 7054b9ad928SBarry Smith .keywords: PC, shell, get, name, user-provided 7064b9ad928SBarry Smith 7074b9ad928SBarry Smith .seealso: PCShellSetName() 7084b9ad928SBarry Smith @*/ 709dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCShellGetName(PC pc,char *name[]) 7104b9ad928SBarry Smith { 711dfbe8321SBarry Smith PetscErrorCode ierr,(*f)(PC,char *[]); 7124b9ad928SBarry Smith 7134b9ad928SBarry Smith PetscFunctionBegin; 7144482741eSBarry Smith PetscValidHeaderSpecific(pc,PC_COOKIE,1); 7154482741eSBarry Smith PetscValidPointer(name,2); 7164b9ad928SBarry Smith ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellGetName_C",(void (**)(void))&f);CHKERRQ(ierr); 7174b9ad928SBarry Smith if (f) { 7184b9ad928SBarry Smith ierr = (*f)(pc,name);CHKERRQ(ierr); 7194b9ad928SBarry Smith } else { 7201302d50aSBarry Smith SETERRQ(PETSC_ERR_ARG_WRONG,"Not shell preconditioner, cannot get name"); 7214b9ad928SBarry Smith } 7224b9ad928SBarry Smith PetscFunctionReturn(0); 7234b9ad928SBarry Smith } 7244b9ad928SBarry Smith 7254b9ad928SBarry Smith #undef __FUNCT__ 7264b9ad928SBarry Smith #define __FUNCT__ "PCShellSetApplyRichardson" 7274b9ad928SBarry Smith /*@C 7284b9ad928SBarry Smith PCShellSetApplyRichardson - Sets routine to use as preconditioner 7294b9ad928SBarry Smith in Richardson iteration. 7304b9ad928SBarry Smith 7314b9ad928SBarry Smith Collective on PC 7324b9ad928SBarry Smith 7334b9ad928SBarry Smith Input Parameters: 7344b9ad928SBarry Smith + pc - the preconditioner context 735be29d3c6SBarry Smith - apply - the application-provided preconditioning routine 7364b9ad928SBarry Smith 7374b9ad928SBarry Smith Calling sequence of apply: 7384b9ad928SBarry Smith .vb 73913f74950SBarry Smith PetscErrorCode apply (void *ptr,Vec b,Vec x,Vec r,PetscReal rtol,PetscReal abstol,PetscReal dtol,PetscInt maxits) 7404b9ad928SBarry Smith .ve 7414b9ad928SBarry Smith 7424b9ad928SBarry Smith + ptr - the application context 7434b9ad928SBarry Smith . b - right-hand-side 7444b9ad928SBarry Smith . x - current iterate 7454b9ad928SBarry Smith . r - work space 7464b9ad928SBarry Smith . rtol - relative tolerance of residual norm to stop at 74770441072SBarry Smith . abstol - absolute tolerance of residual norm to stop at 7484b9ad928SBarry Smith . dtol - if residual norm increases by this factor than return 7494b9ad928SBarry Smith - maxits - number of iterations to run 7504b9ad928SBarry Smith 7514b9ad928SBarry Smith Level: developer 7524b9ad928SBarry Smith 7534b9ad928SBarry Smith .keywords: PC, shell, set, apply, Richardson, user-provided 7544b9ad928SBarry Smith 755be29d3c6SBarry Smith .seealso: PCShellSetApply(), PCShellSetContext() 7564b9ad928SBarry Smith @*/ 757be29d3c6SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCShellSetApplyRichardson(PC pc,PetscErrorCode (*apply)(void*,Vec,Vec,Vec,PetscReal,PetscReal,PetscReal,PetscInt)) 7584b9ad928SBarry Smith { 759be29d3c6SBarry Smith PetscErrorCode ierr,(*f)(PC,PetscErrorCode (*)(void*,Vec,Vec,Vec,PetscReal,PetscReal,PetscReal,PetscInt)); 7604b9ad928SBarry Smith 7614b9ad928SBarry Smith PetscFunctionBegin; 7624482741eSBarry Smith PetscValidHeaderSpecific(pc,PC_COOKIE,1); 7634b9ad928SBarry Smith ierr = PetscObjectQueryFunction((PetscObject)pc,"PCShellSetApplyRichardson_C",(void (**)(void))&f);CHKERRQ(ierr); 7644b9ad928SBarry Smith if (f) { 765be29d3c6SBarry Smith ierr = (*f)(pc,apply);CHKERRQ(ierr); 7664b9ad928SBarry Smith } 7674b9ad928SBarry Smith PetscFunctionReturn(0); 7684b9ad928SBarry Smith } 7694b9ad928SBarry Smith 7704b9ad928SBarry Smith /*MC 7714b9ad928SBarry Smith PCSHELL - Creates a new preconditioner class for use with your 7724b9ad928SBarry Smith own private data storage format. 7734b9ad928SBarry Smith 7744b9ad928SBarry Smith Level: advanced 7754b9ad928SBarry Smith 7764b9ad928SBarry Smith Concepts: providing your own preconditioner 7774b9ad928SBarry Smith 7784b9ad928SBarry Smith Usage: 7796849ba73SBarry Smith $ PetscErrorCode (*mult)(void*,Vec,Vec); 7806849ba73SBarry Smith $ PetscErrorCode (*setup)(void*); 7814b9ad928SBarry Smith $ PCCreate(comm,&pc); 7824b9ad928SBarry Smith $ PCSetType(pc,PCSHELL); 783be29d3c6SBarry Smith $ PCShellSetApply(pc,mult); 784be29d3c6SBarry Smith $ PCShellSetContext(pc,ctx) 7854b9ad928SBarry Smith $ PCShellSetSetUp(pc,setup); (optional) 7864b9ad928SBarry Smith 7874b9ad928SBarry Smith .seealso: PCCreate(), PCSetType(), PCType (for list of available types), PC, 788fd2d0fe1Svictor MATSHELL, PCShellSetSetUp(), PCShellSetApply(), PCShellSetView(), 789fd2d0fe1Svictor PCShellSetApplyTranspose(), PCShellSetName(), PCShellSetApplyRichardson(), 790be29d3c6SBarry Smith PCShellGetName(), PCShellSetContext(), PCShellGetContext() 7914b9ad928SBarry Smith M*/ 7924b9ad928SBarry Smith 7934b9ad928SBarry Smith EXTERN_C_BEGIN 7944b9ad928SBarry Smith #undef __FUNCT__ 7954b9ad928SBarry Smith #define __FUNCT__ "PCCreate_Shell" 796dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCCreate_Shell(PC pc) 7974b9ad928SBarry Smith { 798dfbe8321SBarry Smith PetscErrorCode ierr; 7994b9ad928SBarry Smith PC_Shell *shell; 8004b9ad928SBarry Smith 8014b9ad928SBarry Smith PetscFunctionBegin; 8024b9ad928SBarry Smith pc->ops->destroy = PCDestroy_Shell; 8034b9ad928SBarry Smith ierr = PetscNew(PC_Shell,&shell);CHKERRQ(ierr); 80452e6d16bSBarry Smith ierr = PetscLogObjectMemory(pc,sizeof(PC_Shell));CHKERRQ(ierr); 8054b9ad928SBarry Smith pc->data = (void*)shell; 8064b9ad928SBarry Smith pc->name = 0; 8074b9ad928SBarry Smith 8084b9ad928SBarry Smith pc->ops->apply = PCApply_Shell; 8094b9ad928SBarry Smith pc->ops->view = PCView_Shell; 8104b9ad928SBarry Smith pc->ops->applytranspose = PCApplyTranspose_Shell; 8114b9ad928SBarry Smith pc->ops->applyrichardson = 0; 8124b9ad928SBarry Smith pc->ops->setup = PCSetUp_Shell; 8139bbb2c88SBarry Smith pc->ops->presolve = 0; 8149bbb2c88SBarry Smith pc->ops->postsolve = 0; 8154b9ad928SBarry Smith pc->ops->view = PCView_Shell; 8164b9ad928SBarry Smith 8174b9ad928SBarry Smith shell->apply = 0; 8184b9ad928SBarry Smith shell->applytranspose = 0; 8194b9ad928SBarry Smith shell->name = 0; 8204b9ad928SBarry Smith shell->applyrich = 0; 8217cdd61b2SBarry Smith shell->presolve = 0; 8227cdd61b2SBarry Smith shell->postsolve = 0; 8234b9ad928SBarry Smith shell->ctx = 0; 8244b9ad928SBarry Smith shell->setup = 0; 8254b9ad928SBarry Smith shell->view = 0; 82618be62a5SSatish Balay shell->destroy = 0; 8274b9ad928SBarry Smith 82818be62a5SSatish Balay ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetDestroy_C","PCShellSetDestroy_Shell", 82918be62a5SSatish Balay PCShellSetDestroy_Shell);CHKERRQ(ierr); 8304b9ad928SBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetSetUp_C","PCShellSetSetUp_Shell", 8314b9ad928SBarry Smith PCShellSetSetUp_Shell);CHKERRQ(ierr); 8324b9ad928SBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetApply_C","PCShellSetApply_Shell", 8334b9ad928SBarry Smith PCShellSetApply_Shell);CHKERRQ(ierr); 8347cdd61b2SBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetPreSolve_C","PCShellSetPreSolve_Shell", 8357cdd61b2SBarry Smith PCShellSetPreSolve_Shell);CHKERRQ(ierr); 8367cdd61b2SBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetPostSolve_C","PCShellSetPostSolve_Shell", 8377cdd61b2SBarry Smith PCShellSetPostSolve_Shell);CHKERRQ(ierr); 8384b9ad928SBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetView_C","PCShellSetView_Shell", 8394b9ad928SBarry Smith PCShellSetView_Shell);CHKERRQ(ierr); 840be29d3c6SBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetApplyTranspose_C","PCShellSetApplyTranspose_Shell", 8414b9ad928SBarry Smith PCShellSetApplyTranspose_Shell);CHKERRQ(ierr); 8424b9ad928SBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetName_C","PCShellSetName_Shell", 8434b9ad928SBarry Smith PCShellSetName_Shell);CHKERRQ(ierr); 8444b9ad928SBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellGetName_C","PCShellGetName_Shell", 8454b9ad928SBarry Smith PCShellGetName_Shell);CHKERRQ(ierr); 846be29d3c6SBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCShellSetApplyRichardson_C","PCShellSetApplyRichardson_Shell", 8474b9ad928SBarry Smith PCShellSetApplyRichardson_Shell);CHKERRQ(ierr); 8484b9ad928SBarry Smith PetscFunctionReturn(0); 8494b9ad928SBarry Smith } 8504b9ad928SBarry Smith EXTERN_C_END 8514b9ad928SBarry Smith 8524b9ad928SBarry Smith 8534b9ad928SBarry Smith 8544b9ad928SBarry Smith 8554b9ad928SBarry Smith 8564b9ad928SBarry Smith 857