14d0a8057SBarry Smith 24b9ad928SBarry Smith /* 34b9ad928SBarry Smith This provides a simple shell for Fortran (and C programmers) to 44b9ad928SBarry Smith create their own preconditioner without writing much interface code. 54b9ad928SBarry Smith */ 64b9ad928SBarry Smith 7af0996ceSBarry Smith #include <petsc/private/pcimpl.h> /*I "petscpc.h" I*/ 84b9ad928SBarry Smith 94b9ad928SBarry Smith typedef struct { 10be29d3c6SBarry Smith void *ctx; /* user provided contexts for preconditioner */ 112fa5cd67SKarl Rupp 126891c3e4SJed Brown PetscErrorCode (*destroy)(PC); 136891c3e4SJed Brown PetscErrorCode (*setup)(PC); 146891c3e4SJed Brown PetscErrorCode (*apply)(PC,Vec,Vec); 15*7b6e2003SPierre Jolivet PetscErrorCode (*matapply)(PC,Mat,Mat); 161b581b66SBarry Smith PetscErrorCode (*applysymmetricleft)(PC,Vec,Vec); 171b581b66SBarry Smith PetscErrorCode (*applysymmetricright)(PC,Vec,Vec); 186891c3e4SJed Brown PetscErrorCode (*applyBA)(PC,PCSide,Vec,Vec,Vec); 196891c3e4SJed Brown PetscErrorCode (*presolve)(PC,KSP,Vec,Vec); 206891c3e4SJed Brown PetscErrorCode (*postsolve)(PC,KSP,Vec,Vec); 216891c3e4SJed Brown PetscErrorCode (*view)(PC,PetscViewer); 226891c3e4SJed Brown PetscErrorCode (*applytranspose)(PC,Vec,Vec); 23ace3abfcSBarry Smith PetscErrorCode (*applyrich)(PC,Vec,Vec,Vec,PetscReal,PetscReal,PetscReal,PetscInt,PetscBool,PetscInt*,PCRichardsonConvergedReason*); 242fa5cd67SKarl Rupp 254b9ad928SBarry Smith char *name; 264b9ad928SBarry Smith } PC_Shell; 274b9ad928SBarry Smith 28b29801fcSSatish Balay /*@C 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: 34c5ae4b9aSBarry Smith . pc - should have been created with PCSetType(pc,shell) 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 4495452b02SPatrick Sanan Fortran Notes: 4595452b02SPatrick Sanan To use this from Fortran you must write a Fortran interface definition for this 46daf670e6SBarry Smith function that tells Fortran the Fortran derived data type that you are passing in as the ctx argument. 47daf670e6SBarry Smith 48c5ae4b9aSBarry Smith .seealso: PCShellSetContext() 49be29d3c6SBarry Smith @*/ 507087cfbeSBarry Smith PetscErrorCode PCShellGetContext(PC pc,void **ctx) 51be29d3c6SBarry Smith { 52be29d3c6SBarry Smith PetscErrorCode ierr; 53ace3abfcSBarry Smith PetscBool flg; 54be29d3c6SBarry Smith 55be29d3c6SBarry Smith PetscFunctionBegin; 560700a824SBarry Smith PetscValidHeaderSpecific(pc,PC_CLASSID,1); 57be29d3c6SBarry Smith PetscValidPointer(ctx,2); 58251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)pc,PCSHELL,&flg);CHKERRQ(ierr); 590a545947SLisandro Dalcin if (!flg) *ctx = NULL; 60be29d3c6SBarry Smith else *ctx = ((PC_Shell*)(pc->data))->ctx; 61be29d3c6SBarry Smith PetscFunctionReturn(0); 62be29d3c6SBarry Smith } 63be29d3c6SBarry Smith 649dd1005fSJed Brown /*@ 65be29d3c6SBarry Smith PCShellSetContext - sets the context for a shell PC 66be29d3c6SBarry Smith 673f9fe445SBarry Smith Logically 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 7595452b02SPatrick Sanan Fortran Notes: 7695452b02SPatrick Sanan To use this from Fortran you must write a Fortran interface definition for this 77daf670e6SBarry Smith function that tells Fortran the Fortran derived data type that you are passing in as the ctx argument. 78daf670e6SBarry Smith 79be29d3c6SBarry Smith 806895c445SBarry Smith 81c5ae4b9aSBarry Smith .seealso: PCShellGetContext(), PCSHELL 82be29d3c6SBarry Smith @*/ 837087cfbeSBarry Smith PetscErrorCode PCShellSetContext(PC pc,void *ctx) 84be29d3c6SBarry Smith { 85c5ae4b9aSBarry Smith PC_Shell *shell = (PC_Shell*)pc->data; 86be29d3c6SBarry Smith PetscErrorCode ierr; 87ace3abfcSBarry Smith PetscBool flg; 88be29d3c6SBarry Smith 89be29d3c6SBarry Smith PetscFunctionBegin; 900700a824SBarry Smith PetscValidHeaderSpecific(pc,PC_CLASSID,1); 91251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)pc,PCSHELL,&flg);CHKERRQ(ierr); 922fa5cd67SKarl Rupp if (flg) shell->ctx = ctx; 93be29d3c6SBarry Smith PetscFunctionReturn(0); 94be29d3c6SBarry Smith } 95be29d3c6SBarry Smith 966849ba73SBarry Smith static PetscErrorCode PCSetUp_Shell(PC pc) 974b9ad928SBarry Smith { 98c5ae4b9aSBarry Smith PC_Shell *shell = (PC_Shell*)pc->data; 99dfbe8321SBarry Smith PetscErrorCode ierr; 1004b9ad928SBarry Smith 1014b9ad928SBarry Smith PetscFunctionBegin; 102ce94432eSBarry Smith if (!shell->setup) SETERRQ(PetscObjectComm((PetscObject)pc),PETSC_ERR_USER,"No setup() routine provided to Shell PC"); 103eb6b5d47SBarry Smith PetscStackCall("PCSHELL user function setup()",ierr = (*shell->setup)(pc);CHKERRQ(ierr)); 1044b9ad928SBarry Smith PetscFunctionReturn(0); 1054b9ad928SBarry Smith } 1064b9ad928SBarry Smith 1076849ba73SBarry Smith static PetscErrorCode PCApply_Shell(PC pc,Vec x,Vec y) 1084b9ad928SBarry Smith { 109c5ae4b9aSBarry Smith PC_Shell *shell = (PC_Shell*)pc->data; 110dfbe8321SBarry Smith PetscErrorCode ierr; 111e3f487b0SBarry Smith PetscObjectState instate,outstate; 1124b9ad928SBarry Smith 1134b9ad928SBarry Smith PetscFunctionBegin; 114ce94432eSBarry Smith if (!shell->apply) SETERRQ(PetscObjectComm((PetscObject)pc),PETSC_ERR_USER,"No apply() routine provided to Shell PC"); 115e3f487b0SBarry Smith ierr = PetscObjectStateGet((PetscObject)y, &instate);CHKERRQ(ierr); 116eb6b5d47SBarry Smith PetscStackCall("PCSHELL user function apply()",ierr = (*shell->apply)(pc,x,y);CHKERRQ(ierr)); 117e3f487b0SBarry Smith ierr = PetscObjectStateGet((PetscObject)y, &outstate);CHKERRQ(ierr); 118e3f487b0SBarry Smith if (instate == outstate) { 119e3f487b0SBarry Smith /* increase the state of the output vector since the user did not update its state themselve as should have been done */ 120e3f487b0SBarry Smith ierr = PetscObjectStateIncrease((PetscObject)y);CHKERRQ(ierr); 121e3f487b0SBarry Smith } 1224b9ad928SBarry Smith PetscFunctionReturn(0); 1234b9ad928SBarry Smith } 1244b9ad928SBarry Smith 125*7b6e2003SPierre Jolivet static PetscErrorCode PCMatApply_Shell(PC pc,Mat X,Mat Y) 126*7b6e2003SPierre Jolivet { 127*7b6e2003SPierre Jolivet PC_Shell *shell = (PC_Shell*)pc->data; 128*7b6e2003SPierre Jolivet PetscErrorCode ierr; 129*7b6e2003SPierre Jolivet PetscObjectState instate,outstate; 130*7b6e2003SPierre Jolivet 131*7b6e2003SPierre Jolivet PetscFunctionBegin; 132*7b6e2003SPierre Jolivet if (!shell->matapply) SETERRQ(PetscObjectComm((PetscObject)pc),PETSC_ERR_USER,"No apply() routine provided to Shell PC"); 133*7b6e2003SPierre Jolivet ierr = PetscObjectStateGet((PetscObject)Y, &instate);CHKERRQ(ierr); 134*7b6e2003SPierre Jolivet PetscStackCall("PCSHELL user function apply()",ierr = (*shell->matapply)(pc,X,Y);CHKERRQ(ierr)); 135*7b6e2003SPierre Jolivet ierr = PetscObjectStateGet((PetscObject)Y, &outstate);CHKERRQ(ierr); 136*7b6e2003SPierre Jolivet if (instate == outstate) { 137*7b6e2003SPierre Jolivet /* increase the state of the output vector since the user did not update its state themselve as should have been done */ 138*7b6e2003SPierre Jolivet ierr = PetscObjectStateIncrease((PetscObject)Y);CHKERRQ(ierr); 139*7b6e2003SPierre Jolivet } 140*7b6e2003SPierre Jolivet PetscFunctionReturn(0); 141*7b6e2003SPierre Jolivet } 142*7b6e2003SPierre Jolivet 1431b581b66SBarry Smith static PetscErrorCode PCApplySymmetricLeft_Shell(PC pc,Vec x,Vec y) 1441b581b66SBarry Smith { 1451b581b66SBarry Smith PC_Shell *shell = (PC_Shell*)pc->data; 1461b581b66SBarry Smith PetscErrorCode ierr; 1471b581b66SBarry Smith 1481b581b66SBarry Smith PetscFunctionBegin; 1491b581b66SBarry Smith if (!shell->applysymmetricleft) SETERRQ(PetscObjectComm((PetscObject)pc),PETSC_ERR_USER,"No apply() routine provided to Shell PC"); 1501b581b66SBarry Smith PetscStackCall("PCSHELL user function apply()",ierr = (*shell->applysymmetricleft)(pc,x,y);CHKERRQ(ierr)); 1511b581b66SBarry Smith PetscFunctionReturn(0); 1521b581b66SBarry Smith } 1531b581b66SBarry Smith 1541b581b66SBarry Smith static PetscErrorCode PCApplySymmetricRight_Shell(PC pc,Vec x,Vec y) 1551b581b66SBarry Smith { 1561b581b66SBarry Smith PC_Shell *shell = (PC_Shell*)pc->data; 1571b581b66SBarry Smith PetscErrorCode ierr; 1581b581b66SBarry Smith 1591b581b66SBarry Smith PetscFunctionBegin; 1601b581b66SBarry Smith if (!shell->applysymmetricright) SETERRQ(PetscObjectComm((PetscObject)pc),PETSC_ERR_USER,"No apply() routine provided to Shell PC"); 1611b581b66SBarry Smith PetscStackCall("PCSHELL user function apply()",ierr = (*shell->applysymmetricright)(pc,x,y);CHKERRQ(ierr)); 1621b581b66SBarry Smith PetscFunctionReturn(0); 1631b581b66SBarry Smith } 1641b581b66SBarry Smith 1652bb17772SBarry Smith static PetscErrorCode PCApplyBA_Shell(PC pc,PCSide side,Vec x,Vec y,Vec w) 1662bb17772SBarry Smith { 167c5ae4b9aSBarry Smith PC_Shell *shell = (PC_Shell*)pc->data; 1682bb17772SBarry Smith PetscErrorCode ierr; 169e3f487b0SBarry Smith PetscObjectState instate,outstate; 1702bb17772SBarry Smith 1712bb17772SBarry Smith PetscFunctionBegin; 172ce94432eSBarry Smith if (!shell->applyBA) SETERRQ(PetscObjectComm((PetscObject)pc),PETSC_ERR_USER,"No applyBA() routine provided to Shell PC"); 173e3f487b0SBarry Smith ierr = PetscObjectStateGet((PetscObject)w, &instate);CHKERRQ(ierr); 174eb6b5d47SBarry Smith PetscStackCall("PCSHELL user function applyBA()",ierr = (*shell->applyBA)(pc,side,x,y,w);CHKERRQ(ierr)); 175e3f487b0SBarry Smith ierr = PetscObjectStateGet((PetscObject)w, &outstate);CHKERRQ(ierr); 176e3f487b0SBarry Smith if (instate == outstate) { 177e3f487b0SBarry Smith /* increase the state of the output vector since the user did not update its state themselve as should have been done */ 178e3f487b0SBarry Smith ierr = PetscObjectStateIncrease((PetscObject)w);CHKERRQ(ierr); 179e3f487b0SBarry Smith } 1802bb17772SBarry Smith PetscFunctionReturn(0); 1812bb17772SBarry Smith } 1822bb17772SBarry Smith 183a06fd7f2SStefano Zampini static PetscErrorCode PCPreSolveChangeRHS_Shell(PC pc,PetscBool* change) 184a06fd7f2SStefano Zampini { 185a06fd7f2SStefano Zampini PetscFunctionBegin; 186a06fd7f2SStefano Zampini *change = PETSC_TRUE; 187a06fd7f2SStefano Zampini PetscFunctionReturn(0); 188a06fd7f2SStefano Zampini } 189a06fd7f2SStefano Zampini 1907cdd61b2SBarry Smith static PetscErrorCode PCPreSolve_Shell(PC pc,KSP ksp,Vec b,Vec x) 1917cdd61b2SBarry Smith { 192c5ae4b9aSBarry Smith PC_Shell *shell = (PC_Shell*)pc->data; 1937cdd61b2SBarry Smith PetscErrorCode ierr; 1947cdd61b2SBarry Smith 1957cdd61b2SBarry Smith PetscFunctionBegin; 196ce94432eSBarry Smith if (!shell->presolve) SETERRQ(PetscObjectComm((PetscObject)pc),PETSC_ERR_USER,"No presolve() routine provided to Shell PC"); 197eb6b5d47SBarry Smith PetscStackCall("PCSHELL user function presolve()",ierr = (*shell->presolve)(pc,ksp,b,x);CHKERRQ(ierr)); 1987cdd61b2SBarry Smith PetscFunctionReturn(0); 1997cdd61b2SBarry Smith } 2007cdd61b2SBarry Smith 2017cdd61b2SBarry Smith static PetscErrorCode PCPostSolve_Shell(PC pc,KSP ksp,Vec b,Vec x) 2027cdd61b2SBarry Smith { 203c5ae4b9aSBarry Smith PC_Shell *shell = (PC_Shell*)pc->data; 2047cdd61b2SBarry Smith PetscErrorCode ierr; 2057cdd61b2SBarry Smith 2067cdd61b2SBarry Smith PetscFunctionBegin; 207ce94432eSBarry Smith if (!shell->postsolve) SETERRQ(PetscObjectComm((PetscObject)pc),PETSC_ERR_USER,"No postsolve() routine provided to Shell PC"); 208eb6b5d47SBarry Smith PetscStackCall("PCSHELL user function postsolve()",ierr = (*shell->postsolve)(pc,ksp,b,x);CHKERRQ(ierr)); 2097cdd61b2SBarry Smith PetscFunctionReturn(0); 2107cdd61b2SBarry Smith } 2117cdd61b2SBarry Smith 2126849ba73SBarry Smith static PetscErrorCode PCApplyTranspose_Shell(PC pc,Vec x,Vec y) 2134b9ad928SBarry Smith { 214c5ae4b9aSBarry Smith PC_Shell *shell = (PC_Shell*)pc->data; 215dfbe8321SBarry Smith PetscErrorCode ierr; 216e3f487b0SBarry Smith PetscObjectState instate,outstate; 2174b9ad928SBarry Smith 2184b9ad928SBarry Smith PetscFunctionBegin; 219ce94432eSBarry Smith if (!shell->applytranspose) SETERRQ(PetscObjectComm((PetscObject)pc),PETSC_ERR_USER,"No applytranspose() routine provided to Shell PC"); 220e3f487b0SBarry Smith ierr = PetscObjectStateGet((PetscObject)y, &instate);CHKERRQ(ierr); 221eb6b5d47SBarry Smith PetscStackCall("PCSHELL user function applytranspose()",ierr = (*shell->applytranspose)(pc,x,y);CHKERRQ(ierr)); 222e3f487b0SBarry Smith ierr = PetscObjectStateGet((PetscObject)y, &outstate);CHKERRQ(ierr); 223e3f487b0SBarry Smith if (instate == outstate) { 224e3f487b0SBarry Smith /* increase the state of the output vector since the user did not update its state themself as should have been done */ 225e3f487b0SBarry Smith ierr = PetscObjectStateIncrease((PetscObject)y);CHKERRQ(ierr); 226e3f487b0SBarry Smith } 2274b9ad928SBarry Smith PetscFunctionReturn(0); 2284b9ad928SBarry Smith } 2294b9ad928SBarry Smith 230ace3abfcSBarry Smith static PetscErrorCode PCApplyRichardson_Shell(PC pc,Vec x,Vec y,Vec w,PetscReal rtol,PetscReal abstol, PetscReal dtol,PetscInt it,PetscBool guesszero,PetscInt *outits,PCRichardsonConvergedReason *reason) 2314b9ad928SBarry Smith { 232dfbe8321SBarry Smith PetscErrorCode ierr; 233c5ae4b9aSBarry Smith PC_Shell *shell = (PC_Shell*)pc->data; 234e3f487b0SBarry Smith PetscObjectState instate,outstate; 2354b9ad928SBarry Smith 2364b9ad928SBarry Smith PetscFunctionBegin; 237ce94432eSBarry Smith if (!shell->applyrich) SETERRQ(PetscObjectComm((PetscObject)pc),PETSC_ERR_USER,"No applyrichardson() routine provided to Shell PC"); 238e3f487b0SBarry Smith ierr = PetscObjectStateGet((PetscObject)y, &instate);CHKERRQ(ierr); 239eb6b5d47SBarry Smith PetscStackCall("PCSHELL user function applyrichardson()",ierr = (*shell->applyrich)(pc,x,y,w,rtol,abstol,dtol,it,guesszero,outits,reason);CHKERRQ(ierr)); 240e3f487b0SBarry Smith ierr = PetscObjectStateGet((PetscObject)y, &outstate);CHKERRQ(ierr); 241e3f487b0SBarry Smith if (instate == outstate) { 242e3f487b0SBarry Smith /* increase the state of the output vector since the user did not update its state themself as should have been done */ 243e3f487b0SBarry Smith ierr = PetscObjectStateIncrease((PetscObject)y);CHKERRQ(ierr); 244e3f487b0SBarry Smith } 2454b9ad928SBarry Smith PetscFunctionReturn(0); 2464b9ad928SBarry Smith } 2474b9ad928SBarry Smith 2486849ba73SBarry Smith static PetscErrorCode PCDestroy_Shell(PC pc) 2494b9ad928SBarry Smith { 2504b9ad928SBarry Smith PC_Shell *shell = (PC_Shell*)pc->data; 251dfbe8321SBarry Smith PetscErrorCode ierr; 2524b9ad928SBarry Smith 2534b9ad928SBarry Smith PetscFunctionBegin; 254503cfb0cSBarry Smith ierr = PetscFree(shell->name);CHKERRQ(ierr); 2552fa5cd67SKarl Rupp if (shell->destroy) PetscStackCall("PCSHELL user function destroy()",ierr = (*shell->destroy)(pc);CHKERRQ(ierr)); 256a06fd7f2SStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)pc,"PCShellSetDestroy_C",NULL);CHKERRQ(ierr); 257a06fd7f2SStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)pc,"PCShellSetSetUp_C",NULL);CHKERRQ(ierr); 258a06fd7f2SStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)pc,"PCShellSetApply_C",NULL);CHKERRQ(ierr); 259*7b6e2003SPierre Jolivet ierr = PetscObjectComposeFunction((PetscObject)pc,"PCShellSetMatApply_C",NULL);CHKERRQ(ierr); 260a06fd7f2SStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)pc,"PCShellSetApplySymmetricLeft_C",NULL);CHKERRQ(ierr); 261a06fd7f2SStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)pc,"PCShellSetApplySymmetricRight_C",NULL);CHKERRQ(ierr); 262a06fd7f2SStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)pc,"PCShellSetApplyBA_C",NULL);CHKERRQ(ierr); 263a06fd7f2SStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)pc,"PCShellSetPreSolve_C",NULL);CHKERRQ(ierr); 264a06fd7f2SStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)pc,"PCShellSetPostSolve_C",NULL);CHKERRQ(ierr); 265a06fd7f2SStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)pc,"PCShellSetView_C",NULL);CHKERRQ(ierr); 266a06fd7f2SStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)pc,"PCShellSetApplyTranspose_C",NULL);CHKERRQ(ierr); 267a06fd7f2SStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)pc,"PCShellSetName_C",NULL);CHKERRQ(ierr); 268a06fd7f2SStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)pc,"PCShellGetName_C",NULL);CHKERRQ(ierr); 269a06fd7f2SStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)pc,"PCShellSetApplyRichardson_C",NULL);CHKERRQ(ierr); 270a06fd7f2SStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)pc,"PCPreSolveChangeRHS_C",NULL);CHKERRQ(ierr); 271c31cb41cSBarry Smith ierr = PetscFree(pc->data);CHKERRQ(ierr); 2724b9ad928SBarry Smith PetscFunctionReturn(0); 2734b9ad928SBarry Smith } 2744b9ad928SBarry Smith 2756849ba73SBarry Smith static PetscErrorCode PCView_Shell(PC pc,PetscViewer viewer) 2764b9ad928SBarry Smith { 2774b9ad928SBarry Smith PC_Shell *shell = (PC_Shell*)pc->data; 278dfbe8321SBarry Smith PetscErrorCode ierr; 279ace3abfcSBarry Smith PetscBool iascii; 2804b9ad928SBarry Smith 2814b9ad928SBarry Smith PetscFunctionBegin; 282251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 28332077d6dSBarry Smith if (iascii) { 2842fa5cd67SKarl Rupp if (shell->name) { 285efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," %s\n",shell->name);CHKERRQ(ierr); 2862fa5cd67SKarl Rupp } else { 287efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," no name\n");CHKERRQ(ierr); 2882fa5cd67SKarl Rupp } 2894b9ad928SBarry Smith } 2904b9ad928SBarry Smith if (shell->view) { 2914b9ad928SBarry Smith ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 2926891c3e4SJed Brown ierr = (*shell->view)(pc,viewer);CHKERRQ(ierr); 2934b9ad928SBarry Smith ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 2944b9ad928SBarry Smith } 2954b9ad928SBarry Smith PetscFunctionReturn(0); 2964b9ad928SBarry Smith } 2974b9ad928SBarry Smith 2984b9ad928SBarry Smith /* ------------------------------------------------------------------------------*/ 299f7a08781SBarry Smith static PetscErrorCode PCShellSetDestroy_Shell(PC pc, PetscErrorCode (*destroy)(PC)) 30018be62a5SSatish Balay { 301c5ae4b9aSBarry Smith PC_Shell *shell= (PC_Shell*)pc->data; 30218be62a5SSatish Balay 30318be62a5SSatish Balay PetscFunctionBegin; 30418be62a5SSatish Balay shell->destroy = destroy; 30518be62a5SSatish Balay PetscFunctionReturn(0); 30618be62a5SSatish Balay } 30718be62a5SSatish Balay 308f7a08781SBarry Smith static PetscErrorCode PCShellSetSetUp_Shell(PC pc, PetscErrorCode (*setup)(PC)) 3094b9ad928SBarry Smith { 310feb237baSPierre Jolivet PC_Shell *shell = (PC_Shell*)pc->data; 3114b9ad928SBarry Smith 3124b9ad928SBarry Smith PetscFunctionBegin; 3134b9ad928SBarry Smith shell->setup = setup; 314d01c8aa3SLisandro Dalcin if (setup) pc->ops->setup = PCSetUp_Shell; 3150a545947SLisandro Dalcin else pc->ops->setup = NULL; 3164b9ad928SBarry Smith PetscFunctionReturn(0); 3174b9ad928SBarry Smith } 3184b9ad928SBarry Smith 319f7a08781SBarry Smith static PetscErrorCode PCShellSetApply_Shell(PC pc,PetscErrorCode (*apply)(PC,Vec,Vec)) 3204b9ad928SBarry Smith { 321c5ae4b9aSBarry Smith PC_Shell *shell = (PC_Shell*)pc->data; 3224b9ad928SBarry Smith 3234b9ad928SBarry Smith PetscFunctionBegin; 3244b9ad928SBarry Smith shell->apply = apply; 3254b9ad928SBarry Smith PetscFunctionReturn(0); 3264b9ad928SBarry Smith } 3274b9ad928SBarry Smith 328*7b6e2003SPierre Jolivet static PetscErrorCode PCShellSetMatApply_Shell(PC pc,PetscErrorCode (*matapply)(PC,Mat,Mat)) 329*7b6e2003SPierre Jolivet { 330*7b6e2003SPierre Jolivet PC_Shell *shell = (PC_Shell*)pc->data; 331*7b6e2003SPierre Jolivet 332*7b6e2003SPierre Jolivet PetscFunctionBegin; 333*7b6e2003SPierre Jolivet shell->matapply = matapply; 334*7b6e2003SPierre Jolivet PetscFunctionReturn(0); 335*7b6e2003SPierre Jolivet } 336*7b6e2003SPierre Jolivet 3371b581b66SBarry Smith static PetscErrorCode PCShellSetApplySymmetricLeft_Shell(PC pc,PetscErrorCode (*apply)(PC,Vec,Vec)) 3381b581b66SBarry Smith { 3391b581b66SBarry Smith PC_Shell *shell = (PC_Shell*)pc->data; 3401b581b66SBarry Smith 3411b581b66SBarry Smith PetscFunctionBegin; 3421b581b66SBarry Smith shell->applysymmetricleft = apply; 3431b581b66SBarry Smith PetscFunctionReturn(0); 3441b581b66SBarry Smith } 3451b581b66SBarry Smith 3461b581b66SBarry Smith static PetscErrorCode PCShellSetApplySymmetricRight_Shell(PC pc,PetscErrorCode (*apply)(PC,Vec,Vec)) 3471b581b66SBarry Smith { 3481b581b66SBarry Smith PC_Shell *shell = (PC_Shell*)pc->data; 3491b581b66SBarry Smith 3501b581b66SBarry Smith PetscFunctionBegin; 3511b581b66SBarry Smith shell->applysymmetricright = apply; 3521b581b66SBarry Smith PetscFunctionReturn(0); 3531b581b66SBarry Smith } 3541b581b66SBarry Smith 355f7a08781SBarry Smith static PetscErrorCode PCShellSetApplyBA_Shell(PC pc,PetscErrorCode (*applyBA)(PC,PCSide,Vec,Vec,Vec)) 3562bb17772SBarry Smith { 357c5ae4b9aSBarry Smith PC_Shell *shell = (PC_Shell*)pc->data; 3582bb17772SBarry Smith 3592bb17772SBarry Smith PetscFunctionBegin; 360d01c8aa3SLisandro Dalcin shell->applyBA = applyBA; 361d01c8aa3SLisandro Dalcin if (applyBA) pc->ops->applyBA = PCApplyBA_Shell; 3620a545947SLisandro Dalcin else pc->ops->applyBA = NULL; 3632bb17772SBarry Smith PetscFunctionReturn(0); 3642bb17772SBarry Smith } 3652bb17772SBarry Smith 366f7a08781SBarry Smith static PetscErrorCode PCShellSetPreSolve_Shell(PC pc,PetscErrorCode (*presolve)(PC,KSP,Vec,Vec)) 3677cdd61b2SBarry Smith { 368c5ae4b9aSBarry Smith PC_Shell *shell = (PC_Shell*)pc->data; 369a06fd7f2SStefano Zampini PetscErrorCode ierr; 3707cdd61b2SBarry Smith 3717cdd61b2SBarry Smith PetscFunctionBegin; 3727cdd61b2SBarry Smith shell->presolve = presolve; 373a06fd7f2SStefano Zampini if (presolve) { 374a06fd7f2SStefano Zampini pc->ops->presolve = PCPreSolve_Shell; 375a06fd7f2SStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)pc,"PCPreSolveChangeRHS_C",PCPreSolveChangeRHS_Shell);CHKERRQ(ierr); 376a06fd7f2SStefano Zampini } else { 3770a545947SLisandro Dalcin pc->ops->presolve = NULL; 378a06fd7f2SStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)pc,"PCPreSolveChangeRHS_C",NULL);CHKERRQ(ierr); 379a06fd7f2SStefano Zampini } 3807cdd61b2SBarry Smith PetscFunctionReturn(0); 3817cdd61b2SBarry Smith } 3827cdd61b2SBarry Smith 383f7a08781SBarry Smith static PetscErrorCode PCShellSetPostSolve_Shell(PC pc,PetscErrorCode (*postsolve)(PC,KSP,Vec,Vec)) 3847cdd61b2SBarry Smith { 385c5ae4b9aSBarry Smith PC_Shell *shell = (PC_Shell*)pc->data; 3867cdd61b2SBarry Smith 3877cdd61b2SBarry Smith PetscFunctionBegin; 3887cdd61b2SBarry Smith shell->postsolve = postsolve; 389d01c8aa3SLisandro Dalcin if (postsolve) pc->ops->postsolve = PCPostSolve_Shell; 3900a545947SLisandro Dalcin else pc->ops->postsolve = NULL; 3917cdd61b2SBarry Smith PetscFunctionReturn(0); 3927cdd61b2SBarry Smith } 3937cdd61b2SBarry Smith 394f7a08781SBarry Smith static PetscErrorCode PCShellSetView_Shell(PC pc,PetscErrorCode (*view)(PC,PetscViewer)) 3954b9ad928SBarry Smith { 396c5ae4b9aSBarry Smith PC_Shell *shell = (PC_Shell*)pc->data; 3974b9ad928SBarry Smith 3984b9ad928SBarry Smith PetscFunctionBegin; 3994b9ad928SBarry Smith shell->view = view; 4004b9ad928SBarry Smith PetscFunctionReturn(0); 4014b9ad928SBarry Smith } 4024b9ad928SBarry Smith 403f7a08781SBarry Smith static PetscErrorCode PCShellSetApplyTranspose_Shell(PC pc,PetscErrorCode (*applytranspose)(PC,Vec,Vec)) 4044b9ad928SBarry Smith { 405c5ae4b9aSBarry Smith PC_Shell *shell = (PC_Shell*)pc->data; 4064b9ad928SBarry Smith 4074b9ad928SBarry Smith PetscFunctionBegin; 4084b9ad928SBarry Smith shell->applytranspose = applytranspose; 409d01c8aa3SLisandro Dalcin if (applytranspose) pc->ops->applytranspose = PCApplyTranspose_Shell; 4100a545947SLisandro Dalcin else pc->ops->applytranspose = NULL; 411d01c8aa3SLisandro Dalcin PetscFunctionReturn(0); 412d01c8aa3SLisandro Dalcin } 413d01c8aa3SLisandro Dalcin 414f7a08781SBarry Smith static PetscErrorCode PCShellSetApplyRichardson_Shell(PC pc,PetscErrorCode (*applyrich)(PC,Vec,Vec,Vec,PetscReal,PetscReal,PetscReal,PetscInt,PetscBool ,PetscInt*,PCRichardsonConvergedReason*)) 415d01c8aa3SLisandro Dalcin { 416c5ae4b9aSBarry Smith PC_Shell *shell = (PC_Shell*)pc->data; 417d01c8aa3SLisandro Dalcin 418d01c8aa3SLisandro Dalcin PetscFunctionBegin; 419d01c8aa3SLisandro Dalcin shell->applyrich = applyrich; 420d01c8aa3SLisandro Dalcin if (applyrich) pc->ops->applyrichardson = PCApplyRichardson_Shell; 4210a545947SLisandro Dalcin else pc->ops->applyrichardson = NULL; 4224b9ad928SBarry Smith PetscFunctionReturn(0); 4234b9ad928SBarry Smith } 4244b9ad928SBarry Smith 425f7a08781SBarry Smith static PetscErrorCode PCShellSetName_Shell(PC pc,const char name[]) 4264b9ad928SBarry Smith { 427c5ae4b9aSBarry Smith PC_Shell *shell = (PC_Shell*)pc->data; 428dfbe8321SBarry Smith PetscErrorCode ierr; 4294b9ad928SBarry Smith 4304b9ad928SBarry Smith PetscFunctionBegin; 431503cfb0cSBarry Smith ierr = PetscFree(shell->name);CHKERRQ(ierr); 4324b9ad928SBarry Smith ierr = PetscStrallocpy(name,&shell->name);CHKERRQ(ierr); 4334b9ad928SBarry Smith PetscFunctionReturn(0); 4344b9ad928SBarry Smith } 4354b9ad928SBarry Smith 436f7a08781SBarry Smith static PetscErrorCode PCShellGetName_Shell(PC pc,const char *name[]) 4374b9ad928SBarry Smith { 438c5ae4b9aSBarry Smith PC_Shell *shell = (PC_Shell*)pc->data; 4394b9ad928SBarry Smith 4404b9ad928SBarry Smith PetscFunctionBegin; 4414b9ad928SBarry Smith *name = shell->name; 4424b9ad928SBarry Smith PetscFunctionReturn(0); 4434b9ad928SBarry Smith } 4444b9ad928SBarry Smith 4454b9ad928SBarry Smith /* -------------------------------------------------------------------------------*/ 4464b9ad928SBarry Smith 44718be62a5SSatish Balay /*@C 44818be62a5SSatish Balay PCShellSetDestroy - Sets routine to use to destroy the user-provided 44918be62a5SSatish Balay application context. 45018be62a5SSatish Balay 4513f9fe445SBarry Smith Logically Collective on PC 45218be62a5SSatish Balay 45318be62a5SSatish Balay Input Parameters: 45418be62a5SSatish Balay + pc - the preconditioner context 455a2b725a8SWilliam Gropp - destroy - the application-provided destroy routine 45618be62a5SSatish Balay 45718be62a5SSatish Balay Calling sequence of destroy: 45818be62a5SSatish Balay .vb 4596891c3e4SJed Brown PetscErrorCode destroy (PC) 46018be62a5SSatish Balay .ve 46118be62a5SSatish Balay 46218be62a5SSatish Balay . ptr - the application context 46318be62a5SSatish Balay 46495452b02SPatrick Sanan Notes: 46595452b02SPatrick Sanan the function MUST return an error code of 0 on success and nonzero on failure. 4664aa34b0aSBarry Smith 46718be62a5SSatish Balay Level: developer 46818be62a5SSatish Balay 46918be62a5SSatish Balay .seealso: PCShellSetApply(), PCShellSetContext() 47018be62a5SSatish Balay @*/ 4717087cfbeSBarry Smith PetscErrorCode PCShellSetDestroy(PC pc,PetscErrorCode (*destroy)(PC)) 47218be62a5SSatish Balay { 4734ac538c5SBarry Smith PetscErrorCode ierr; 47418be62a5SSatish Balay 47518be62a5SSatish Balay PetscFunctionBegin; 4760700a824SBarry Smith PetscValidHeaderSpecific(pc,PC_CLASSID,1); 4774ac538c5SBarry Smith ierr = PetscTryMethod(pc,"PCShellSetDestroy_C",(PC,PetscErrorCode (*)(PC)),(pc,destroy));CHKERRQ(ierr); 47818be62a5SSatish Balay PetscFunctionReturn(0); 47918be62a5SSatish Balay } 48018be62a5SSatish Balay 48118be62a5SSatish Balay 4824b9ad928SBarry Smith /*@C 4834b9ad928SBarry Smith PCShellSetSetUp - Sets routine to use to "setup" the preconditioner whenever the 4844b9ad928SBarry Smith matrix operator is changed. 4854b9ad928SBarry Smith 4863f9fe445SBarry Smith Logically Collective on PC 4874b9ad928SBarry Smith 4884b9ad928SBarry Smith Input Parameters: 4894b9ad928SBarry Smith + pc - the preconditioner context 490a2b725a8SWilliam Gropp - setup - the application-provided setup routine 4914b9ad928SBarry Smith 4924b9ad928SBarry Smith Calling sequence of setup: 4934b9ad928SBarry Smith .vb 4946891c3e4SJed Brown PetscErrorCode setup (PC pc) 4954b9ad928SBarry Smith .ve 4964b9ad928SBarry Smith 4976891c3e4SJed Brown . pc - the preconditioner, get the application context with PCShellGetContext() 4984b9ad928SBarry Smith 49995452b02SPatrick Sanan Notes: 50095452b02SPatrick Sanan the function MUST return an error code of 0 on success and nonzero on failure. 5014aa34b0aSBarry Smith 5024b9ad928SBarry Smith Level: developer 5034b9ad928SBarry Smith 504be29d3c6SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetApply(), PCShellSetContext() 5054b9ad928SBarry Smith @*/ 5067087cfbeSBarry Smith PetscErrorCode PCShellSetSetUp(PC pc,PetscErrorCode (*setup)(PC)) 5074b9ad928SBarry Smith { 5084ac538c5SBarry Smith PetscErrorCode ierr; 5094b9ad928SBarry Smith 5104b9ad928SBarry Smith PetscFunctionBegin; 5110700a824SBarry Smith PetscValidHeaderSpecific(pc,PC_CLASSID,1); 5124ac538c5SBarry Smith ierr = PetscTryMethod(pc,"PCShellSetSetUp_C",(PC,PetscErrorCode (*)(PC)),(pc,setup));CHKERRQ(ierr); 5134b9ad928SBarry Smith PetscFunctionReturn(0); 5144b9ad928SBarry Smith } 5154b9ad928SBarry Smith 5164b9ad928SBarry Smith 5174b9ad928SBarry Smith /*@C 5184b9ad928SBarry Smith PCShellSetView - Sets routine to use as viewer of shell preconditioner 5194b9ad928SBarry Smith 5203f9fe445SBarry Smith Logically Collective on PC 5214b9ad928SBarry Smith 5224b9ad928SBarry Smith Input Parameters: 5234b9ad928SBarry Smith + pc - the preconditioner context 5244b9ad928SBarry Smith - view - the application-provided view routine 5254b9ad928SBarry Smith 52653a7a830SPatrick Sanan Calling sequence of view: 5274b9ad928SBarry Smith .vb 5286891c3e4SJed Brown PetscErrorCode view(PC pc,PetscViewer v) 5294b9ad928SBarry Smith .ve 5304b9ad928SBarry Smith 5316891c3e4SJed Brown + pc - the preconditioner, get the application context with PCShellGetContext() 5324b9ad928SBarry Smith - v - viewer 5334b9ad928SBarry Smith 53495452b02SPatrick Sanan Notes: 53595452b02SPatrick Sanan the function MUST return an error code of 0 on success and nonzero on failure. 5364aa34b0aSBarry Smith 5374b9ad928SBarry Smith Level: developer 5384b9ad928SBarry Smith 5394b9ad928SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose() 5404b9ad928SBarry Smith @*/ 5417087cfbeSBarry Smith PetscErrorCode PCShellSetView(PC pc,PetscErrorCode (*view)(PC,PetscViewer)) 5424b9ad928SBarry Smith { 5434ac538c5SBarry Smith PetscErrorCode ierr; 5444b9ad928SBarry Smith 5454b9ad928SBarry Smith PetscFunctionBegin; 5460700a824SBarry Smith PetscValidHeaderSpecific(pc,PC_CLASSID,1); 5474ac538c5SBarry Smith ierr = PetscTryMethod(pc,"PCShellSetView_C",(PC,PetscErrorCode (*)(PC,PetscViewer)),(pc,view));CHKERRQ(ierr); 5484b9ad928SBarry Smith PetscFunctionReturn(0); 5494b9ad928SBarry Smith } 5504b9ad928SBarry Smith 5514b9ad928SBarry Smith /*@C 5524b9ad928SBarry Smith PCShellSetApply - Sets routine to use as preconditioner. 5534b9ad928SBarry Smith 5543f9fe445SBarry Smith Logically Collective on PC 5554b9ad928SBarry Smith 5564b9ad928SBarry Smith Input Parameters: 5574b9ad928SBarry Smith + pc - the preconditioner context 558be29d3c6SBarry Smith - apply - the application-provided preconditioning routine 5594b9ad928SBarry Smith 5604b9ad928SBarry Smith Calling sequence of apply: 5614b9ad928SBarry Smith .vb 5626891c3e4SJed Brown PetscErrorCode apply (PC pc,Vec xin,Vec xout) 5634b9ad928SBarry Smith .ve 5644b9ad928SBarry Smith 5656891c3e4SJed Brown + pc - the preconditioner, get the application context with PCShellGetContext() 5664b9ad928SBarry Smith . xin - input vector 5674b9ad928SBarry Smith - xout - output vector 5684b9ad928SBarry Smith 56995452b02SPatrick Sanan Notes: 57095452b02SPatrick Sanan the function MUST return an error code of 0 on success and nonzero on failure. 5714aa34b0aSBarry Smith 5724b9ad928SBarry Smith Level: developer 5734b9ad928SBarry Smith 574a4c07401SPatrick Sanan .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose(), PCShellSetContext(), PCShellSetApplyBA(), PCShellSetApplySymmetricRight(),PCShellSetApplySymmetricLeft() 5754b9ad928SBarry Smith @*/ 5767087cfbeSBarry Smith PetscErrorCode PCShellSetApply(PC pc,PetscErrorCode (*apply)(PC,Vec,Vec)) 5774b9ad928SBarry Smith { 5784ac538c5SBarry Smith PetscErrorCode ierr; 5794b9ad928SBarry Smith 5804b9ad928SBarry Smith PetscFunctionBegin; 5810700a824SBarry Smith PetscValidHeaderSpecific(pc,PC_CLASSID,1); 5824ac538c5SBarry Smith ierr = PetscTryMethod(pc,"PCShellSetApply_C",(PC,PetscErrorCode (*)(PC,Vec,Vec)),(pc,apply));CHKERRQ(ierr); 5834b9ad928SBarry Smith PetscFunctionReturn(0); 5844b9ad928SBarry Smith } 5854b9ad928SBarry Smith 5861b581b66SBarry Smith /*@C 587*7b6e2003SPierre Jolivet PCShellSetApply - Sets routine to use as preconditioner on a block of vectors. 588*7b6e2003SPierre Jolivet 589*7b6e2003SPierre Jolivet Logically Collective on PC 590*7b6e2003SPierre Jolivet 591*7b6e2003SPierre Jolivet Input Parameters: 592*7b6e2003SPierre Jolivet + pc - the preconditioner context 593*7b6e2003SPierre Jolivet - apply - the application-provided preconditioning routine 594*7b6e2003SPierre Jolivet 595*7b6e2003SPierre Jolivet Calling sequence of apply: 596*7b6e2003SPierre Jolivet .vb 597*7b6e2003SPierre Jolivet PetscErrorCode apply (PC pc,Mat Xin,Mat Xout) 598*7b6e2003SPierre Jolivet .ve 599*7b6e2003SPierre Jolivet 600*7b6e2003SPierre Jolivet + pc - the preconditioner, get the application context with PCShellGetContext() 601*7b6e2003SPierre Jolivet . Xin - input block of vectors 602*7b6e2003SPierre Jolivet - Xout - output block of vectors 603*7b6e2003SPierre Jolivet 604*7b6e2003SPierre Jolivet Notes: 605*7b6e2003SPierre Jolivet the function MUST return an error code of 0 on success and nonzero on failure. 606*7b6e2003SPierre Jolivet 607*7b6e2003SPierre Jolivet Level: developer 608*7b6e2003SPierre Jolivet 609*7b6e2003SPierre Jolivet .seealso: PCShellSetApply() 610*7b6e2003SPierre Jolivet @*/ 611*7b6e2003SPierre Jolivet PetscErrorCode PCShellSetMatApply(PC pc,PetscErrorCode (*matapply)(PC,Mat,Mat)) 612*7b6e2003SPierre Jolivet { 613*7b6e2003SPierre Jolivet PetscErrorCode ierr; 614*7b6e2003SPierre Jolivet 615*7b6e2003SPierre Jolivet PetscFunctionBegin; 616*7b6e2003SPierre Jolivet PetscValidHeaderSpecific(pc,PC_CLASSID,1); 617*7b6e2003SPierre Jolivet ierr = PetscTryMethod(pc,"PCShellSetMatApply_C",(PC,PetscErrorCode (*)(PC,Mat,Mat)),(pc,matapply));CHKERRQ(ierr); 618*7b6e2003SPierre Jolivet PetscFunctionReturn(0); 619*7b6e2003SPierre Jolivet } 620*7b6e2003SPierre Jolivet 621*7b6e2003SPierre Jolivet /*@C 6221b581b66SBarry Smith PCShellSetApplySymmetricLeft - Sets routine to use as left preconditioner (when the PC_SYMMETRIC is used). 6231b581b66SBarry Smith 6241b581b66SBarry Smith Logically Collective on PC 6251b581b66SBarry Smith 6261b581b66SBarry Smith Input Parameters: 6271b581b66SBarry Smith + pc - the preconditioner context 6281b581b66SBarry Smith - apply - the application-provided left preconditioning routine 6291b581b66SBarry Smith 6301b581b66SBarry Smith Calling sequence of apply: 6311b581b66SBarry Smith .vb 6321b581b66SBarry Smith PetscErrorCode apply (PC pc,Vec xin,Vec xout) 6331b581b66SBarry Smith .ve 6341b581b66SBarry Smith 6351b581b66SBarry Smith + pc - the preconditioner, get the application context with PCShellGetContext() 6361b581b66SBarry Smith . xin - input vector 6371b581b66SBarry Smith - xout - output vector 6381b581b66SBarry Smith 63995452b02SPatrick Sanan Notes: 64095452b02SPatrick Sanan the function MUST return an error code of 0 on success and nonzero on failure. 6411b581b66SBarry Smith 6421b581b66SBarry Smith Level: developer 6431b581b66SBarry Smith 6441b581b66SBarry Smith .seealso: PCShellSetApply(), PCShellSetApplySymmetricLeft(), PCShellSetSetUp(), PCShellSetApplyTranspose(), PCShellSetContext() 6451b581b66SBarry Smith @*/ 6461b581b66SBarry Smith PetscErrorCode PCShellSetApplySymmetricLeft(PC pc,PetscErrorCode (*apply)(PC,Vec,Vec)) 6471b581b66SBarry Smith { 6481b581b66SBarry Smith PetscErrorCode ierr; 6491b581b66SBarry Smith 6501b581b66SBarry Smith PetscFunctionBegin; 6511b581b66SBarry Smith PetscValidHeaderSpecific(pc,PC_CLASSID,1); 6521b581b66SBarry Smith ierr = PetscTryMethod(pc,"PCShellSetApplySymmetricLeft_C",(PC,PetscErrorCode (*)(PC,Vec,Vec)),(pc,apply));CHKERRQ(ierr); 6531b581b66SBarry Smith PetscFunctionReturn(0); 6541b581b66SBarry Smith } 6551b581b66SBarry Smith 6561b581b66SBarry Smith /*@C 657a4c07401SPatrick Sanan PCShellSetApplySymmetricRight - Sets routine to use as right preconditioner (when the PC_SYMMETRIC is used). 6581b581b66SBarry Smith 6591b581b66SBarry Smith Logically Collective on PC 6601b581b66SBarry Smith 6611b581b66SBarry Smith Input Parameters: 6621b581b66SBarry Smith + pc - the preconditioner context 6631b581b66SBarry Smith - apply - the application-provided right preconditioning routine 6641b581b66SBarry Smith 6651b581b66SBarry Smith Calling sequence of apply: 6661b581b66SBarry Smith .vb 6671b581b66SBarry Smith PetscErrorCode apply (PC pc,Vec xin,Vec xout) 6681b581b66SBarry Smith .ve 6691b581b66SBarry Smith 6701b581b66SBarry Smith + pc - the preconditioner, get the application context with PCShellGetContext() 6711b581b66SBarry Smith . xin - input vector 6721b581b66SBarry Smith - xout - output vector 6731b581b66SBarry Smith 67495452b02SPatrick Sanan Notes: 67595452b02SPatrick Sanan the function MUST return an error code of 0 on success and nonzero on failure. 6761b581b66SBarry Smith 6771b581b66SBarry Smith Level: developer 6781b581b66SBarry Smith 6791b581b66SBarry Smith .seealso: PCShellSetApply(), PCShellSetApplySymmetricLeft(), PCShellSetSetUp(), PCShellSetApplyTranspose(), PCShellSetContext() 6801b581b66SBarry Smith @*/ 6811b581b66SBarry Smith PetscErrorCode PCShellSetApplySymmetricRight(PC pc,PetscErrorCode (*apply)(PC,Vec,Vec)) 6821b581b66SBarry Smith { 6831b581b66SBarry Smith PetscErrorCode ierr; 6841b581b66SBarry Smith 6851b581b66SBarry Smith PetscFunctionBegin; 6861b581b66SBarry Smith PetscValidHeaderSpecific(pc,PC_CLASSID,1); 6871b581b66SBarry Smith ierr = PetscTryMethod(pc,"PCShellSetApplySymmetricRight_C",(PC,PetscErrorCode (*)(PC,Vec,Vec)),(pc,apply));CHKERRQ(ierr); 6881b581b66SBarry Smith PetscFunctionReturn(0); 6891b581b66SBarry Smith } 6901b581b66SBarry Smith 6912bb17772SBarry Smith /*@C 6922bb17772SBarry Smith PCShellSetApplyBA - Sets routine to use as preconditioner times operator. 6932bb17772SBarry Smith 6943f9fe445SBarry Smith Logically Collective on PC 6952bb17772SBarry Smith 6962bb17772SBarry Smith Input Parameters: 6972bb17772SBarry Smith + pc - the preconditioner context 6982bb17772SBarry Smith - applyBA - the application-provided BA routine 6992bb17772SBarry Smith 70053a7a830SPatrick Sanan Calling sequence of applyBA: 7012bb17772SBarry Smith .vb 7026891c3e4SJed Brown PetscErrorCode applyBA (PC pc,Vec xin,Vec xout) 7032bb17772SBarry Smith .ve 7042bb17772SBarry Smith 7056891c3e4SJed Brown + pc - the preconditioner, get the application context with PCShellGetContext() 7062bb17772SBarry Smith . xin - input vector 7072bb17772SBarry Smith - xout - output vector 7082bb17772SBarry Smith 70995452b02SPatrick Sanan Notes: 71095452b02SPatrick Sanan the function MUST return an error code of 0 on success and nonzero on failure. 7114aa34b0aSBarry Smith 7122bb17772SBarry Smith Level: developer 7132bb17772SBarry Smith 7142bb17772SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose(), PCShellSetContext(), PCShellSetApply() 7152bb17772SBarry Smith @*/ 7167087cfbeSBarry Smith PetscErrorCode PCShellSetApplyBA(PC pc,PetscErrorCode (*applyBA)(PC,PCSide,Vec,Vec,Vec)) 7172bb17772SBarry Smith { 7184ac538c5SBarry Smith PetscErrorCode ierr; 7192bb17772SBarry Smith 7202bb17772SBarry Smith PetscFunctionBegin; 7210700a824SBarry Smith PetscValidHeaderSpecific(pc,PC_CLASSID,1); 7224ac538c5SBarry Smith ierr = PetscTryMethod(pc,"PCShellSetApplyBA_C",(PC,PetscErrorCode (*)(PC,PCSide,Vec,Vec,Vec)),(pc,applyBA));CHKERRQ(ierr); 7232bb17772SBarry Smith PetscFunctionReturn(0); 7242bb17772SBarry Smith } 7252bb17772SBarry Smith 7264b9ad928SBarry Smith /*@C 7274b9ad928SBarry Smith PCShellSetApplyTranspose - Sets routine to use as preconditioner transpose. 7284b9ad928SBarry Smith 7293f9fe445SBarry Smith Logically Collective on PC 7304b9ad928SBarry Smith 7314b9ad928SBarry Smith Input Parameters: 7324b9ad928SBarry Smith + pc - the preconditioner context 7334b9ad928SBarry Smith - apply - the application-provided preconditioning transpose routine 7344b9ad928SBarry Smith 7354b9ad928SBarry Smith Calling sequence of apply: 7364b9ad928SBarry Smith .vb 7376891c3e4SJed Brown PetscErrorCode applytranspose (PC pc,Vec xin,Vec xout) 7384b9ad928SBarry Smith .ve 7394b9ad928SBarry Smith 7406891c3e4SJed Brown + pc - the preconditioner, get the application context with PCShellGetContext() 7414b9ad928SBarry Smith . xin - input vector 7424b9ad928SBarry Smith - xout - output vector 7434b9ad928SBarry Smith 74495452b02SPatrick Sanan Notes: 74595452b02SPatrick Sanan the function MUST return an error code of 0 on success and nonzero on failure. 7464aa34b0aSBarry Smith 7474b9ad928SBarry Smith Level: developer 7484b9ad928SBarry Smith 7494b9ad928SBarry Smith Notes: 7504b9ad928SBarry Smith Uses the same context variable as PCShellSetApply(). 7514b9ad928SBarry Smith 7522bb17772SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApply(), PCSetContext(), PCShellSetApplyBA() 7534b9ad928SBarry Smith @*/ 7547087cfbeSBarry Smith PetscErrorCode PCShellSetApplyTranspose(PC pc,PetscErrorCode (*applytranspose)(PC,Vec,Vec)) 7554b9ad928SBarry Smith { 7564ac538c5SBarry Smith PetscErrorCode ierr; 7574b9ad928SBarry Smith 7584b9ad928SBarry Smith PetscFunctionBegin; 7590700a824SBarry Smith PetscValidHeaderSpecific(pc,PC_CLASSID,1); 7604ac538c5SBarry Smith ierr = PetscTryMethod(pc,"PCShellSetApplyTranspose_C",(PC,PetscErrorCode (*)(PC,Vec,Vec)),(pc,applytranspose));CHKERRQ(ierr); 7614b9ad928SBarry Smith PetscFunctionReturn(0); 7624b9ad928SBarry Smith } 7634b9ad928SBarry Smith 7647cdd61b2SBarry Smith /*@C 7657cdd61b2SBarry Smith PCShellSetPreSolve - Sets routine to apply to the operators/vectors before a KSPSolve() is 7667cdd61b2SBarry Smith applied. This usually does something like scale the linear system in some application 7677cdd61b2SBarry Smith specific way. 7687cdd61b2SBarry Smith 7693f9fe445SBarry Smith Logically Collective on PC 7707cdd61b2SBarry Smith 7717cdd61b2SBarry Smith Input Parameters: 7727cdd61b2SBarry Smith + pc - the preconditioner context 7737cdd61b2SBarry Smith - presolve - the application-provided presolve routine 7747cdd61b2SBarry Smith 7757cdd61b2SBarry Smith Calling sequence of presolve: 7767cdd61b2SBarry Smith .vb 7776891c3e4SJed Brown PetscErrorCode presolve (PC,KSP ksp,Vec b,Vec x) 7787cdd61b2SBarry Smith .ve 7797cdd61b2SBarry Smith 7806891c3e4SJed Brown + pc - the preconditioner, get the application context with PCShellGetContext() 7817cdd61b2SBarry Smith . xin - input vector 7827cdd61b2SBarry Smith - xout - output vector 7837cdd61b2SBarry Smith 78495452b02SPatrick Sanan Notes: 78595452b02SPatrick Sanan the function MUST return an error code of 0 on success and nonzero on failure. 7864aa34b0aSBarry Smith 7877cdd61b2SBarry Smith Level: developer 7887cdd61b2SBarry Smith 789be29d3c6SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose(), PCShellSetPostSolve(), PCShellSetContext() 7907cdd61b2SBarry Smith @*/ 7917087cfbeSBarry Smith PetscErrorCode PCShellSetPreSolve(PC pc,PetscErrorCode (*presolve)(PC,KSP,Vec,Vec)) 7927cdd61b2SBarry Smith { 7934ac538c5SBarry Smith PetscErrorCode ierr; 7947cdd61b2SBarry Smith 7957cdd61b2SBarry Smith PetscFunctionBegin; 7960700a824SBarry Smith PetscValidHeaderSpecific(pc,PC_CLASSID,1); 7974ac538c5SBarry Smith ierr = PetscTryMethod(pc,"PCShellSetPreSolve_C",(PC,PetscErrorCode (*)(PC,KSP,Vec,Vec)),(pc,presolve));CHKERRQ(ierr); 7987cdd61b2SBarry Smith PetscFunctionReturn(0); 7997cdd61b2SBarry Smith } 8007cdd61b2SBarry Smith 8017cdd61b2SBarry Smith /*@C 8027cdd61b2SBarry Smith PCShellSetPostSolve - Sets routine to apply to the operators/vectors before a KSPSolve() is 8037cdd61b2SBarry Smith applied. This usually does something like scale the linear system in some application 8047cdd61b2SBarry Smith specific way. 8057cdd61b2SBarry Smith 8063f9fe445SBarry Smith Logically Collective on PC 8077cdd61b2SBarry Smith 8087cdd61b2SBarry Smith Input Parameters: 8097cdd61b2SBarry Smith + pc - the preconditioner context 8107cdd61b2SBarry Smith - postsolve - the application-provided presolve routine 8117cdd61b2SBarry Smith 8127cdd61b2SBarry Smith Calling sequence of postsolve: 8137cdd61b2SBarry Smith .vb 8146891c3e4SJed Brown PetscErrorCode postsolve(PC,KSP ksp,Vec b,Vec x) 8157cdd61b2SBarry Smith .ve 8167cdd61b2SBarry Smith 8176891c3e4SJed Brown + pc - the preconditioner, get the application context with PCShellGetContext() 8187cdd61b2SBarry Smith . xin - input vector 8197cdd61b2SBarry Smith - xout - output vector 8207cdd61b2SBarry Smith 82195452b02SPatrick Sanan Notes: 82295452b02SPatrick Sanan the function MUST return an error code of 0 on success and nonzero on failure. 8234aa34b0aSBarry Smith 8247cdd61b2SBarry Smith Level: developer 8257cdd61b2SBarry Smith 826be29d3c6SBarry Smith .seealso: PCShellSetApplyRichardson(), PCShellSetSetUp(), PCShellSetApplyTranspose(), PCShellSetPreSolve(), PCShellSetContext() 8277cdd61b2SBarry Smith @*/ 8287087cfbeSBarry Smith PetscErrorCode PCShellSetPostSolve(PC pc,PetscErrorCode (*postsolve)(PC,KSP,Vec,Vec)) 8297cdd61b2SBarry Smith { 8304ac538c5SBarry Smith PetscErrorCode ierr; 8317cdd61b2SBarry Smith 8327cdd61b2SBarry Smith PetscFunctionBegin; 8330700a824SBarry Smith PetscValidHeaderSpecific(pc,PC_CLASSID,1); 8344ac538c5SBarry Smith ierr = PetscTryMethod(pc,"PCShellSetPostSolve_C",(PC,PetscErrorCode (*)(PC,KSP,Vec,Vec)),(pc,postsolve));CHKERRQ(ierr); 8357cdd61b2SBarry Smith PetscFunctionReturn(0); 8367cdd61b2SBarry Smith } 8377cdd61b2SBarry Smith 8384b9ad928SBarry Smith /*@C 8394b9ad928SBarry Smith PCShellSetName - Sets an optional name to associate with a shell 8404b9ad928SBarry Smith preconditioner. 8414b9ad928SBarry Smith 8424b9ad928SBarry Smith Not Collective 8434b9ad928SBarry Smith 8444b9ad928SBarry Smith Input Parameters: 8454b9ad928SBarry Smith + pc - the preconditioner context 8464b9ad928SBarry Smith - name - character string describing shell preconditioner 8474b9ad928SBarry Smith 8484b9ad928SBarry Smith Level: developer 8494b9ad928SBarry Smith 8504b9ad928SBarry Smith .seealso: PCShellGetName() 8514b9ad928SBarry Smith @*/ 8527087cfbeSBarry Smith PetscErrorCode PCShellSetName(PC pc,const char name[]) 8534b9ad928SBarry Smith { 8544ac538c5SBarry Smith PetscErrorCode ierr; 8554b9ad928SBarry Smith 8564b9ad928SBarry Smith PetscFunctionBegin; 8570700a824SBarry Smith PetscValidHeaderSpecific(pc,PC_CLASSID,1); 8584ac538c5SBarry Smith ierr = PetscTryMethod(pc,"PCShellSetName_C",(PC,const char []),(pc,name));CHKERRQ(ierr); 8594b9ad928SBarry Smith PetscFunctionReturn(0); 8604b9ad928SBarry Smith } 8614b9ad928SBarry Smith 8624b9ad928SBarry Smith /*@C 8634b9ad928SBarry Smith PCShellGetName - Gets an optional name that the user has set for a shell 8644b9ad928SBarry Smith preconditioner. 8654b9ad928SBarry Smith 8664b9ad928SBarry Smith Not Collective 8674b9ad928SBarry Smith 8684b9ad928SBarry Smith Input Parameter: 8694b9ad928SBarry Smith . pc - the preconditioner context 8704b9ad928SBarry Smith 8714b9ad928SBarry Smith Output Parameter: 8724b9ad928SBarry Smith . name - character string describing shell preconditioner (you should not free this) 8734b9ad928SBarry Smith 8744b9ad928SBarry Smith Level: developer 8754b9ad928SBarry Smith 8764b9ad928SBarry Smith .seealso: PCShellSetName() 8774b9ad928SBarry Smith @*/ 878ccaf0856SBarry Smith PetscErrorCode PCShellGetName(PC pc,const char *name[]) 8794b9ad928SBarry Smith { 8804ac538c5SBarry Smith PetscErrorCode ierr; 8814b9ad928SBarry Smith 8824b9ad928SBarry Smith PetscFunctionBegin; 8830700a824SBarry Smith PetscValidHeaderSpecific(pc,PC_CLASSID,1); 8844482741eSBarry Smith PetscValidPointer(name,2); 885ccaf0856SBarry Smith ierr = PetscUseMethod(pc,"PCShellGetName_C",(PC,const char*[]),(pc,name));CHKERRQ(ierr); 8864b9ad928SBarry Smith PetscFunctionReturn(0); 8874b9ad928SBarry Smith } 8884b9ad928SBarry Smith 8894b9ad928SBarry Smith /*@C 8904b9ad928SBarry Smith PCShellSetApplyRichardson - Sets routine to use as preconditioner 8914b9ad928SBarry Smith in Richardson iteration. 8924b9ad928SBarry Smith 8933f9fe445SBarry Smith Logically Collective on PC 8944b9ad928SBarry Smith 8954b9ad928SBarry Smith Input Parameters: 8964b9ad928SBarry Smith + pc - the preconditioner context 897be29d3c6SBarry Smith - apply - the application-provided preconditioning routine 8984b9ad928SBarry Smith 8994b9ad928SBarry Smith Calling sequence of apply: 9004b9ad928SBarry Smith .vb 9016891c3e4SJed Brown PetscErrorCode apply (PC pc,Vec b,Vec x,Vec r,PetscReal rtol,PetscReal abstol,PetscReal dtol,PetscInt maxits) 9024b9ad928SBarry Smith .ve 9034b9ad928SBarry Smith 9046891c3e4SJed Brown + pc - the preconditioner, get the application context with PCShellGetContext() 9054b9ad928SBarry Smith . b - right-hand-side 9064b9ad928SBarry Smith . x - current iterate 9074b9ad928SBarry Smith . r - work space 9084b9ad928SBarry Smith . rtol - relative tolerance of residual norm to stop at 90970441072SBarry Smith . abstol - absolute tolerance of residual norm to stop at 9104b9ad928SBarry Smith . dtol - if residual norm increases by this factor than return 9114b9ad928SBarry Smith - maxits - number of iterations to run 9124b9ad928SBarry Smith 91395452b02SPatrick Sanan Notes: 91495452b02SPatrick Sanan the function MUST return an error code of 0 on success and nonzero on failure. 9154aa34b0aSBarry Smith 9164b9ad928SBarry Smith Level: developer 9174b9ad928SBarry Smith 918be29d3c6SBarry Smith .seealso: PCShellSetApply(), PCShellSetContext() 9194b9ad928SBarry Smith @*/ 9207087cfbeSBarry Smith PetscErrorCode PCShellSetApplyRichardson(PC pc,PetscErrorCode (*apply)(PC,Vec,Vec,Vec,PetscReal,PetscReal,PetscReal,PetscInt,PetscBool,PetscInt*,PCRichardsonConvergedReason*)) 9214b9ad928SBarry Smith { 9224ac538c5SBarry Smith PetscErrorCode ierr; 9234b9ad928SBarry Smith 9244b9ad928SBarry Smith PetscFunctionBegin; 9250700a824SBarry Smith PetscValidHeaderSpecific(pc,PC_CLASSID,1); 9264ac538c5SBarry Smith ierr = PetscTryMethod(pc,"PCShellSetApplyRichardson_C",(PC,PetscErrorCode (*)(PC,Vec,Vec,Vec,PetscReal,PetscReal,PetscReal,PetscInt,PetscBool,PetscInt*,PCRichardsonConvergedReason*)),(pc,apply));CHKERRQ(ierr); 9274b9ad928SBarry Smith PetscFunctionReturn(0); 9284b9ad928SBarry Smith } 9294b9ad928SBarry Smith 9304b9ad928SBarry Smith /*MC 9314b9ad928SBarry Smith PCSHELL - Creates a new preconditioner class for use with your 9324b9ad928SBarry Smith own private data storage format. 9334b9ad928SBarry Smith 9344b9ad928SBarry Smith Level: advanced 935e0bb08deSStefano Zampini 9364b9ad928SBarry Smith Usage: 9376891c3e4SJed Brown $ extern PetscErrorCode apply(PC,Vec,Vec); 9386891c3e4SJed Brown $ extern PetscErrorCode applyba(PC,PCSide,Vec,Vec,Vec); 9396891c3e4SJed Brown $ extern PetscErrorCode applytranspose(PC,Vec,Vec); 9406891c3e4SJed Brown $ extern PetscErrorCode setup(PC); 9416891c3e4SJed Brown $ extern PetscErrorCode destroy(PC); 9426891c3e4SJed Brown $ 9434b9ad928SBarry Smith $ PCCreate(comm,&pc); 9444b9ad928SBarry Smith $ PCSetType(pc,PCSHELL); 945be29d3c6SBarry Smith $ PCShellSetContext(pc,ctx) 9466891c3e4SJed Brown $ PCShellSetApply(pc,apply); 9476891c3e4SJed Brown $ PCShellSetApplyBA(pc,applyba); (optional) 9486891c3e4SJed Brown $ PCShellSetApplyTranspose(pc,applytranspose); (optional) 9494b9ad928SBarry Smith $ PCShellSetSetUp(pc,setup); (optional) 950d01c8aa3SLisandro Dalcin $ PCShellSetDestroy(pc,destroy); (optional) 9514b9ad928SBarry Smith 9524b9ad928SBarry Smith .seealso: PCCreate(), PCSetType(), PCType (for list of available types), PC, 953fd2d0fe1Svictor MATSHELL, PCShellSetSetUp(), PCShellSetApply(), PCShellSetView(), 954fd2d0fe1Svictor PCShellSetApplyTranspose(), PCShellSetName(), PCShellSetApplyRichardson(), 9552bb17772SBarry Smith PCShellGetName(), PCShellSetContext(), PCShellGetContext(), PCShellSetApplyBA() 9564b9ad928SBarry Smith M*/ 9574b9ad928SBarry Smith 9588cc058d9SJed Brown PETSC_EXTERN PetscErrorCode PCCreate_Shell(PC pc) 9594b9ad928SBarry Smith { 960dfbe8321SBarry Smith PetscErrorCode ierr; 9614b9ad928SBarry Smith PC_Shell *shell; 9624b9ad928SBarry Smith 9634b9ad928SBarry Smith PetscFunctionBegin; 964b00a9115SJed Brown ierr = PetscNewLog(pc,&shell);CHKERRQ(ierr); 9654b9ad928SBarry Smith pc->data = (void*)shell; 9664b9ad928SBarry Smith 967d01c8aa3SLisandro Dalcin pc->ops->destroy = PCDestroy_Shell; 9684b9ad928SBarry Smith pc->ops->view = PCView_Shell; 969d01c8aa3SLisandro Dalcin pc->ops->apply = PCApply_Shell; 970*7b6e2003SPierre Jolivet pc->ops->matapply = PCMatApply_Shell; 9711b581b66SBarry Smith pc->ops->applysymmetricleft = PCApplySymmetricLeft_Shell; 9721b581b66SBarry Smith pc->ops->applysymmetricright = PCApplySymmetricRight_Shell; 9730a545947SLisandro Dalcin pc->ops->applytranspose = NULL; 9740a545947SLisandro Dalcin pc->ops->applyrichardson = NULL; 9750a545947SLisandro Dalcin pc->ops->setup = NULL; 9760a545947SLisandro Dalcin pc->ops->presolve = NULL; 9770a545947SLisandro Dalcin pc->ops->postsolve = NULL; 9784b9ad928SBarry Smith 9790a545947SLisandro Dalcin shell->apply = NULL; 9800a545947SLisandro Dalcin shell->applytranspose = NULL; 9810a545947SLisandro Dalcin shell->name = NULL; 9820a545947SLisandro Dalcin shell->applyrich = NULL; 9830a545947SLisandro Dalcin shell->presolve = NULL; 9840a545947SLisandro Dalcin shell->postsolve = NULL; 9850a545947SLisandro Dalcin shell->ctx = NULL; 9860a545947SLisandro Dalcin shell->setup = NULL; 9870a545947SLisandro Dalcin shell->view = NULL; 9880a545947SLisandro Dalcin shell->destroy = NULL; 9890a545947SLisandro Dalcin shell->applysymmetricleft = NULL; 9900a545947SLisandro Dalcin shell->applysymmetricright = NULL; 9914b9ad928SBarry Smith 992bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)pc,"PCShellSetDestroy_C",PCShellSetDestroy_Shell);CHKERRQ(ierr); 993bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)pc,"PCShellSetSetUp_C",PCShellSetSetUp_Shell);CHKERRQ(ierr); 994bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)pc,"PCShellSetApply_C",PCShellSetApply_Shell);CHKERRQ(ierr); 995*7b6e2003SPierre Jolivet ierr = PetscObjectComposeFunction((PetscObject)pc,"PCShellSetMatApply_C",PCShellSetMatApply_Shell);CHKERRQ(ierr); 9961b581b66SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)pc,"PCShellSetApplySymmetricLeft_C",PCShellSetApplySymmetricLeft_Shell);CHKERRQ(ierr); 9971b581b66SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)pc,"PCShellSetApplySymmetricRight_C",PCShellSetApplySymmetricRight_Shell);CHKERRQ(ierr); 998bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)pc,"PCShellSetApplyBA_C",PCShellSetApplyBA_Shell);CHKERRQ(ierr); 999bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)pc,"PCShellSetPreSolve_C",PCShellSetPreSolve_Shell);CHKERRQ(ierr); 1000bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)pc,"PCShellSetPostSolve_C",PCShellSetPostSolve_Shell);CHKERRQ(ierr); 1001bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)pc,"PCShellSetView_C",PCShellSetView_Shell);CHKERRQ(ierr); 1002bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)pc,"PCShellSetApplyTranspose_C",PCShellSetApplyTranspose_Shell);CHKERRQ(ierr); 1003bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)pc,"PCShellSetName_C",PCShellSetName_Shell);CHKERRQ(ierr); 1004bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)pc,"PCShellGetName_C",PCShellGetName_Shell);CHKERRQ(ierr); 1005bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)pc,"PCShellSetApplyRichardson_C",PCShellSetApplyRichardson_Shell);CHKERRQ(ierr); 10064b9ad928SBarry Smith PetscFunctionReturn(0); 10074b9ad928SBarry Smith } 1008