Actual source code: pcmat.c


  2: #include <petsc/private/pcimpl.h>

  4: static PetscErrorCode PCApply_Mat(PC pc,Vec x,Vec y)
  5: {
  6:   MatMult(pc->pmat,x,y);
  7:   return 0;
  8: }

 10: static PetscErrorCode PCMatApply_Mat(PC pc,Mat X,Mat Y)
 11: {
 12:   MatMatMult(pc->pmat,X,MAT_REUSE_MATRIX,PETSC_DEFAULT,&Y);
 13:   return 0;
 14: }

 16: static PetscErrorCode PCApplyTranspose_Mat(PC pc,Vec x,Vec y)
 17: {
 18:   MatMultTranspose(pc->pmat,x,y);
 19:   return 0;
 20: }

 22: static PetscErrorCode PCDestroy_Mat(PC pc)
 23: {
 24:   return 0;
 25: }

 27: /*MC
 28:      PCMAT - A preconditioner obtained by multiplying by the preconditioner matrix supplied
 29:              in PCSetOperators() or KSPSetOperators()

 31:    Notes:
 32:     This one is a little strange. One rarely has an explicit matrix that approximates the
 33:          inverse of the matrix they wish to solve for.

 35:    Level: intermediate

 37: .seealso:  PCCreate(), PCSetType(), PCType (for list of available types), PC,
 38:            PCSHELL

 40: M*/

 42: PETSC_EXTERN PetscErrorCode PCCreate_Mat(PC pc)
 43: {
 44:   pc->ops->apply               = PCApply_Mat;
 45:   pc->ops->matapply            = PCMatApply_Mat;
 46:   pc->ops->applytranspose      = PCApplyTranspose_Mat;
 47:   pc->ops->setup               = NULL;
 48:   pc->ops->destroy             = PCDestroy_Mat;
 49:   pc->ops->setfromoptions      = NULL;
 50:   pc->ops->view                = NULL;
 51:   pc->ops->applyrichardson     = NULL;
 52:   pc->ops->applysymmetricleft  = NULL;
 53:   pc->ops->applysymmetricright = NULL;
 54:   return 0;
 55: }