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