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