Actual source code: pcimpl.h

  1: #pragma once

  3: #include <petscksp.h>
  4: #include <petscpc.h>
  5: #include <petsc/private/petscimpl.h>

  7: PETSC_EXTERN PetscBool      PCRegisterAllCalled;
  8: PETSC_EXTERN PetscErrorCode PCRegisterAll(void);

 10: typedef struct _PCOps *PCOps;
 11: struct _PCOps {
 12:   PetscErrorCode (*setup)(PC);
 13:   PetscErrorCode (*apply)(PC, Vec, Vec);
 14:   PetscErrorCode (*matapply)(PC, Mat, Mat);
 15:   PetscErrorCode (*applyrichardson)(PC, Vec, Vec, Vec, PetscReal, PetscReal, PetscReal, PetscInt, PetscBool, PetscInt *, PCRichardsonConvergedReason *);
 16:   PetscErrorCode (*matapplyrichardson)(PC, Mat, Mat, Mat, PetscReal, PetscReal, PetscReal, PetscInt, PetscBool, PetscInt *, PCRichardsonConvergedReason *);
 17:   PetscErrorCode (*applyBA)(PC, PCSide, Vec, Vec, Vec);
 18:   PetscErrorCode (*applytranspose)(PC, Vec, Vec);
 19:   PetscErrorCode (*matapplytranspose)(PC, Mat, Mat);
 20:   PetscErrorCode (*applyBAtranspose)(PC, PetscInt, Vec, Vec, Vec);
 21:   PetscErrorCode (*setfromoptions)(PC, PetscOptionItems);
 22:   PetscErrorCode (*presolve)(PC, KSP, Vec, Vec);
 23:   PetscErrorCode (*postsolve)(PC, KSP, Vec, Vec);
 24:   PetscErrorCode (*getfactoredmatrix)(PC, Mat *);
 25:   PetscErrorCode (*applysymmetricleft)(PC, Vec, Vec);
 26:   PetscErrorCode (*applysymmetricright)(PC, Vec, Vec);
 27:   PetscErrorCode (*setuponblocks)(PC);
 28:   PetscErrorCode (*destroy)(PC);
 29:   PetscErrorCode (*view)(PC, PetscViewer);
 30:   PetscErrorCode (*reset)(PC);
 31:   PetscErrorCode (*load)(PC, PetscViewer);
 32: };

 34: /*
 35:    Preconditioner context
 36: */
 37: struct _p_PC {
 38:   PETSCHEADER(struct _PCOps);
 39:   DM           dm;
 40:   PetscBool    setupcalled;
 41:   MatState     matstate; /* last known state of the pmat associated with this PC */
 42:   PetscBool    reusepreconditioner;
 43:   MatStructure flag; /* reset each PCSetUp() to indicate to PC implementations if nonzero structure has changed */

 45:   PetscInt  setfromoptionscalled;
 46:   PetscBool erroriffailure; /* Generate an error if FPE detected (for example a zero pivot) instead of returning*/
 47:   Mat       mat, pmat;

 49:   PetscObjectParameterDeclare(PetscBool, useAmat); /* used by several PC that including applying the operator inside the preconditioner */

 51:   PetscErrorCode (*modifysubmatrices)(PC, PetscInt, const IS[], const IS[], Mat[], void *); /* user provided routine */
 52:   void          *modifysubmatricesP;                                                        /* context for user routine */
 53:   void          *data;
 54:   void          *ctx;              /* optional user-defined context */
 55:   PCFailedReason failedreason;     /* after VecNorm or VecDot contains maximum of all rank failed reasons */
 56:   PCFailedReason failedreasonrank; /* failed reason on this rank */
 57:   PetscInt       presolvedone;
 58:   PetscErrorCode (*postsetup)(PC);
 59:   PetscInt kspnestlevel; /* how many levels of nesting does the KSP have that contains the PC */
 60: };

 62: PETSC_EXTERN PetscLogEvent PC_SetUp;
 63: PETSC_EXTERN PetscLogEvent PC_SetUpOnBlocks;
 64: PETSC_EXTERN PetscLogEvent PC_Apply;
 65: PETSC_EXTERN PetscLogEvent PC_MatApply;
 66: PETSC_EXTERN PetscLogEvent PC_ApplyCoarse;
 67: PETSC_EXTERN PetscLogEvent PC_ApplySymmetricLeft;
 68: PETSC_EXTERN PetscLogEvent PC_ApplySymmetricRight;
 69: PETSC_EXTERN PetscLogEvent PC_ModifySubMatrices;
 70: PETSC_EXTERN PetscLogEvent PC_ApplyOnBlocks;
 71: PETSC_EXTERN PetscLogEvent PC_ApplyTransposeOnBlocks;
 72: PETSC_EXTERN PetscLogStage PCMPIStage;