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: }