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