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