xref: /petsc/src/mat/tests/ex201f.F90 (revision 66af8762ec03dbef0e079729eb2a1734a35ed7ff)
1!
2!
3!   This program demonstrates use of MatShellSetOperation()
4!
5      subroutine mymatmult(A, x, y, ierr)
6#include <petsc/finclude/petscmat.h>
7      use petscmat
8      implicit none
9
10      Mat A
11      Vec x, y
12      PetscErrorCode ierr
13
14      print*, 'Called MatMult'
15      return
16      end
17
18      subroutine mymatmultadd(A, x, y, z, ierr)
19      use petscmat
20      implicit none
21      Mat A
22      Vec x, y, z
23      PetscErrorCode ierr
24
25      print*, 'Called MatMultAdd'
26      return
27      end
28
29      subroutine mymatmulttranspose(A, x, y, ierr)
30      use petscmat
31      implicit none
32      Mat A
33      Vec x, y
34      PetscErrorCode ierr
35
36      print*, 'Called MatMultTranspose'
37      return
38      end
39
40      subroutine mymatmulttransposeadd(A, x, y, z, ierr)
41      use petscmat
42      implicit none
43      Mat A
44      Vec x, y, z
45      PetscErrorCode ierr
46
47      print*, 'Called MatMultTransposeAdd'
48      return
49      end
50
51      subroutine mymattranspose(A, reuse, B, ierr)
52      use petscmat
53      implicit none
54      Mat A, B
55      MatReuse reuse
56      PetscErrorCode ierr
57      PetscInt i12,i0
58
59      i12 = 12
60      i0 = 0
61      PetscCallA(MatCreateShell(PETSC_COMM_SELF,i12,i12,i12,i12,i0,B,ierr))
62      PetscCallA(MatAssemblyBegin(B, MAT_FINAL_ASSEMBLY, ierr))
63      PetscCallA(MatAssemblyEnd(B, MAT_FINAL_ASSEMBLY, ierr))
64
65      print*, 'Called MatTranspose'
66      return
67      end
68
69      subroutine mymatgetdiagonal(A, x, ierr)
70      use petscmat
71      implicit none
72      Mat A
73      Vec x
74      PetscErrorCode ierr
75
76      print*, 'Called MatGetDiagonal'
77      return
78      end
79
80      subroutine mymatdiagonalscale(A, x, y, ierr)
81      use petscmat
82      implicit none
83      Mat A
84      Vec x, y
85      PetscErrorCode ierr
86
87      print*, 'Called MatDiagonalScale'
88      return
89      end
90
91      subroutine mymatzeroentries(A, ierr)
92      use petscmat
93      implicit none
94      Mat A
95      PetscErrorCode ierr
96
97      print*, 'Called MatZeroEntries'
98      return
99      end
100
101      subroutine mymataxpy(A, alpha, B, str, ierr)
102      use petscmat
103      implicit none
104      Mat A, B
105      PetscScalar alpha
106      MatStructure str
107      PetscErrorCode ierr
108
109      print*, 'Called MatAXPY'
110      return
111      end
112
113      subroutine mymatshift(A, alpha, ierr)
114      use petscmat
115      implicit none
116      Mat A
117      PetscScalar alpha
118      PetscErrorCode ierr
119
120      print*, 'Called MatShift'
121      return
122      end
123
124      subroutine mymatdiagonalset(A, x, ins, ierr)
125      use petscmat
126      implicit none
127      Mat A
128      Vec x
129      InsertMode ins
130      PetscErrorCode ierr
131
132      print*, 'Called MatDiagonalSet'
133      return
134      end
135
136      subroutine mymatdestroy(A, ierr)
137      use petscmat
138      implicit none
139      Mat A
140      PetscErrorCode ierr
141
142      print*, 'Called MatDestroy'
143      return
144      end
145
146      subroutine mymatview(A, viewer, ierr)
147      use petscmat
148      implicit none
149      Mat A
150      PetscViewer viewer
151      PetscErrorCode ierr
152
153      print*, 'Called MatView'
154      return
155      end
156
157      subroutine mymatgetvecs(A, x, y, ierr)
158      use petscmat
159      implicit none
160      Mat A
161      Vec x, y
162      PetscErrorCode ierr
163
164      print*, 'Called MatCreateVecs'
165      return
166      end
167
168      program main
169      use petscmat
170      implicit none
171
172      Mat     m, mt
173      Vec     x, y, z
174      PetscScalar a
175      PetscViewer viewer
176      MatOperation op
177      PetscErrorCode ierr
178      PetscInt i12,i0
179      external mymatmult
180      external mymatmultadd
181      external mymatmulttranspose
182      external mymatmulttransposeadd
183      external mymattranspose
184      external mymatgetdiagonal
185      external mymatdiagonalscale
186      external mymatzeroentries
187      external mymataxpy
188      external mymatshift
189      external mymatdiagonalset
190      external mymatdestroy
191      external mymatview
192      external mymatgetvecs
193
194      PetscCallA(PetscInitialize(ierr))
195
196      viewer = PETSC_VIEWER_STDOUT_SELF
197      i12 = 12
198      i0 = 0
199      PetscCallA(VecCreateSeq(PETSC_COMM_SELF, i12, x, ierr))
200      PetscCallA(VecCreateSeq(PETSC_COMM_SELF, i12, y, ierr))
201      PetscCallA(VecCreateSeq(PETSC_COMM_SELF, i12, z, ierr))
202      PetscCallA(MatCreateShell(PETSC_COMM_SELF,i12,i12,i12,i12,i0,m,ierr))
203      PetscCallA(MatShellSetManageScalingShifts(m,ierr))
204      PetscCallA(MatAssemblyBegin(m, MAT_FINAL_ASSEMBLY, ierr))
205      PetscCallA(MatAssemblyEnd(m, MAT_FINAL_ASSEMBLY, ierr))
206
207      op = MATOP_MULT
208      PetscCallA(MatShellSetOperation(m, op, mymatmult, ierr))
209      op = MATOP_MULT_ADD
210      PetscCallA(MatShellSetOperation(m, op, mymatmultadd, ierr))
211      op = MATOP_MULT_TRANSPOSE
212      PetscCallA(MatShellSetOperation(m, op, mymatmulttranspose, ierr))
213      op = MATOP_MULT_TRANSPOSE_ADD
214      PetscCallA(MatShellSetOperation(m, op, mymatmulttransposeadd, ierr))
215      op = MATOP_TRANSPOSE
216      PetscCallA(MatShellSetOperation(m, op, mymattranspose, ierr))
217      op = MATOP_GET_DIAGONAL
218      PetscCallA(MatShellSetOperation(m, op, mymatgetdiagonal, ierr))
219      op = MATOP_DIAGONAL_SCALE
220      PetscCallA(MatShellSetOperation(m, op, mymatdiagonalscale, ierr))
221      op = MATOP_ZERO_ENTRIES
222      PetscCallA(MatShellSetOperation(m, op, mymatzeroentries, ierr))
223      op = MATOP_AXPY
224      PetscCallA(MatShellSetOperation(m, op, mymataxpy, ierr))
225      op = MATOP_SHIFT
226      PetscCallA(MatShellSetOperation(m, op, mymatshift, ierr))
227      op = MATOP_DIAGONAL_SET
228      PetscCallA(MatShellSetOperation(m, op, mymatdiagonalset, ierr))
229      op = MATOP_DESTROY
230      PetscCallA(MatShellSetOperation(m, op, mymatdestroy, ierr))
231      op = MATOP_VIEW
232      PetscCallA(MatShellSetOperation(m, op, mymatview, ierr))
233      op = MATOP_CREATE_VECS
234      PetscCallA(MatShellSetOperation(m, op, mymatgetvecs, ierr))
235
236      PetscCallA(MatMult(m, x, y, ierr))
237      PetscCallA(MatMultAdd(m, x, y, z, ierr))
238      PetscCallA(MatMultTranspose(m, x, y, ierr))
239      PetscCallA(MatMultTransposeAdd(m, x, y, z, ierr))
240      PetscCallA(MatTranspose(m, MAT_INITIAL_MATRIX, mt, ierr))
241      PetscCallA(MatGetDiagonal(m, x, ierr))
242      PetscCallA(MatDiagonalScale(m, x, y, ierr))
243      PetscCallA(MatZeroEntries(m, ierr))
244      a = 102.
245      PetscCallA(MatAXPY(m, a, mt, SAME_NONZERO_PATTERN, ierr))
246      PetscCallA(MatShift(m, a, ierr))
247      PetscCallA(MatDiagonalSet(m, x, INSERT_VALUES, ierr))
248      PetscCallA(MatView(m, viewer, ierr))
249      PetscCallA(MatCreateVecs(m, x, y, ierr))
250      PetscCallA(MatDestroy(m,ierr))
251      PetscCallA(MatDestroy(mt, ierr))
252      PetscCallA(VecDestroy(x, ierr))
253      PetscCallA(VecDestroy(y, ierr))
254      PetscCallA(VecDestroy(z, ierr))
255
256      PetscCallA(PetscFinalize(ierr))
257      end
258
259!/*TEST
260!
261!   test:
262!     args: -malloc_dump
263!     filter: sort -b
264!     filter_output: sort -b
265!
266!TEST*/
267