Actual source code: ex201f.F90

  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

 10:         Mat A
 11:         Vec x, y
 12:         PetscErrorCode ierr

 14:         print *, 'Called MatMult'
 15:       end

 17:       subroutine mymatmultadd(A, x, y, z, ierr)
 18:         use petscmat
 19:         implicit none
 20:         Mat A
 21:         Vec x, y, z
 22:         PetscErrorCode ierr

 24:         print *, 'Called MatMultAdd'
 25:       end

 27:       subroutine mymatmulttranspose(A, x, y, ierr)
 28:         use petscmat
 29:         implicit none
 30:         Mat A
 31:         Vec x, y
 32:         PetscErrorCode ierr

 34:         print *, 'Called MatMultTranspose'
 35:       end

 37:       subroutine mymatmulthermitiantranspose(A, x, y, ierr)
 38:         use petscmat
 39:         implicit none
 40:         Mat A
 41:         Vec x, y
 42:         PetscErrorCode ierr

 44:         print *, 'Called MatMultHermitianTranspose'
 45:       end

 47:       subroutine mymatmulttransposeadd(A, x, y, z, ierr)
 48:         use petscmat
 49:         implicit none
 50:         Mat A
 51:         Vec x, y, z
 52:         PetscErrorCode ierr

 54:         print *, 'Called MatMultTransposeAdd'
 55:       end

 57:       subroutine mymatmulthermitiantransposeadd(A, x, y, z, ierr)
 58:         use petscmat
 59:         implicit none
 60:         Mat A
 61:         Vec x, y, z
 62:         PetscErrorCode ierr

 64:         print *, 'Called MatMultHermitianTransposeAdd'
 65:       end

 67:       subroutine mymattranspose(A, reuse, B, ierr)
 68:         use petscmat
 69:         implicit none
 70:         Mat A, B
 71:         MatReuse reuse
 72:         PetscErrorCode ierr
 73:         PetscInt i12, i0

 75:         i12 = 12
 76:         i0 = 0
 77:         PetscCallA(MatCreateShell(PETSC_COMM_SELF, i12, i12, i12, i12, i0, B, ierr))
 78:         PetscCallA(MatAssemblyBegin(B, MAT_FINAL_ASSEMBLY, ierr))
 79:         PetscCallA(MatAssemblyEnd(B, MAT_FINAL_ASSEMBLY, ierr))

 81:         print *, 'Called MatTranspose'
 82:       end

 84:       subroutine mymatgetdiagonal(A, x, ierr)
 85:         use petscmat
 86:         implicit none
 87:         Mat A
 88:         Vec x
 89:         PetscErrorCode ierr

 91:         print *, 'Called MatGetDiagonal'
 92:       end

 94:       subroutine mymatdiagonalscale(A, x, y, ierr)
 95:         use petscmat
 96:         implicit none
 97:         Mat A
 98:         Vec x, y
 99:         PetscErrorCode ierr

101:         print *, 'Called MatDiagonalScale'
102:       end

104:       subroutine mymatzeroentries(A, ierr)
105:         use petscmat
106:         implicit none
107:         Mat A
108:         PetscErrorCode ierr

110:         print *, 'Called MatZeroEntries'
111:       end

113:       subroutine mymataxpy(A, alpha, B, str, ierr)
114:         use petscmat
115:         implicit none
116:         Mat A, B
117:         PetscScalar alpha
118:         MatStructure str
119:         PetscErrorCode ierr

121:         print *, 'Called MatAXPY'
122:       end

124:       subroutine mymatshift(A, alpha, ierr)
125:         use petscmat
126:         implicit none
127:         Mat A
128:         PetscScalar alpha
129:         PetscErrorCode ierr

131:         print *, 'Called MatShift'
132:       end

134:       subroutine mymatdiagonalset(A, x, ins, ierr)
135:         use petscmat
136:         implicit none
137:         Mat A
138:         Vec x
139:         InsertMode ins
140:         PetscErrorCode ierr

142:         print *, 'Called MatDiagonalSet'
143:       end

145:       subroutine mymatdestroy(A, ierr)
146:         use petscmat
147:         implicit none
148:         Mat A
149:         PetscErrorCode ierr

151:         print *, 'Called MatDestroy'
152:       end

154:       subroutine mymatview(A, viewer, ierr)
155:         use petscmat
156:         implicit none
157:         Mat A
158:         PetscViewer viewer
159:         PetscErrorCode ierr

161:         print *, 'Called MatView'
162:       end

164:       subroutine mymatgetvecs(A, x, y, ierr)
165:         use petscmat
166:         implicit none
167:         Mat A
168:         Vec x, y
169:         PetscErrorCode ierr

171:         print *, 'Called MatCreateVecs'
172:       end

174:       program main
175:         use petscmat
176:         implicit none

178:         Mat m, mt
179:         Vec x, y, z
180:         PetscScalar a
181:         PetscViewer viewer
182:         MatOperation op
183:         PetscErrorCode ierr
184:         PetscInt i12, i0
185:         external mymatmult
186:         external mymatmultadd
187:         external mymatmulttranspose
188:         external mymatmulthermitiantranspose
189:         external mymatmulttransposeadd
190:         external mymatmulthermitiantransposeadd
191:         external mymattranspose
192:         external mymatgetdiagonal
193:         external mymatdiagonalscale
194:         external mymatzeroentries
195:         external mymataxpy
196:         external mymatshift
197:         external mymatdiagonalset
198:         external mymatdestroy
199:         external mymatview
200:         external mymatgetvecs

