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); 157b6e2003SPierre 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 29f1580f4eSBarry Smith PCShellGetContext - Returns the user-provided context associated with a shell `PC` 30be29d3c6SBarry Smith 31be29d3c6SBarry Smith Not Collective 32be29d3c6SBarry Smith 33be29d3c6SBarry Smith Input Parameter: 34f1580f4eSBarry Smith . pc - of type `PCSHELL` 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 41f1580f4eSBarry Smith Note: 42be29d3c6SBarry Smith This routine is intended for use within various shell routines 43be29d3c6SBarry Smith 44f1580f4eSBarry Smith Fortran Note: 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 48f1580f4eSBarry Smith .seealso: `PCSHELL`, `PCShellSetContext()` 49be29d3c6SBarry Smith @*/ 50d71ae5a4SJacob Faibussowitsch PetscErrorCode PCShellGetContext(PC pc, void *ctx) 51d71ae5a4SJacob Faibussowitsch { 52ace3abfcSBarry Smith PetscBool flg; 53be29d3c6SBarry Smith 54be29d3c6SBarry Smith PetscFunctionBegin; 550700a824SBarry Smith PetscValidHeaderSpecific(pc, PC_CLASSID, 1); 56be29d3c6SBarry Smith PetscValidPointer(ctx, 2); 579566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)pc, PCSHELL, &flg)); 583ec1f749SStefano Zampini if (!flg) *(void **)ctx = NULL; 593ec1f749SStefano Zampini else *(void **)ctx = ((PC_Shell *)(pc->data))->ctx; 60*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 61be29d3c6SBarry Smith } 62be29d3c6SBarry Smith 639dd1005fSJed Brown /*@ 64f1580f4eSBarry Smith PCShellSetContext - sets the context for a shell `PC` 65be29d3c6SBarry Smith 66c3339decSBarry Smith Logically Collective 67be29d3c6SBarry Smith 68be29d3c6SBarry Smith Input Parameters: 69f1580f4eSBarry Smith + pc - the `PC` of type `PCSHELL` 70be29d3c6SBarry Smith - ctx - the context 71be29d3c6SBarry Smith 72be29d3c6SBarry Smith Level: advanced 73be29d3c6SBarry Smith 74f1580f4eSBarry Smith Fortran Note: 7595452b02SPatrick Sanan To use this from Fortran you must write a Fortran interface definition for this 76daf670e6SBarry Smith function that tells Fortran the Fortran derived data type that you are passing in as the ctx argument. 77daf670e6SBarry Smith 78db781477SPatrick Sanan .seealso: `PCShellGetContext()`, `PCSHELL` 79be29d3c6SBarry Smith @*/ 80d71ae5a4SJacob Faibussowitsch PetscErrorCode PCShellSetContext(PC pc, void *ctx) 81d71ae5a4SJacob Faibussowitsch { 82c5ae4b9aSBarry Smith PC_Shell *shell = (PC_Shell *)pc->data; 83ace3abfcSBarry Smith PetscBool flg; 84be29d3c6SBarry Smith 85be29d3c6SBarry Smith PetscFunctionBegin; 860700a824SBarry Smith PetscValidHeaderSpecific(pc, PC_CLASSID, 1); 879566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)pc, PCSHELL, &flg)); 882fa5cd67SKarl Rupp if (flg) shell->ctx = ctx; 89*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 90be29d3c6SBarry Smith } 91be29d3c6SBarry Smith 92d71ae5a4SJacob Faibussowitsch static PetscErrorCode PCSetUp_Shell(PC pc) 93d71ae5a4SJacob Faibussowitsch { 94c5ae4b9aSBarry Smith PC_Shell *shell = (PC_Shell *)pc->data; 954b9ad928SBarry Smith 964b9ad928SBarry Smith PetscFunctionBegin; 9728b400f6SJacob Faibussowitsch PetscCheck(shell->setup, PetscObjectComm((PetscObject)pc), PETSC_ERR_USER, "No setup() routine provided to Shell PC"); 9825e27a38SBarry Smith PetscCallBack("PCSHELL callback setup", (*shell->setup)(pc)); 99*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1004b9ad928SBarry Smith } 1014b9ad928SBarry Smith 102d71ae5a4SJacob Faibussowitsch static PetscErrorCode PCApply_Shell(PC pc, Vec x, Vec y) 103d71ae5a4SJacob Faibussowitsch { 104c5ae4b9aSBarry Smith PC_Shell *shell = (PC_Shell *)pc->data; 105e3f487b0SBarry Smith PetscObjectState instate, outstate; 1064b9ad928SBarry Smith 1074b9ad928SBarry Smith PetscFunctionBegin; 10828b400f6SJacob Faibussowitsch PetscCheck(shell->apply, PetscObjectComm((PetscObject)pc), PETSC_ERR_USER, "No apply() routine provided to Shell PC"); 1099566063dSJacob Faibussowitsch PetscCall(PetscObjectStateGet((PetscObject)y, &instate)); 11025e27a38SBarry Smith PetscCallBack("PCSHELL callback apply", (*shell->apply)(pc, x, y)); 1119566063dSJacob Faibussowitsch PetscCall(PetscObjectStateGet((PetscObject)y, &outstate)); 1121e66621cSBarry Smith /* increase the state of the output vector if the user did not update its state themself as should have been done */ 1131e66621cSBarry Smith if (instate == outstate) PetscCall(PetscObjectStateIncrease((PetscObject)y)); 114*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1154b9ad928SBarry Smith } 1164b9ad928SBarry Smith 117d71ae5a4SJacob Faibussowitsch static PetscErrorCode PCMatApply_Shell(PC pc, Mat X, Mat Y) 118d71ae5a4SJacob Faibussowitsch { 1197b6e2003SPierre Jolivet PC_Shell *shell = (PC_Shell *)pc->data; 1207b6e2003SPierre Jolivet PetscObjectState instate, outstate; 1217b6e2003SPierre Jolivet 1227b6e2003SPierre Jolivet PetscFunctionBegin; 12328b400f6SJacob Faibussowitsch PetscCheck(shell->matapply, PetscObjectComm((PetscObject)pc), PETSC_ERR_USER, "No apply() routine provided to Shell PC"); 1249566063dSJacob Faibussowitsch PetscCall(PetscObjectStateGet((PetscObject)Y, &instate)); 12525e27a38SBarry Smith PetscCallBack("PCSHELL callback apply", (*shell->matapply)(pc, X, Y)); 1269566063dSJacob Faibussowitsch PetscCall(PetscObjectStateGet((PetscObject)Y, &outstate)); 1271e66621cSBarry Smith /* increase the state of the output vector if the user did not update its state themself as should have been done */ 1281e66621cSBarry Smith if (instate == outstate) PetscCall(PetscObjectStateIncrease((PetscObject)Y)); 129*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1307b6e2003SPierre Jolivet } 1317b6e2003SPierre Jolivet 132d71ae5a4SJacob Faibussowitsch static PetscErrorCode PCApplySymmetricLeft_Shell(PC pc, Vec x, Vec y) 133d71ae5a4SJacob Faibussowitsch { 1341b581b66SBarry Smith PC_Shell *shell = (PC_Shell *)pc->data; 1351b581b66SBarry Smith 1361b581b66SBarry Smith PetscFunctionBegin; 13728b400f6SJacob Faibussowitsch PetscCheck(shell->applysymmetricleft, PetscObjectComm((PetscObject)pc), PETSC_ERR_USER, "No apply() routine provided to Shell PC"); 13825e27a38SBarry Smith PetscCallBack("PCSHELL callback apply symmetric left", (*shell->applysymmetricleft)(pc, x, y)); 139*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1401b581b66SBarry Smith } 1411b581b66SBarry Smith 142d71ae5a4SJacob Faibussowitsch static PetscErrorCode PCApplySymmetricRight_Shell(PC pc, Vec x, Vec y) 143d71ae5a4SJacob Faibussowitsch { 1441b581b66SBarry Smith PC_Shell *shell = (PC_Shell *)pc->data; 1451b581b66SBarry Smith 1461b581b66SBarry Smith PetscFunctionBegin; 14728b400f6SJacob Faibussowitsch PetscCheck(shell->applysymmetricright, PetscObjectComm((PetscObject)pc), PETSC_ERR_USER, "No apply() routine provided to Shell PC"); 14825e27a38SBarry Smith PetscCallBack("PCSHELL callback apply symmetric right", (*shell->applysymmetricright)(pc, x, y)); 149*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1501b581b66SBarry Smith } 1511b581b66SBarry Smith 152d71ae5a4SJacob Faibussowitsch static PetscErrorCode PCApplyBA_Shell(PC pc, PCSide side, Vec x, Vec y, Vec w) 153d71ae5a4SJacob Faibussowitsch { 154c5ae4b9aSBarry Smith PC_Shell *shell = (PC_Shell *)pc->data; 155e3f487b0SBarry Smith PetscObjectState instate, outstate; 1562bb17772SBarry Smith 1572bb17772SBarry Smith PetscFunctionBegin; 15828b400f6SJacob Faibussowitsch PetscCheck(shell->applyBA, PetscObjectComm((PetscObject)pc), PETSC_ERR_USER, "No applyBA() routine provided to Shell PC"); 1599566063dSJacob Faibussowitsch PetscCall(PetscObjectStateGet((PetscObject)w, &instate)); 16025e27a38SBarry Smith PetscCallBack("PCSHELL callback applyBA", (*shell->applyBA)(pc, side, x, y, w)); 1619566063dSJacob Faibussowitsch PetscCall(PetscObjectStateGet((PetscObject)w, &outstate)); 1621e66621cSBarry Smith /* increase the state of the output vector if the user did not update its state themself as should have been done */ 1631e66621cSBarry Smith if (instate == outstate) PetscCall(PetscObjectStateIncrease((PetscObject)w)); 164*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1652bb17772SBarry Smith } 1662bb17772SBarry Smith 167d71ae5a4SJacob Faibussowitsch static PetscErrorCode PCPreSolveChangeRHS_Shell(PC pc, PetscBool *change) 168d71ae5a4SJacob Faibussowitsch { 169a06fd7f2SStefano Zampini PetscFunctionBegin; 170a06fd7f2SStefano Zampini *change = PETSC_TRUE; 171*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 172a06fd7f2SStefano Zampini } 173a06fd7f2SStefano Zampini 174d71ae5a4SJacob Faibussowitsch static PetscErrorCode PCPreSolve_Shell(PC pc, KSP ksp, Vec b, Vec x) 175d71ae5a4SJacob Faibussowitsch { 176c5ae4b9aSBarry Smith PC_Shell *shell = (PC_Shell *)pc->data; 1777cdd61b2SBarry Smith 1787cdd61b2SBarry Smith PetscFunctionBegin; 17928b400f6SJacob Faibussowitsch PetscCheck(shell->presolve, PetscObjectComm((PetscObject)pc), PETSC_ERR_USER, "No presolve() routine provided to Shell PC"); 18025e27a38SBarry Smith PetscCallBack("PCSHELL callback presolve", (*shell->presolve)(pc, ksp, b, x)); 181*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1827cdd61b2SBarry Smith } 1837cdd61b2SBarry Smith 184d71ae5a4SJacob Faibussowitsch static PetscErrorCode PCPostSolve_Shell(PC pc, KSP ksp, Vec b, Vec x) 185d71ae5a4SJacob Faibussowitsch { 186c5ae4b9aSBarry Smith PC_Shell *shell = (PC_Shell *)pc->data; 1877cdd61b2SBarry Smith 1887cdd61b2SBarry Smith PetscFunctionBegin; 18928b400f6SJacob Faibussowitsch PetscCheck(shell->postsolve, PetscObjectComm((PetscObject)pc), PETSC_ERR_USER, "No postsolve() routine provided to Shell PC"); 19025e27a38SBarry Smith PetscCallBack("PCSHELL callback postsolve()", (*shell->postsolve)(pc, ksp, b, x)); 191*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1927cdd61b2SBarry Smith } 1937cdd61b2SBarry Smith 194d71ae5a4SJacob Faibussowitsch static PetscErrorCode PCApplyTranspose_Shell(PC pc, Vec x, Vec y) 195d71ae5a4SJacob Faibussowitsch { 196c5ae4b9aSBarry Smith PC_Shell *shell = (PC_Shell *)pc->data; 197e3f487b0SBarry Smith PetscObjectState instate, outstate; 1984b9ad928SBarry Smith 1994b9ad928SBarry Smith PetscFunctionBegin; 20028b400f6SJacob Faibussowitsch PetscCheck(shell->applytranspose, PetscObjectComm((PetscObject)pc), PETSC_ERR_USER, "No applytranspose() routine provided to Shell PC"); 2019566063dSJacob Faibussowitsch PetscCall(PetscObjectStateGet((PetscObject)y, &instate)); 20225e27a38SBarry Smith PetscCallBack("PCSHELL callback applytranspose", (*shell->applytranspose)(pc, x, y)); 2039566063dSJacob Faibussowitsch PetscCall(PetscObjectStateGet((PetscObject)y, &outstate)); 2041e66621cSBarry Smith /* increase the state of the output vector if the user did not update its state themself as should have been done */ 2051e66621cSBarry Smith if (instate == outstate) PetscCall(PetscObjectStateIncrease((PetscObject)y)); 206*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 2074b9ad928SBarry Smith } 2084b9ad928SBarry Smith 209d71ae5a4SJacob Faibussowitsch 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) 210d71ae5a4SJacob Faibussowitsch { 211c5ae4b9aSBarry Smith PC_Shell *shell = (PC_Shell *)pc->data; 212e3f487b0SBarry Smith PetscObjectState instate, outstate; 2134b9ad928SBarry Smith 2144b9ad928SBarry Smith PetscFunctionBegin; 21528b400f6SJacob Faibussowitsch PetscCheck(shell->applyrich, PetscObjectComm((PetscObject)pc), PETSC_ERR_USER, "No applyrichardson() routine provided to Shell PC"); 2169566063dSJacob Faibussowitsch PetscCall(PetscObjectStateGet((PetscObject)y, &instate)); 21725e27a38SBarry Smith PetscCallBack("PCSHELL callback applyrichardson", (*shell->applyrich)(pc, x, y, w, rtol, abstol, dtol, it, guesszero, outits, reason)); 2189566063dSJacob Faibussowitsch PetscCall(PetscObjectStateGet((PetscObject)y, &outstate)); 219e3f487b0SBarry Smith /* increase the state of the output vector since the user did not update its state themself as should have been done */ 2201e66621cSBarry Smith if (instate == outstate) PetscCall(PetscObjectStateIncrease((PetscObject)y)); 221*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 2224b9ad928SBarry Smith } 2234b9ad928SBarry Smith 224d71ae5a4SJacob Faibussowitsch static PetscErrorCode PCDestroy_Shell(PC pc) 225d71ae5a4SJacob Faibussowitsch { 2264b9ad928SBarry Smith PC_Shell *shell = (PC_Shell *)pc->data; 2274b9ad928SBarry Smith 2284b9ad928SBarry Smith PetscFunctionBegin; 2299566063dSJacob Faibussowitsch PetscCall(PetscFree(shell->name)); 23025e27a38SBarry Smith if (shell->destroy) PetscCallBack("PCSHELL callback destroy", (*shell->destroy)(pc)); 2319566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)pc, "PCShellSetDestroy_C", NULL)); 2329566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)pc, "PCShellSetSetUp_C", NULL)); 2339566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)pc, "PCShellSetApply_C", NULL)); 2349566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)pc, "PCShellSetMatApply_C", NULL)); 2359566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)pc, "PCShellSetApplySymmetricLeft_C", NULL)); 2369566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)pc, "PCShellSetApplySymmetricRight_C", NULL)); 2379566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)pc, "PCShellSetApplyBA_C", NULL)); 2389566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)pc, "PCShellSetPreSolve_C", NULL)); 2399566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)pc, "PCShellSetPostSolve_C", NULL)); 2409566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)pc, "PCShellSetView_C", NULL)); 2419566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)pc, "PCShellSetApplyTranspose_C", NULL)); 2429566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)pc, "PCShellSetName_C", NULL)); 2439566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)pc, "PCShellGetName_C", NULL)); 2449566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)pc, "PCShellSetApplyRichardson_C", NULL)); 2459566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)pc, "PCPreSolveChangeRHS_C", NULL)); 2469566063dSJacob Faibussowitsch PetscCall(PetscFree(pc->data)); 247*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 2484b9ad928SBarry Smith } 2494b9ad928SBarry Smith 250d71ae5a4SJacob Faibussowitsch static PetscErrorCode PCView_Shell(PC pc, PetscViewer viewer) 251d71ae5a4SJacob Faibussowitsch { 2524b9ad928SBarry Smith PC_Shell *shell = (PC_Shell *)pc->data; 253ace3abfcSBarry Smith PetscBool iascii; 2544b9ad928SBarry Smith 2554b9ad928SBarry Smith PetscFunctionBegin; 2569566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &iascii)); 25732077d6dSBarry Smith if (iascii) { 2581e66621cSBarry Smith if (shell->name) PetscCall(PetscViewerASCIIPrintf(viewer, " %s\n", shell->name)); 2591e66621cSBarry Smith else PetscCall(PetscViewerASCIIPrintf(viewer, " no name\n")); 2604b9ad928SBarry Smith } 2614b9ad928SBarry Smith if (shell->view) { 2629566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPushTab(viewer)); 2639566063dSJacob Faibussowitsch PetscCall((*shell->view)(pc, viewer)); 2649566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopTab(viewer)); 2654b9ad928SBarry Smith } 266*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 2674b9ad928SBarry Smith } 2684b9ad928SBarry Smith 269d71ae5a4SJacob Faibussowitsch static PetscErrorCode PCShellSetDestroy_Shell(PC pc, PetscErrorCode (*destroy)(PC)) 270d71ae5a4SJacob Faibussowitsch { 271c5ae4b9aSBarry Smith PC_Shell *shell = (PC_Shell *)pc->data; 27218be62a5SSatish Balay 27318be62a5SSatish Balay PetscFunctionBegin; 27418be62a5SSatish Balay shell->destroy = destroy; 275*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 27618be62a5SSatish Balay } 27718be62a5SSatish Balay 278d71ae5a4SJacob Faibussowitsch static PetscErrorCode PCShellSetSetUp_Shell(PC pc, PetscErrorCode (*setup)(PC)) 279d71ae5a4SJacob Faibussowitsch { 280feb237baSPierre Jolivet PC_Shell *shell = (PC_Shell *)pc->data; 2814b9ad928SBarry Smith 2824b9ad928SBarry Smith PetscFunctionBegin; 2834b9ad928SBarry Smith shell->setup = setup; 284d01c8aa3SLisandro Dalcin if (setup) pc->ops->setup = PCSetUp_Shell; 2850a545947SLisandro Dalcin else pc->ops->setup = NULL; 286*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 2874b9ad928SBarry Smith } 2884b9ad928SBarry Smith 289d71ae5a4SJacob Faibussowitsch static PetscErrorCode PCShellSetApply_Shell(PC pc, PetscErrorCode (*apply)(PC, Vec, Vec)) 290d71ae5a4SJacob Faibussowitsch { 291c5ae4b9aSBarry Smith PC_Shell *shell = (PC_Shell *)pc->data; 2924b9ad928SBarry Smith 2934b9ad928SBarry Smith PetscFunctionBegin; 2944b9ad928SBarry Smith shell->apply = apply; 295*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 2964b9ad928SBarry Smith } 2974b9ad928SBarry Smith 298d71ae5a4SJacob Faibussowitsch static PetscErrorCode PCShellSetMatApply_Shell(PC pc, PetscErrorCode (*matapply)(PC, Mat, Mat)) 299d71ae5a4SJacob Faibussowitsch { 3007b6e2003SPierre Jolivet PC_Shell *shell = (PC_Shell *)pc->data; 3017b6e2003SPierre Jolivet 3027b6e2003SPierre Jolivet PetscFunctionBegin; 3037b6e2003SPierre Jolivet shell->matapply = matapply; 3040e0fe96bSStefano Zampini if (matapply) pc->ops->matapply = PCMatApply_Shell; 3050e0fe96bSStefano Zampini else pc->ops->matapply = NULL; 306*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 3077b6e2003SPierre Jolivet } 3087b6e2003SPierre Jolivet 309d71ae5a4SJacob Faibussowitsch static PetscErrorCode PCShellSetApplySymmetricLeft_Shell(PC pc, PetscErrorCode (*apply)(PC, Vec, Vec)) 310d71ae5a4SJacob Faibussowitsch { 3111b581b66SBarry Smith PC_Shell *shell = (PC_Shell *)pc->data; 3121b581b66SBarry Smith 3131b581b66SBarry Smith PetscFunctionBegin; 3141b581b66SBarry Smith shell->applysymmetricleft = apply; 315*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 3161b581b66SBarry Smith } 3171b581b66SBarry Smith 318d71ae5a4SJacob Faibussowitsch static PetscErrorCode PCShellSetApplySymmetricRight_Shell(PC pc, PetscErrorCode (*apply)(PC, Vec, Vec)) 319d71ae5a4SJacob Faibussowitsch { 3201b581b66SBarry Smith PC_Shell *shell = (PC_Shell *)pc->data; 3211b581b66SBarry Smith 3221b581b66SBarry Smith PetscFunctionBegin; 3231b581b66SBarry Smith shell->applysymmetricright = apply; 324*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 3251b581b66SBarry Smith } 3261b581b66SBarry Smith 327d71ae5a4SJacob Faibussowitsch static PetscErrorCode PCShellSetApplyBA_Shell(PC pc, PetscErrorCode (*applyBA)(PC, PCSide, Vec, Vec, Vec)) 328d71ae5a4SJacob Faibussowitsch { 329c5ae4b9aSBarry Smith PC_Shell *shell = (PC_Shell *)pc->data; 3302bb17772SBarry Smith 3312bb17772SBarry Smith PetscFunctionBegin; 332d01c8aa3SLisandro Dalcin shell->applyBA = applyBA; 333d01c8aa3SLisandro Dalcin if (applyBA) pc->ops->applyBA = PCApplyBA_Shell; 3340a545947SLisandro Dalcin else pc->ops->applyBA = NULL; 335*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 3362bb17772SBarry Smith } 3372bb17772SBarry Smith 338d71ae5a4SJacob Faibussowitsch static PetscErrorCode PCShellSetPreSolve_Shell(PC pc, PetscErrorCode (*presolve)(PC, KSP, Vec, Vec)) 339d71ae5a4SJacob Faibussowitsch { 340c5ae4b9aSBarry Smith PC_Shell *shell = (PC_Shell *)pc->data; 3417cdd61b2SBarry Smith 3427cdd61b2SBarry Smith PetscFunctionBegin; 3437cdd61b2SBarry Smith shell->presolve = presolve; 344a06fd7f2SStefano Zampini if (presolve) { 345a06fd7f2SStefano Zampini pc->ops->presolve = PCPreSolve_Shell; 3469566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)pc, "PCPreSolveChangeRHS_C", PCPreSolveChangeRHS_Shell)); 347a06fd7f2SStefano Zampini } else { 3480a545947SLisandro Dalcin pc->ops->presolve = NULL; 3499566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)pc, "PCPreSolveChangeRHS_C", NULL)); 350a06fd7f2SStefano Zampini } 351*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 3527cdd61b2SBarry Smith } 3537cdd61b2SBarry Smith 354d71ae5a4SJacob Faibussowitsch static PetscErrorCode PCShellSetPostSolve_Shell(PC pc, PetscErrorCode (*postsolve)(PC, KSP, Vec, Vec)) 355d71ae5a4SJacob Faibussowitsch { 356c5ae4b9aSBarry Smith PC_Shell *shell = (PC_Shell *)pc->data; 3577cdd61b2SBarry Smith 3587cdd61b2SBarry Smith PetscFunctionBegin; 3597cdd61b2SBarry Smith shell->postsolve = postsolve; 360d01c8aa3SLisandro Dalcin if (postsolve) pc->ops->postsolve = PCPostSolve_Shell; 3610a545947SLisandro Dalcin else pc->ops->postsolve = NULL; 362*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 3637cdd61b2SBarry Smith } 3647cdd61b2SBarry Smith 365d71ae5a4SJacob Faibussowitsch static PetscErrorCode PCShellSetView_Shell(PC pc, PetscErrorCode (*view)(PC, PetscViewer)) 366d71ae5a4SJacob Faibussowitsch { 367c5ae4b9aSBarry Smith PC_Shell *shell = (PC_Shell *)pc->data; 3684b9ad928SBarry Smith 3694b9ad928SBarry Smith PetscFunctionBegin; 3704b9ad928SBarry Smith shell->view = view; 371*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 3724b9ad928SBarry Smith } 3734b9ad928SBarry Smith 374d71ae5a4SJacob Faibussowitsch static PetscErrorCode PCShellSetApplyTranspose_Shell(PC pc, PetscErrorCode (*applytranspose)(PC, Vec, Vec)) 375d71ae5a4SJacob Faibussowitsch { 376c5ae4b9aSBarry Smith PC_Shell *shell = (PC_Shell *)pc->data; 3774b9ad928SBarry Smith 3784b9ad928SBarry Smith PetscFunctionBegin; 3794b9ad928SBarry Smith shell->applytranspose = applytranspose; 380d01c8aa3SLisandro Dalcin if (applytranspose) pc->ops->applytranspose = PCApplyTranspose_Shell; 3810a545947SLisandro Dalcin else pc->ops->applytranspose = NULL; 382*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 383d01c8aa3SLisandro Dalcin } 384d01c8aa3SLisandro Dalcin 385d71ae5a4SJacob Faibussowitsch static PetscErrorCode PCShellSetApplyRichardson_Shell(PC pc, PetscErrorCode (*applyrich)(PC, Vec, Vec, Vec, PetscReal, PetscReal, PetscReal, PetscInt, PetscBool, PetscInt *, PCRichardsonConvergedReason *)) 386d71ae5a4SJacob Faibussowitsch { 387c5ae4b9aSBarry Smith PC_Shell *shell = (PC_Shell *)pc->data; 388d01c8aa3SLisandro Dalcin 389d01c8aa3SLisandro Dalcin PetscFunctionBegin; 390d01c8aa3SLisandro Dalcin shell->applyrich = applyrich; 391d01c8aa3SLisandro Dalcin if (applyrich) pc->ops->applyrichardson = PCApplyRichardson_Shell; 3920a545947SLisandro Dalcin else pc->ops->applyrichardson = NULL; 393*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 3944b9ad928SBarry Smith } 3954b9ad928SBarry Smith 396d71ae5a4SJacob Faibussowitsch static PetscErrorCode PCShellSetName_Shell(PC pc, const char name[]) 397d71ae5a4SJacob Faibussowitsch { 398c5ae4b9aSBarry Smith PC_Shell *shell = (PC_Shell *)pc->data; 3994b9ad928SBarry Smith 4004b9ad928SBarry Smith PetscFunctionBegin; 4019566063dSJacob Faibussowitsch PetscCall(PetscFree(shell->name)); 4029566063dSJacob Faibussowitsch PetscCall(PetscStrallocpy(name, &shell->name)); 403*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 4044b9ad928SBarry Smith } 4054b9ad928SBarry Smith 406d71ae5a4SJacob Faibussowitsch static PetscErrorCode PCShellGetName_Shell(PC pc, const char *name[]) 407d71ae5a4SJacob Faibussowitsch { 408c5ae4b9aSBarry Smith PC_Shell *shell = (PC_Shell *)pc->data; 4094b9ad928SBarry Smith 4104b9ad928SBarry Smith PetscFunctionBegin; 4114b9ad928SBarry Smith *name = shell->name; 412*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 4134b9ad928SBarry Smith } 4144b9ad928SBarry Smith 41518be62a5SSatish Balay /*@C 41618be62a5SSatish Balay PCShellSetDestroy - Sets routine to use to destroy the user-provided 41718be62a5SSatish Balay application context. 41818be62a5SSatish Balay 419c3339decSBarry Smith Logically Collective 42018be62a5SSatish Balay 42118be62a5SSatish Balay Input Parameters: 42218be62a5SSatish Balay + pc - the preconditioner context 423a2b725a8SWilliam Gropp - destroy - the application-provided destroy routine 42418be62a5SSatish Balay 42518be62a5SSatish Balay Calling sequence of destroy: 42618be62a5SSatish Balay .vb 4276891c3e4SJed Brown PetscErrorCode destroy (PC) 42818be62a5SSatish Balay .ve 42918be62a5SSatish Balay 43018be62a5SSatish Balay . ptr - the application context 43118be62a5SSatish Balay 432f1580f4eSBarry Smith Note: 43395452b02SPatrick Sanan the function MUST return an error code of 0 on success and nonzero on failure. 4344aa34b0aSBarry Smith 435f1580f4eSBarry Smith Level: intermediate 43618be62a5SSatish Balay 437f1580f4eSBarry Smith .seealso: `PCSHELL`, `PCShellSetApply()`, `PCShellSetContext()` 43818be62a5SSatish Balay @*/ 439d71ae5a4SJacob Faibussowitsch PetscErrorCode PCShellSetDestroy(PC pc, PetscErrorCode (*destroy)(PC)) 440d71ae5a4SJacob Faibussowitsch { 44118be62a5SSatish Balay PetscFunctionBegin; 4420700a824SBarry Smith PetscValidHeaderSpecific(pc, PC_CLASSID, 1); 443cac4c232SBarry Smith PetscTryMethod(pc, "PCShellSetDestroy_C", (PC, PetscErrorCode(*)(PC)), (pc, destroy)); 444*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 44518be62a5SSatish Balay } 44618be62a5SSatish Balay 4474b9ad928SBarry Smith /*@C 4484b9ad928SBarry Smith PCShellSetSetUp - Sets routine to use to "setup" the preconditioner whenever the 4494b9ad928SBarry Smith matrix operator is changed. 4504b9ad928SBarry Smith 451c3339decSBarry Smith Logically Collective 4524b9ad928SBarry Smith 4534b9ad928SBarry Smith Input Parameters: 4544b9ad928SBarry Smith + pc - the preconditioner context 455a2b725a8SWilliam Gropp - setup - the application-provided setup routine 4564b9ad928SBarry Smith 4574b9ad928SBarry Smith Calling sequence of setup: 4584b9ad928SBarry Smith .vb 4596891c3e4SJed Brown PetscErrorCode setup (PC pc) 4604b9ad928SBarry Smith .ve 4614b9ad928SBarry Smith 4626891c3e4SJed Brown . pc - the preconditioner, get the application context with PCShellGetContext() 4634b9ad928SBarry Smith 464f1580f4eSBarry Smith Note: 46595452b02SPatrick Sanan the function MUST return an error code of 0 on success and nonzero on failure. 4664aa34b0aSBarry Smith 467f1580f4eSBarry Smith Level: intermediate 4684b9ad928SBarry Smith 469f1580f4eSBarry Smith .seealso: `PCSHELL`, `PCShellSetApplyRichardson()`, `PCShellSetApply()`, `PCShellSetContext()` 4704b9ad928SBarry Smith @*/ 471d71ae5a4SJacob Faibussowitsch PetscErrorCode PCShellSetSetUp(PC pc, PetscErrorCode (*setup)(PC)) 472d71ae5a4SJacob Faibussowitsch { 4734b9ad928SBarry Smith PetscFunctionBegin; 4740700a824SBarry Smith PetscValidHeaderSpecific(pc, PC_CLASSID, 1); 475cac4c232SBarry Smith PetscTryMethod(pc, "PCShellSetSetUp_C", (PC, PetscErrorCode(*)(PC)), (pc, setup)); 476*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 4774b9ad928SBarry Smith } 4784b9ad928SBarry Smith 4794b9ad928SBarry Smith /*@C 4804b9ad928SBarry Smith PCShellSetView - Sets routine to use as viewer of shell preconditioner 4814b9ad928SBarry Smith 482c3339decSBarry Smith Logically Collective 4834b9ad928SBarry Smith 4844b9ad928SBarry Smith Input Parameters: 4854b9ad928SBarry Smith + pc - the preconditioner context 4864b9ad928SBarry Smith - view - the application-provided view routine 4874b9ad928SBarry Smith 48853a7a830SPatrick Sanan Calling sequence of view: 4894b9ad928SBarry Smith .vb 4906891c3e4SJed Brown PetscErrorCode view(PC pc,PetscViewer v) 4914b9ad928SBarry Smith .ve 4924b9ad928SBarry Smith 4936891c3e4SJed Brown + pc - the preconditioner, get the application context with PCShellGetContext() 4944b9ad928SBarry Smith - v - viewer 4954b9ad928SBarry Smith 496f1580f4eSBarry Smith Note: 49795452b02SPatrick Sanan the function MUST return an error code of 0 on success and nonzero on failure. 4984aa34b0aSBarry Smith 499f1580f4eSBarry Smith Level: advanced 5004b9ad928SBarry Smith 501f1580f4eSBarry Smith .seealso: `PCSHELL`, `PCShellSetApplyRichardson()`, `PCShellSetSetUp()`, `PCShellSetApplyTranspose()` 5024b9ad928SBarry Smith @*/ 503d71ae5a4SJacob Faibussowitsch PetscErrorCode PCShellSetView(PC pc, PetscErrorCode (*view)(PC, PetscViewer)) 504d71ae5a4SJacob Faibussowitsch { 5054b9ad928SBarry Smith PetscFunctionBegin; 5060700a824SBarry Smith PetscValidHeaderSpecific(pc, PC_CLASSID, 1); 507cac4c232SBarry Smith PetscTryMethod(pc, "PCShellSetView_C", (PC, PetscErrorCode(*)(PC, PetscViewer)), (pc, view)); 508*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 5094b9ad928SBarry Smith } 5104b9ad928SBarry Smith 5114b9ad928SBarry Smith /*@C 5124b9ad928SBarry Smith PCShellSetApply - Sets routine to use as preconditioner. 5134b9ad928SBarry Smith 514c3339decSBarry Smith Logically Collective 5154b9ad928SBarry Smith 5164b9ad928SBarry Smith Input Parameters: 5174b9ad928SBarry Smith + pc - the preconditioner context 518be29d3c6SBarry Smith - apply - the application-provided preconditioning routine 5194b9ad928SBarry Smith 5204b9ad928SBarry Smith Calling sequence of apply: 5214b9ad928SBarry Smith .vb 5226891c3e4SJed Brown PetscErrorCode apply (PC pc,Vec xin,Vec xout) 5234b9ad928SBarry Smith .ve 5244b9ad928SBarry Smith 5256891c3e4SJed Brown + pc - the preconditioner, get the application context with PCShellGetContext() 5264b9ad928SBarry Smith . xin - input vector 5274b9ad928SBarry Smith - xout - output vector 5284b9ad928SBarry Smith 529f1580f4eSBarry Smith Note: 53095452b02SPatrick Sanan the function MUST return an error code of 0 on success and nonzero on failure. 5314aa34b0aSBarry Smith 532f1580f4eSBarry Smith Level: intermediate 5334b9ad928SBarry Smith 534f1580f4eSBarry Smith .seealso: `PCSHELL`, `PCShellSetApplyRichardson()`, `PCShellSetSetUp()`, `PCShellSetApplyTranspose()`, `PCShellSetContext()`, `PCShellSetApplyBA()`, `PCShellSetApplySymmetricRight()`, `PCShellSetApplySymmetricLeft()` 5354b9ad928SBarry Smith @*/ 536d71ae5a4SJacob Faibussowitsch PetscErrorCode PCShellSetApply(PC pc, PetscErrorCode (*apply)(PC, Vec, Vec)) 537d71ae5a4SJacob Faibussowitsch { 5384b9ad928SBarry Smith PetscFunctionBegin; 5390700a824SBarry Smith PetscValidHeaderSpecific(pc, PC_CLASSID, 1); 540cac4c232SBarry Smith PetscTryMethod(pc, "PCShellSetApply_C", (PC, PetscErrorCode(*)(PC, Vec, Vec)), (pc, apply)); 541*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 5424b9ad928SBarry Smith } 5434b9ad928SBarry Smith 5441b581b66SBarry Smith /*@C 5456437efc7SEric Chamberland PCShellSetMatApply - Sets routine to use as preconditioner on a block of vectors. 5467b6e2003SPierre Jolivet 547c3339decSBarry Smith Logically Collective 5487b6e2003SPierre Jolivet 5497b6e2003SPierre Jolivet Input Parameters: 5507b6e2003SPierre Jolivet + pc - the preconditioner context 5517b6e2003SPierre Jolivet - apply - the application-provided preconditioning routine 5527b6e2003SPierre Jolivet 5537b6e2003SPierre Jolivet Calling sequence of apply: 5547b6e2003SPierre Jolivet .vb 5557b6e2003SPierre Jolivet PetscErrorCode apply (PC pc,Mat Xin,Mat Xout) 5567b6e2003SPierre Jolivet .ve 5577b6e2003SPierre Jolivet 5587b6e2003SPierre Jolivet + pc - the preconditioner, get the application context with PCShellGetContext() 5597b6e2003SPierre Jolivet . Xin - input block of vectors 5607b6e2003SPierre Jolivet - Xout - output block of vectors 5617b6e2003SPierre Jolivet 562f1580f4eSBarry Smith Note: 563f1580f4eSBarry Smith The function MUST return an error code of 0 on success and nonzero on failure. 5647b6e2003SPierre Jolivet 565f1580f4eSBarry Smith Level: advanced 5667b6e2003SPierre Jolivet 567f1580f4eSBarry Smith .seealso: `PCSHELL`, `PCShellSetApply()` 5687b6e2003SPierre Jolivet @*/ 569d71ae5a4SJacob Faibussowitsch PetscErrorCode PCShellSetMatApply(PC pc, PetscErrorCode (*matapply)(PC, Mat, Mat)) 570d71ae5a4SJacob Faibussowitsch { 5717b6e2003SPierre Jolivet PetscFunctionBegin; 5727b6e2003SPierre Jolivet PetscValidHeaderSpecific(pc, PC_CLASSID, 1); 573cac4c232SBarry Smith PetscTryMethod(pc, "PCShellSetMatApply_C", (PC, PetscErrorCode(*)(PC, Mat, Mat)), (pc, matapply)); 574*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 5757b6e2003SPierre Jolivet } 5767b6e2003SPierre Jolivet 5777b6e2003SPierre Jolivet /*@C 578f1580f4eSBarry Smith PCShellSetApplySymmetricLeft - Sets routine to use as left preconditioner (when the `PC_SYMMETRIC` is used). 5791b581b66SBarry Smith 580c3339decSBarry Smith Logically Collective 5811b581b66SBarry Smith 5821b581b66SBarry Smith Input Parameters: 5831b581b66SBarry Smith + pc - the preconditioner context 5841b581b66SBarry Smith - apply - the application-provided left preconditioning routine 5851b581b66SBarry Smith 5861b581b66SBarry Smith Calling sequence of apply: 5871b581b66SBarry Smith .vb 5881b581b66SBarry Smith PetscErrorCode apply (PC pc,Vec xin,Vec xout) 5891b581b66SBarry Smith .ve 5901b581b66SBarry Smith 591f1580f4eSBarry Smith + pc - the preconditioner, get the application context with `PCShellGetContext()` 5921b581b66SBarry Smith . xin - input vector 5931b581b66SBarry Smith - xout - output vector 5941b581b66SBarry Smith 595f1580f4eSBarry Smith Note: 596f1580f4eSBarry Smith The function MUST return an error code of 0 on success and nonzero on failure. 5971b581b66SBarry Smith 598f1580f4eSBarry Smith Level: advanced 5991b581b66SBarry Smith 600f1580f4eSBarry Smith .seealso: `PCSHELL`, `PCShellSetApply()`, `PCShellSetApplySymmetricLeft()`, `PCShellSetSetUp()`, `PCShellSetApplyTranspose()`, `PCShellSetContext()` 6011b581b66SBarry Smith @*/ 602d71ae5a4SJacob Faibussowitsch PetscErrorCode PCShellSetApplySymmetricLeft(PC pc, PetscErrorCode (*apply)(PC, Vec, Vec)) 603d71ae5a4SJacob Faibussowitsch { 6041b581b66SBarry Smith PetscFunctionBegin; 6051b581b66SBarry Smith PetscValidHeaderSpecific(pc, PC_CLASSID, 1); 606cac4c232SBarry Smith PetscTryMethod(pc, "PCShellSetApplySymmetricLeft_C", (PC, PetscErrorCode(*)(PC, Vec, Vec)), (pc, apply)); 607*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 6081b581b66SBarry Smith } 6091b581b66SBarry Smith 6101b581b66SBarry Smith /*@C 611f1580f4eSBarry Smith PCShellSetApplySymmetricRight - Sets routine to use as right preconditioner (when the `PC_SYMMETRIC` is used). 6121b581b66SBarry Smith 613c3339decSBarry Smith Logically Collective 6141b581b66SBarry Smith 6151b581b66SBarry Smith Input Parameters: 6161b581b66SBarry Smith + pc - the preconditioner context 6171b581b66SBarry Smith - apply - the application-provided right preconditioning routine 6181b581b66SBarry Smith 6191b581b66SBarry Smith Calling sequence of apply: 6201b581b66SBarry Smith .vb 6211b581b66SBarry Smith PetscErrorCode apply (PC pc,Vec xin,Vec xout) 6221b581b66SBarry Smith .ve 6231b581b66SBarry Smith 6241b581b66SBarry Smith + pc - the preconditioner, get the application context with PCShellGetContext() 6251b581b66SBarry Smith . xin - input vector 6261b581b66SBarry Smith - xout - output vector 6271b581b66SBarry Smith 628f1580f4eSBarry Smith Note: 629f1580f4eSBarry Smith The function MUST return an error code of 0 on success and nonzero on failure. 6301b581b66SBarry Smith 631f1580f4eSBarry Smith Level: advanced 6321b581b66SBarry Smith 633f1580f4eSBarry Smith .seealso: `PCSHELL`, `PCShellSetApply()`, `PCShellSetApplySymmetricLeft()`, `PCShellSetSetUp()`, `PCShellSetApplyTranspose()`, `PCShellSetContext()` 6341b581b66SBarry Smith @*/ 635d71ae5a4SJacob Faibussowitsch PetscErrorCode PCShellSetApplySymmetricRight(PC pc, PetscErrorCode (*apply)(PC, Vec, Vec)) 636d71ae5a4SJacob Faibussowitsch { 6371b581b66SBarry Smith PetscFunctionBegin; 6381b581b66SBarry Smith PetscValidHeaderSpecific(pc, PC_CLASSID, 1); 639cac4c232SBarry Smith PetscTryMethod(pc, "PCShellSetApplySymmetricRight_C", (PC, PetscErrorCode(*)(PC, Vec, Vec)), (pc, apply)); 640*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 6411b581b66SBarry Smith } 6421b581b66SBarry Smith 6432bb17772SBarry Smith /*@C 6442bb17772SBarry Smith PCShellSetApplyBA - Sets routine to use as preconditioner times operator. 6452bb17772SBarry Smith 646c3339decSBarry Smith Logically Collective 6472bb17772SBarry Smith 6482bb17772SBarry Smith Input Parameters: 6492bb17772SBarry Smith + pc - the preconditioner context 6502bb17772SBarry Smith - applyBA - the application-provided BA routine 6512bb17772SBarry Smith 65253a7a830SPatrick Sanan Calling sequence of applyBA: 6532bb17772SBarry Smith .vb 6546891c3e4SJed Brown PetscErrorCode applyBA (PC pc,Vec xin,Vec xout) 6552bb17772SBarry Smith .ve 6562bb17772SBarry Smith 6576891c3e4SJed Brown + pc - the preconditioner, get the application context with PCShellGetContext() 6582bb17772SBarry Smith . xin - input vector 6592bb17772SBarry Smith - xout - output vector 6602bb17772SBarry Smith 661f1580f4eSBarry Smith Note: 662f1580f4eSBarry Smith The function MUST return an error code of 0 on success and nonzero on failure. 6634aa34b0aSBarry Smith 664f1580f4eSBarry Smith Level: intermediate 6652bb17772SBarry Smith 666f1580f4eSBarry Smith .seealso: `PCSHELL`, `PCShellSetApplyRichardson()`, `PCShellSetSetUp()`, `PCShellSetApplyTranspose()`, `PCShellSetContext()`, `PCShellSetApply()` 6672bb17772SBarry Smith @*/ 668d71ae5a4SJacob Faibussowitsch PetscErrorCode PCShellSetApplyBA(PC pc, PetscErrorCode (*applyBA)(PC, PCSide, Vec, Vec, Vec)) 669d71ae5a4SJacob Faibussowitsch { 6702bb17772SBarry Smith PetscFunctionBegin; 6710700a824SBarry Smith PetscValidHeaderSpecific(pc, PC_CLASSID, 1); 672cac4c232SBarry Smith PetscTryMethod(pc, "PCShellSetApplyBA_C", (PC, PetscErrorCode(*)(PC, PCSide, Vec, Vec, Vec)), (pc, applyBA)); 673*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 6742bb17772SBarry Smith } 6752bb17772SBarry Smith 6764b9ad928SBarry Smith /*@C 6774b9ad928SBarry Smith PCShellSetApplyTranspose - Sets routine to use as preconditioner transpose. 6784b9ad928SBarry Smith 679c3339decSBarry Smith Logically Collective 6804b9ad928SBarry Smith 6814b9ad928SBarry Smith Input Parameters: 6824b9ad928SBarry Smith + pc - the preconditioner context 6834b9ad928SBarry Smith - apply - the application-provided preconditioning transpose routine 6844b9ad928SBarry Smith 6854b9ad928SBarry Smith Calling sequence of apply: 6864b9ad928SBarry Smith .vb 6876891c3e4SJed Brown PetscErrorCode applytranspose (PC pc,Vec xin,Vec xout) 6884b9ad928SBarry Smith .ve 6894b9ad928SBarry Smith 6906891c3e4SJed Brown + pc - the preconditioner, get the application context with PCShellGetContext() 6914b9ad928SBarry Smith . xin - input vector 6924b9ad928SBarry Smith - xout - output vector 6934b9ad928SBarry Smith 694f1580f4eSBarry Smith Note: 69595452b02SPatrick Sanan the function MUST return an error code of 0 on success and nonzero on failure. 6964aa34b0aSBarry Smith 697f1580f4eSBarry Smith Level: intermediate 6984b9ad928SBarry Smith 699f1580f4eSBarry Smith Note: 700f1580f4eSBarry Smith Uses the same context variable as `PCShellSetApply()`. 7014b9ad928SBarry Smith 702f1580f4eSBarry Smith .seealso: `PCSHELL`, `PCShellSetApplyRichardson()`, `PCShellSetSetUp()`, `PCShellSetApply()`, `PCSetContext()`, `PCShellSetApplyBA()` 7034b9ad928SBarry Smith @*/ 704d71ae5a4SJacob Faibussowitsch PetscErrorCode PCShellSetApplyTranspose(PC pc, PetscErrorCode (*applytranspose)(PC, Vec, Vec)) 705d71ae5a4SJacob Faibussowitsch { 7064b9ad928SBarry Smith PetscFunctionBegin; 7070700a824SBarry Smith PetscValidHeaderSpecific(pc, PC_CLASSID, 1); 708cac4c232SBarry Smith PetscTryMethod(pc, "PCShellSetApplyTranspose_C", (PC, PetscErrorCode(*)(PC, Vec, Vec)), (pc, applytranspose)); 709*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 7104b9ad928SBarry Smith } 7114b9ad928SBarry Smith 7127cdd61b2SBarry Smith /*@C 713f1580f4eSBarry Smith PCShellSetPreSolve - Sets routine to apply to the operators/vectors before a `KSPSolve()` is 7147cdd61b2SBarry Smith applied. This usually does something like scale the linear system in some application 7157cdd61b2SBarry Smith specific way. 7167cdd61b2SBarry Smith 717c3339decSBarry Smith Logically Collective 7187cdd61b2SBarry Smith 7197cdd61b2SBarry Smith Input Parameters: 7207cdd61b2SBarry Smith + pc - the preconditioner context 7217cdd61b2SBarry Smith - presolve - the application-provided presolve routine 7227cdd61b2SBarry Smith 7237cdd61b2SBarry Smith Calling sequence of presolve: 7247cdd61b2SBarry Smith .vb 7256891c3e4SJed Brown PetscErrorCode presolve (PC,KSP ksp,Vec b,Vec x) 7267cdd61b2SBarry Smith .ve 7277cdd61b2SBarry Smith 7286891c3e4SJed Brown + pc - the preconditioner, get the application context with PCShellGetContext() 7297cdd61b2SBarry Smith . xin - input vector 7307cdd61b2SBarry Smith - xout - output vector 7317cdd61b2SBarry Smith 732f1580f4eSBarry Smith Note: 733f1580f4eSBarry Smith The function MUST return an error code of 0 on success and nonzero on failure. 7344aa34b0aSBarry Smith 735f1580f4eSBarry Smith Level: advanced 7367cdd61b2SBarry Smith 737f1580f4eSBarry Smith .seealso: `PCSHELL`, `PCShellSetApplyRichardson()`, `PCShellSetSetUp()`, `PCShellSetApplyTranspose()`, `PCShellSetPostSolve()`, `PCShellSetContext()` 7387cdd61b2SBarry Smith @*/ 739d71ae5a4SJacob Faibussowitsch PetscErrorCode PCShellSetPreSolve(PC pc, PetscErrorCode (*presolve)(PC, KSP, Vec, Vec)) 740d71ae5a4SJacob Faibussowitsch { 7417cdd61b2SBarry Smith PetscFunctionBegin; 7420700a824SBarry Smith PetscValidHeaderSpecific(pc, PC_CLASSID, 1); 743cac4c232SBarry Smith PetscTryMethod(pc, "PCShellSetPreSolve_C", (PC, PetscErrorCode(*)(PC, KSP, Vec, Vec)), (pc, presolve)); 744*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 7457cdd61b2SBarry Smith } 7467cdd61b2SBarry Smith 7477cdd61b2SBarry Smith /*@C 748f1580f4eSBarry Smith PCShellSetPostSolve - Sets routine to apply to the operators/vectors before a `KSPSolve()` is 7497cdd61b2SBarry Smith applied. This usually does something like scale the linear system in some application 7507cdd61b2SBarry Smith specific way. 7517cdd61b2SBarry Smith 752c3339decSBarry Smith Logically Collective 7537cdd61b2SBarry Smith 7547cdd61b2SBarry Smith Input Parameters: 7557cdd61b2SBarry Smith + pc - the preconditioner context 7567cdd61b2SBarry Smith - postsolve - the application-provided presolve routine 7577cdd61b2SBarry Smith 7587cdd61b2SBarry Smith Calling sequence of postsolve: 7597cdd61b2SBarry Smith .vb 7606891c3e4SJed Brown PetscErrorCode postsolve(PC,KSP ksp,Vec b,Vec x) 7617cdd61b2SBarry Smith .ve 7627cdd61b2SBarry Smith 763f1580f4eSBarry Smith + pc - the preconditioner, get the application context with `PCShellGetContext()` 7647cdd61b2SBarry Smith . xin - input vector 7657cdd61b2SBarry Smith - xout - output vector 7667cdd61b2SBarry Smith 767f1580f4eSBarry Smith Note: 76895452b02SPatrick Sanan the function MUST return an error code of 0 on success and nonzero on failure. 7694aa34b0aSBarry Smith 770f1580f4eSBarry Smith Level: advanced 7717cdd61b2SBarry Smith 772f1580f4eSBarry Smith .seealso: `PCSHELL`, `PCShellSetApplyRichardson()`, `PCShellSetSetUp()`, `PCShellSetApplyTranspose()`, `PCShellSetPreSolve()`, `PCShellSetContext()` 7737cdd61b2SBarry Smith @*/ 774d71ae5a4SJacob Faibussowitsch PetscErrorCode PCShellSetPostSolve(PC pc, PetscErrorCode (*postsolve)(PC, KSP, Vec, Vec)) 775d71ae5a4SJacob Faibussowitsch { 7767cdd61b2SBarry Smith PetscFunctionBegin; 7770700a824SBarry Smith PetscValidHeaderSpecific(pc, PC_CLASSID, 1); 778cac4c232SBarry Smith PetscTryMethod(pc, "PCShellSetPostSolve_C", (PC, PetscErrorCode(*)(PC, KSP, Vec, Vec)), (pc, postsolve)); 779*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 7807cdd61b2SBarry Smith } 7817cdd61b2SBarry Smith 7824b9ad928SBarry Smith /*@C 783f1580f4eSBarry Smith PCShellSetName - Sets an optional name to associate with a `PCSHELL` 7844b9ad928SBarry Smith preconditioner. 7854b9ad928SBarry Smith 7864b9ad928SBarry Smith Not Collective 7874b9ad928SBarry Smith 7884b9ad928SBarry Smith Input Parameters: 7894b9ad928SBarry Smith + pc - the preconditioner context 7904b9ad928SBarry Smith - name - character string describing shell preconditioner 7914b9ad928SBarry Smith 792f1580f4eSBarry Smith Level: intermediate 7934b9ad928SBarry Smith 794f1580f4eSBarry Smith .seealso: `PCSHELL`, `PCShellGetName()` 7954b9ad928SBarry Smith @*/ 796d71ae5a4SJacob Faibussowitsch PetscErrorCode PCShellSetName(PC pc, const char name[]) 797d71ae5a4SJacob Faibussowitsch { 7984b9ad928SBarry Smith PetscFunctionBegin; 7990700a824SBarry Smith PetscValidHeaderSpecific(pc, PC_CLASSID, 1); 800cac4c232SBarry Smith PetscTryMethod(pc, "PCShellSetName_C", (PC, const char[]), (pc, name)); 801*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 8024b9ad928SBarry Smith } 8034b9ad928SBarry Smith 8044b9ad928SBarry Smith /*@C 805f1580f4eSBarry Smith PCShellGetName - Gets an optional name that the user has set for a `PCSHELL` 8064b9ad928SBarry Smith preconditioner. 8074b9ad928SBarry Smith 8084b9ad928SBarry Smith Not Collective 8094b9ad928SBarry Smith 8104b9ad928SBarry Smith Input Parameter: 8114b9ad928SBarry Smith . pc - the preconditioner context 8124b9ad928SBarry Smith 8134b9ad928SBarry Smith Output Parameter: 8144b9ad928SBarry Smith . name - character string describing shell preconditioner (you should not free this) 8154b9ad928SBarry Smith 816f1580f4eSBarry Smith Level: intermediate 8174b9ad928SBarry Smith 818f1580f4eSBarry Smith .seealso: `PCSHELL`, `PCShellSetName()` 8194b9ad928SBarry Smith @*/ 820d71ae5a4SJacob Faibussowitsch PetscErrorCode PCShellGetName(PC pc, const char *name[]) 821d71ae5a4SJacob Faibussowitsch { 8224b9ad928SBarry Smith PetscFunctionBegin; 8230700a824SBarry Smith PetscValidHeaderSpecific(pc, PC_CLASSID, 1); 8244482741eSBarry Smith PetscValidPointer(name, 2); 825cac4c232SBarry Smith PetscUseMethod(pc, "PCShellGetName_C", (PC, const char *[]), (pc, name)); 826*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 8274b9ad928SBarry Smith } 8284b9ad928SBarry Smith 8294b9ad928SBarry Smith /*@C 8304b9ad928SBarry Smith PCShellSetApplyRichardson - Sets routine to use as preconditioner 8314b9ad928SBarry Smith in Richardson iteration. 8324b9ad928SBarry Smith 833c3339decSBarry Smith Logically Collective 8344b9ad928SBarry Smith 8354b9ad928SBarry Smith Input Parameters: 8364b9ad928SBarry Smith + pc - the preconditioner context 837be29d3c6SBarry Smith - apply - the application-provided preconditioning routine 8384b9ad928SBarry Smith 8394b9ad928SBarry Smith Calling sequence of apply: 8404b9ad928SBarry Smith .vb 8416891c3e4SJed Brown PetscErrorCode apply (PC pc,Vec b,Vec x,Vec r,PetscReal rtol,PetscReal abstol,PetscReal dtol,PetscInt maxits) 8424b9ad928SBarry Smith .ve 8434b9ad928SBarry Smith 8446891c3e4SJed Brown + pc - the preconditioner, get the application context with PCShellGetContext() 8454b9ad928SBarry Smith . b - right-hand-side 8464b9ad928SBarry Smith . x - current iterate 8474b9ad928SBarry Smith . r - work space 8484b9ad928SBarry Smith . rtol - relative tolerance of residual norm to stop at 84970441072SBarry Smith . abstol - absolute tolerance of residual norm to stop at 8504b9ad928SBarry Smith . dtol - if residual norm increases by this factor than return 8514b9ad928SBarry Smith - maxits - number of iterations to run 8524b9ad928SBarry Smith 853f1580f4eSBarry Smith Note: 85495452b02SPatrick Sanan the function MUST return an error code of 0 on success and nonzero on failure. 8554aa34b0aSBarry Smith 856f1580f4eSBarry Smith Level: advanced 8574b9ad928SBarry Smith 858db781477SPatrick Sanan .seealso: `PCShellSetApply()`, `PCShellSetContext()` 8594b9ad928SBarry Smith @*/ 860d71ae5a4SJacob Faibussowitsch PetscErrorCode PCShellSetApplyRichardson(PC pc, PetscErrorCode (*apply)(PC, Vec, Vec, Vec, PetscReal, PetscReal, PetscReal, PetscInt, PetscBool, PetscInt *, PCRichardsonConvergedReason *)) 861d71ae5a4SJacob Faibussowitsch { 8624b9ad928SBarry Smith PetscFunctionBegin; 8630700a824SBarry Smith PetscValidHeaderSpecific(pc, PC_CLASSID, 1); 864cac4c232SBarry Smith PetscTryMethod(pc, "PCShellSetApplyRichardson_C", (PC, PetscErrorCode(*)(PC, Vec, Vec, Vec, PetscReal, PetscReal, PetscReal, PetscInt, PetscBool, PetscInt *, PCRichardsonConvergedReason *)), (pc, apply)); 865*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 8664b9ad928SBarry Smith } 8674b9ad928SBarry Smith 8684b9ad928SBarry Smith /*MC 869f1580f4eSBarry Smith PCSHELL - Creates a new preconditioner class for use with a users 870f1580f4eSBarry Smith own private data storage format and preconditioner application code 8714b9ad928SBarry Smith 8724b9ad928SBarry Smith Level: advanced 873e0bb08deSStefano Zampini 8744b9ad928SBarry Smith Usage: 875f1580f4eSBarry Smith .vb 876f1580f4eSBarry Smith extern PetscErrorCode apply(PC,Vec,Vec); 877f1580f4eSBarry Smith extern PetscErrorCode applyba(PC,PCSide,Vec,Vec,Vec); 878f1580f4eSBarry Smith extern PetscErrorCode applytranspose(PC,Vec,Vec); 879f1580f4eSBarry Smith extern PetscErrorCode setup(PC); 880f1580f4eSBarry Smith extern PetscErrorCode destroy(PC); 881f1580f4eSBarry Smith 882f1580f4eSBarry Smith PCCreate(comm,&pc); 883f1580f4eSBarry Smith PCSetType(pc,PCSHELL); 884f1580f4eSBarry Smith PCShellSetContext(pc,ctx) 885f1580f4eSBarry Smith PCShellSetApply(pc,apply); 886f1580f4eSBarry Smith PCShellSetApplyBA(pc,applyba); (optional) 887f1580f4eSBarry Smith PCShellSetApplyTranspose(pc,applytranspose); (optional) 888f1580f4eSBarry Smith PCShellSetSetUp(pc,setup); (optional) 889f1580f4eSBarry Smith PCShellSetDestroy(pc,destroy); (optional) 890f1580f4eSBarry Smith .ve 8914b9ad928SBarry Smith 892db781477SPatrick Sanan .seealso: `PCCreate()`, `PCSetType()`, `PCType`, `PC`, 893f1580f4eSBarry Smith `MATSHELL`, `PCShellSetSetUp()`, `PCShellSetApply()`, `PCShellSetView()`, `PCShellSetDestroy()`, `PCShellSetPostSolve()`, 894f1580f4eSBarry Smith `PCShellSetApplyTranspose()`, `PCShellSetName()`, `PCShellSetApplyRichardson()`, `PCShellSetPreSolve()`, `PCShellSetView()`, 895f1580f4eSBarry Smith `PCShellGetName()`, `PCShellSetContext()`, `PCShellGetContext()`, `PCShellSetApplyBA()`, `MATSHELL`, `PCShellSetMatApply()`, 8964b9ad928SBarry Smith M*/ 8974b9ad928SBarry Smith 898d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PCCreate_Shell(PC pc) 899d71ae5a4SJacob Faibussowitsch { 9004b9ad928SBarry Smith PC_Shell *shell; 9014b9ad928SBarry Smith 9024b9ad928SBarry Smith PetscFunctionBegin; 9034dfa11a4SJacob Faibussowitsch PetscCall(PetscNew(&shell)); 9044b9ad928SBarry Smith pc->data = (void *)shell; 9054b9ad928SBarry Smith 906d01c8aa3SLisandro Dalcin pc->ops->destroy = PCDestroy_Shell; 9074b9ad928SBarry Smith pc->ops->view = PCView_Shell; 908d01c8aa3SLisandro Dalcin pc->ops->apply = PCApply_Shell; 9091b581b66SBarry Smith pc->ops->applysymmetricleft = PCApplySymmetricLeft_Shell; 9101b581b66SBarry Smith pc->ops->applysymmetricright = PCApplySymmetricRight_Shell; 9110e0fe96bSStefano Zampini pc->ops->matapply = NULL; 9120a545947SLisandro Dalcin pc->ops->applytranspose = NULL; 9130a545947SLisandro Dalcin pc->ops->applyrichardson = NULL; 9140a545947SLisandro Dalcin pc->ops->setup = NULL; 9150a545947SLisandro Dalcin pc->ops->presolve = NULL; 9160a545947SLisandro Dalcin pc->ops->postsolve = NULL; 9174b9ad928SBarry Smith 9180a545947SLisandro Dalcin shell->apply = NULL; 9190a545947SLisandro Dalcin shell->applytranspose = NULL; 9200a545947SLisandro Dalcin shell->name = NULL; 9210a545947SLisandro Dalcin shell->applyrich = NULL; 9220a545947SLisandro Dalcin shell->presolve = NULL; 9230a545947SLisandro Dalcin shell->postsolve = NULL; 9240a545947SLisandro Dalcin shell->ctx = NULL; 9250a545947SLisandro Dalcin shell->setup = NULL; 9260a545947SLisandro Dalcin shell->view = NULL; 9270a545947SLisandro Dalcin shell->destroy = NULL; 9280a545947SLisandro Dalcin shell->applysymmetricleft = NULL; 9290a545947SLisandro Dalcin shell->applysymmetricright = NULL; 9304b9ad928SBarry Smith 9319566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)pc, "PCShellSetDestroy_C", PCShellSetDestroy_Shell)); 9329566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)pc, "PCShellSetSetUp_C", PCShellSetSetUp_Shell)); 9339566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)pc, "PCShellSetApply_C", PCShellSetApply_Shell)); 9349566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)pc, "PCShellSetMatApply_C", PCShellSetMatApply_Shell)); 9359566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)pc, "PCShellSetApplySymmetricLeft_C", PCShellSetApplySymmetricLeft_Shell)); 9369566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)pc, "PCShellSetApplySymmetricRight_C", PCShellSetApplySymmetricRight_Shell)); 9379566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)pc, "PCShellSetApplyBA_C", PCShellSetApplyBA_Shell)); 9389566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)pc, "PCShellSetPreSolve_C", PCShellSetPreSolve_Shell)); 9399566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)pc, "PCShellSetPostSolve_C", PCShellSetPostSolve_Shell)); 9409566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)pc, "PCShellSetView_C", PCShellSetView_Shell)); 9419566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)pc, "PCShellSetApplyTranspose_C", PCShellSetApplyTranspose_Shell)); 9429566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)pc, "PCShellSetName_C", PCShellSetName_Shell)); 9439566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)pc, "PCShellGetName_C", PCShellGetName_Shell)); 9449566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)pc, "PCShellSetApplyRichardson_C", PCShellSetApplyRichardson_Shell)); 945*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 9464b9ad928SBarry Smith } 947