Actual source code: ex201f.F90
1: !
2: !
3: ! This program demonstrates use of MatShellSetOperation()
4: !
5: #include <petsc/finclude/petscmat.h>
6: module ex201fmodule
7: use petscmat
8: implicit none
10: contains
11: subroutine mymatmult(A, x, y, ierr)
12: Mat A
13: Vec x, y
14: PetscErrorCode ierr
16: print *, 'Called MatMult'
17: end
19: subroutine mymatmultadd(A, x, y, z, ierr)
20: Mat A
21: Vec x, y, z
22: PetscErrorCode ierr
24: print *, 'Called MatMultAdd'
25: end
27: subroutine mymatmulttranspose(A, x, y, ierr)
28: Mat A
29: Vec x, y
30: PetscErrorCode ierr
32: print *, 'Called MatMultTranspose'
33: end
35: subroutine mymatmulthermitiantranspose(A, x, y, ierr)
36: Mat A
37: Vec x, y
38: PetscErrorCode ierr
40: print *, 'Called MatMultHermitianTranspose'
41: end
43: subroutine mymatmulttransposeadd(A, x, y, z, ierr)
44: Mat A
45: Vec x, y, z
46: PetscErrorCode ierr
48: print *, 'Called MatMultTransposeAdd'
49: end
51: subroutine mymatmulthermitiantransposeadd(A, x, y, z, ierr)
52: Mat A
53: Vec x, y, z
54: PetscErrorCode ierr
56: print *, 'Called MatMultHermitianTransposeAdd'
57: end
59: subroutine mymattranspose(A, reuse, B, ierr)
60: Mat A, B
61: MatReuse reuse
62: PetscErrorCode ierr
64: PetscCallA(MatCreateShell(PETSC_COMM_SELF, 12_PETSC_INT_KIND, 12_PETSC_INT_KIND, 12_PETSC_INT_KIND, 12_PETSC_INT_KIND, 0_PETSC_INT_KIND, B, ierr))
65: PetscCallA(MatAssemblyBegin(B, MAT_FINAL_ASSEMBLY, ierr))
66: PetscCallA(MatAssemblyEnd(B, MAT_FINAL_ASSEMBLY, ierr))
68: print *, 'Called MatTranspose'
69: end
71: subroutine mymatgetdiagonal(A, x, ierr)
72: Mat A
73: Vec x
74: PetscErrorCode ierr
76: print *, 'Called MatGetDiagonal'
77: end
79: subroutine mymatdiagonalscale(A, x, y, ierr)
80: Mat A
81: Vec x, y
82: PetscErrorCode ierr
84: print *, 'Called MatDiagonalScale'
85: end
87: subroutine mymatzeroentries(A, ierr)
88: Mat A
89: PetscErrorCode ierr
91: print *, 'Called MatZeroEntries'
92: end
94: subroutine mymataxpy(A, alpha, B, str, ierr)
95: Mat A, B
96: PetscScalar alpha
97: MatStructure str
98: PetscErrorCode ierr
100: print *, 'Called MatAXPY'
101: end
103: subroutine mymatshift(A, alpha, ierr)
104: Mat A
105: PetscScalar alpha
106: PetscErrorCode ierr
108: print *, 'Called MatShift'
109: end
111: subroutine mymatdiagonalset(A, x, ins, ierr)
112: Mat A
113: Vec x
114: InsertMode ins
115: PetscErrorCode ierr
117: print *, 'Called MatDiagonalSet'
118: end
120: subroutine mymatdestroy(A, ierr)
121: Mat A
122: PetscErrorCode ierr
124: print *, 'Called MatDestroy'
125: end
127: subroutine mymatview(A, viewer, ierr)
128: Mat A
129: PetscViewer viewer
130: PetscErrorCode ierr
132: print *, 'Called MatView'
133: end
135: subroutine mymatgetvecs(A, x, y, ierr)
136: Mat A
137: Vec x, y
138: PetscErrorCode ierr
140: print *, 'Called MatCreateVecs'
141: end
143: end module ex201fmodule
145: program main
146: use petscmat
147: use ex201fmodule
148: implicit none
150: Mat m, mt
151: Vec x, y, z
152: PetscScalar, parameter :: a = 102.
153: PetscViewer viewer
154: MatOperation op
155: PetscErrorCode ierr
157: PetscCallA(PetscInitialize(ierr))
159: viewer = PETSC_VIEWER_STDOUT_SELF
160: PetscCallA(VecCreateSeq(PETSC_COMM_SELF, 12_PETSC_INT_KIND, x, ierr))
161: PetscCallA(VecCreateSeq(PETSC_COMM_SELF, 12_PETSC_INT_KIND, y, ierr))
162: PetscCallA(VecCreateSeq(PETSC_COMM_SELF, 12_PETSC_INT_KIND, z, ierr))
163: PetscCallA(MatCreateShell(PETSC_COMM_SELF, 12_PETSC_INT_KIND, 12_PETSC_INT_KIND, 12_PETSC_INT_KIND, 12_PETSC_INT_KIND, 0_PETSC_INT_KIND, m, ierr))
164: PetscCallA(MatShellSetManageScalingShifts(m, ierr))
165: PetscCallA(MatAssemblyBegin(m, MAT_FINAL_ASSEMBLY, ierr))
166: PetscCallA(MatAssemblyEnd(m, MAT_FINAL_ASSEMBLY, ierr))
168: op = MATOP_MULT
169: PetscCallA(MatShellSetOperation(m, op, mymatmult, ierr))
170: op = MATOP_MULT_ADD
171: PetscCallA(MatShellSetOperation(m, op, mymatmultadd, ierr))
172: op = MATOP_MULT_TRANSPOSE
173: PetscCallA(MatShellSetOperation(m, op, mymatmulttranspose, ierr))
174: op = MATOP_MULT_HERMITIAN_TRANSPOSE
175: PetscCallA(MatShellSetOperation(m, op, mymatmulthermitiantranspose, ierr))
176: op = MATOP_MULT_TRANSPOSE_ADD
177: PetscCallA(MatShellSetOperation(m, op, mymatmulttransposeadd, ierr))
178: op = MATOP_MULT_HERMITIAN_TRANS_ADD
179: PetscCallA(MatShellSetOperation(m, op, mymatmulthermitiantransposeadd, ierr))
180: op = MATOP_TRANSPOSE
181: PetscCallA(MatShellSetOperation(m, op, mymattranspose, ierr))
182: op = MATOP_GET_DIAGONAL
183: PetscCallA(MatShellSetOperation(m, op, mymatgetdiagonal, ierr))
184: op = MATOP_DIAGONAL_SCALE
185: PetscCallA(MatShellSetOperation(m, op, mymatdiagonalscale, ierr))
186: op = MATOP_ZERO_ENTRIES
187: PetscCallA(MatShellSetOperation(m, op, mymatzeroentries, ierr))
188: op = MATOP_AXPY
189: PetscCallA(MatShellSetOperation(m, op, mymataxpy, ierr))
190: op = MATOP_SHIFT
191: PetscCallA(MatShellSetOperation(m, op, mymatshift, ierr))
192: op = MATOP_DIAGONAL_SET
193: PetscCallA(MatShellSetOperation(m, op, mymatdiagonalset, ierr))
194: op = MATOP_DESTROY
195: PetscCallA(MatShellSetOperation(m, op, mymatdestroy, ierr))
196: op = MATOP_VIEW
197: PetscCallA(MatShellSetOperation(m, op, mymatview, ierr))
198: op = MATOP_CREATE_VECS
199: PetscCallA(MatShellSetOperation(m, op, mymatgetvecs, ierr))
201: PetscCallA(MatMult(m, x, y, ierr))
202: PetscCallA(MatMultAdd(m, x, y, z, ierr))
203: PetscCallA(MatMultTranspose(m, x, y, ierr))
204: PetscCallA(MatMultHermitianTranspose(m, x, y, ierr))
205: PetscCallA(MatMultTransposeAdd(m, x, y, z, ierr))
206: PetscCallA(MatMultHermitianTransposeAdd(m, x, y, z, ierr))
207: PetscCallA(MatTranspose(m, MAT_INITIAL_MATRIX, mt, ierr))
208: PetscCallA(MatGetDiagonal(m, x, ierr))
209: PetscCallA(MatDiagonalScale(m, x, y, ierr))
210: PetscCallA(MatZeroEntries(m, ierr))
211: PetscCallA(MatAXPY(m, a, mt, SAME_NONZERO_PATTERN, ierr))
212: PetscCallA(MatShift(m, a, ierr))
213: PetscCallA(MatDiagonalSet(m, x, INSERT_VALUES, ierr))
214: PetscCallA(MatView(m, viewer, ierr))
215: PetscCallA(MatCreateVecs(m, x, y, ierr))
216: PetscCallA(MatDestroy(m, ierr))
217: PetscCallA(MatDestroy(mt, ierr))
218: PetscCallA(VecDestroy(x, ierr))
219: PetscCallA(VecDestroy(y, ierr))
220: PetscCallA(VecDestroy(z, ierr))
222: PetscCallA(PetscFinalize(ierr))
223: end
225: !/*TEST
226: !
227: ! testset:
228: ! args: -malloc_dump
229: ! filter: sort -b
230: ! filter_output: sort -b
231: ! test:
232: ! suffix: 1
233: ! requires: !complex
234: ! test:
235: ! suffix: 2
236: ! requires: complex
237: !
238: !TEST*/