202:         PetscCallA(PetscInitialize(ierr))

204:         viewer = PETSC_VIEWER_STDOUT_SELF
205:         i12 = 12
206:         i0 = 0
207:         PetscCallA(VecCreateSeq(PETSC_COMM_SELF, i12, x, ierr))
208:         PetscCallA(VecCreateSeq(PETSC_COMM_SELF, i12, y, ierr))
209:         PetscCallA(VecCreateSeq(PETSC_COMM_SELF, i12, z, ierr))
210:         PetscCallA(MatCreateShell(PETSC_COMM_SELF, i12, i12, i12, i12, i0, m, ierr))
211:         PetscCallA(MatShellSetManageScalingShifts(m, ierr))
212:         PetscCallA(MatAssemblyBegin(m, MAT_FINAL_ASSEMBLY, ierr))
213:         PetscCallA(MatAssemblyEnd(m, MAT_FINAL_ASSEMBLY, ierr))

215:         op = MATOP_MULT
216:         PetscCallA(MatShellSetOperation(m, op, mymatmult, ierr))
217:         op = MATOP_MULT_ADD
218:         PetscCallA(MatShellSetOperation(m, op, mymatmultadd, ierr))
219:         op = MATOP_MULT_TRANSPOSE
220:         PetscCallA(MatShellSetOperation(m, op, mymatmulttranspose, ierr))
221:         op = MATOP_MULT_HERMITIAN_TRANSPOSE
222:         PetscCallA(MatShellSetOperation(m, op, mymatmulthermitiantranspose, ierr))
223:         op = MATOP_MULT_TRANSPOSE_ADD
224:         PetscCallA(MatShellSetOperation(m, op, mymatmulttransposeadd, ierr))
225:         op = MATOP_MULT_HERMITIAN_TRANS_ADD
226:         PetscCallA(MatShellSetOperation(m, op, mymatmulthermitiantransposeadd, ierr))
227:         op = MATOP_TRANSPOSE
228:         PetscCallA(MatShellSetOperation(m, op, mymattranspose, ierr))
229:         op = MATOP_GET_DIAGONAL
230:         PetscCallA(MatShellSetOperation(m, op, mymatgetdiagonal, ierr))
231:         op = MATOP_DIAGONAL_SCALE
232:         PetscCallA(MatShellSetOperation(m, op, mymatdiagonalscale, ierr))
233:         op = MATOP_ZERO_ENTRIES
234:         PetscCallA(MatShellSetOperation(m, op, mymatzeroentries, ierr))
235:         op = MATOP_AXPY
236:         PetscCallA(MatShellSetOperation(m, op, mymataxpy, ierr))
237:         op = MATOP_SHIFT
238:         PetscCallA(MatShellSetOperation(m, op, mymatshift, ierr))
239:         op = MATOP_DIAGONAL_SET
240:         PetscCallA(MatShellSetOperation(m, op, mymatdiagonalset, ierr))
241:         op = MATOP_DESTROY
242:         PetscCallA(MatShellSetOperation(m, op, mymatdestroy, ierr))
243:         op = MATOP_VIEW
244:         PetscCallA(MatShellSetOperation(m, op, mymatview, ierr))
245:         op = MATOP_CREATE_VECS
246:         PetscCallA(MatShellSetOperation(m, op, mymatgetvecs, ierr))

248:         PetscCallA(MatMult(m, x, y, ierr))
249:         PetscCallA(MatMultAdd(m, x, y, z, ierr))
250:         PetscCallA(MatMultTranspose(m, x, y, ierr))
251:         PetscCallA(MatMultHermitianTranspose(m, x, y, ierr))
252:         PetscCallA(MatMultTransposeAdd(m, x, y, z, ierr))
253:         PetscCallA(MatMultHermitianTransposeAdd(m, x, y, z, ierr))
254:         PetscCallA(MatTranspose(m, MAT_INITIAL_MATRIX, mt, ierr))
255:         PetscCallA(MatGetDiagonal(m, x, ierr))
256:         PetscCallA(MatDiagonalScale(m, x, y, ierr))
257:         PetscCallA(MatZeroEntries(m, ierr))
258:         a = 102.
259:         PetscCallA(MatAXPY(m, a, mt, SAME_NONZERO_PATTERN, ierr))
260:         PetscCallA(MatShift(m, a, ierr))
261:         PetscCallA(MatDiagonalSet(m, x, INSERT_VALUES, ierr))
262:         PetscCallA(MatView(m, viewer, ierr))
263:         PetscCallA(MatCreateVecs(m, x, y, ierr))
264:         PetscCallA(MatDestroy(m, ierr))
265:         PetscCallA(MatDestroy(mt, ierr))
266:         PetscCallA(VecDestroy(x, ierr))
267:         PetscCallA(VecDestroy(y, ierr))
268:         PetscCallA(VecDestroy(z, ierr))

270:         PetscCallA(PetscFinalize(ierr))
271:       end

273: !/*TEST
274: !
275: !   testset:
276: !     args: -malloc_dump
277: !     filter: sort -b
278: !     filter_output: sort -b
279: !     test:
280: !       suffix: 1
281: !       requires: !complex
282: !     test:
283: !       suffix: 2
284: !       requires: complex
285: !
286: !TEST*/