Actual source code: ex201f.F90

  1: !
  2: !
  3: !   This program demonstrates use of MatShellSetOperation()
  4: !
  5: #include <petsc/finclude/petscmat.h>
  6: module ex201fmodule
  7:   use petscmat
  8:   implicit none

 10: contains
 11:   subroutine mymatmult(A, x, y, ierr)
 12:     Mat A
 13:     Vec x, y
 14:     PetscErrorCode ierr

 16:     print *, 'Called MatMult'
 17:   end

 19:   subroutine mymatmultadd(A, x, y, z, ierr)
 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:     Mat A
 29:     Vec x, y
 30:     PetscErrorCode ierr

 32:     print *, 'Called MatMultTranspose'
 33:   end

 35:   subroutine mymatmulthermitiantranspose(A, x, y, ierr)
 36:     Mat A
 37:     Vec x, y
 38:     PetscErrorCode ierr

 40:     print *, 'Called MatMultHermitianTranspose'
 41:   end

 43:   subroutine mymatmulttransposeadd(A, x, y, z, ierr)
 44:     Mat A
 45:     Vec x, y, z
 46:     PetscErrorCode ierr

 48:     print *, 'Called MatMultTransposeAdd'
 49:   end

 51:   subroutine mymatmulthermitiantransposeadd(A, x, y, z, ierr)
 52:     Mat A
 53:     Vec x, y, z
 54:     PetscErrorCode ierr

 56:     print *, 'Called MatMultHermitianTransposeAdd'
 57:   end

 59:   subroutine mymattranspose(A, reuse, B, ierr)
 60:     Mat A, B
 61:     MatReuse reuse
 62:     PetscErrorCode ierr
 63:     PetscInt i12, i0

 65:     i12 = 12
 66:     i0 = 0
 67:     PetscCallA(MatCreateShell(PETSC_COMM_SELF, i12, i12, i12, i12, i0, B, ierr))
 68:     PetscCallA(MatAssemblyBegin(B, MAT_FINAL_ASSEMBLY, ierr))
 69:     PetscCallA(MatAssemblyEnd(B, MAT_FINAL_ASSEMBLY, ierr))

 71:     print *, 'Called MatTranspose'
 72:   end

 74:   subroutine mymatgetdiagonal(A, x, ierr)
 75:     Mat A
 76:     Vec x
 77:     PetscErrorCode ierr

 79:     print *, 'Called MatGetDiagonal'
 80:   end

 82:   subroutine mymatdiagonalscale(A, x, y, ierr)
 83:     Mat A
 84:     Vec x, y
 85:     PetscErrorCode ierr

 87:     print *, 'Called MatDiagonalScale'
 88:   end

 90:   subroutine mymatzeroentries(A, ierr)
 91:     Mat A
 92:     PetscErrorCode ierr

 94:     print *, 'Called MatZeroEntries'
 95:   end

 97:   subroutine mymataxpy(A, alpha, B, str, ierr)
 98:     Mat A, B
 99:     PetscScalar alpha
100:     MatStructure str
101:     PetscErrorCode ierr

103:     print *, 'Called MatAXPY'
104:   end

106:   subroutine mymatshift(A, alpha, ierr)
107:     Mat A
108:     PetscScalar alpha
109:     PetscErrorCode ierr

111:     print *, 'Called MatShift'
112:   end

114:   subroutine mymatdiagonalset(A, x, ins, ierr)
115:     Mat A
116:     Vec x
117:     InsertMode ins
118:     PetscErrorCode ierr

120:     print *, 'Called MatDiagonalSet'
121:   end

123:   subroutine mymatdestroy(A, ierr)
124:     Mat A
125:     PetscErrorCode ierr

127:     print *, 'Called MatDestroy'
128:   end

130:   subroutine mymatview(A, viewer, ierr)
131:     Mat A
132:     PetscViewer viewer
133:     PetscErrorCode ierr

135:     print *, 'Called MatView'
136:   end

138:   subroutine mymatgetvecs(A, x, y, ierr)
139:     Mat A
140:     Vec x, y
141:     PetscErrorCode ierr

143:     print *, 'Called MatCreateVecs'
144:   end

146: end module ex201fmodule

148: program main
149:   use petscmat
150:   use ex201fmodule
151:   implicit none

153:   Mat m, mt
154:   Vec x, y, z
155:   PetscScalar a
156:   PetscViewer viewer
157:   MatOperation op
158:   PetscErrorCode ierr
159:   PetscInt i12, i0

161:   PetscCallA(PetscInitialize(ierr))

163:   viewer = PETSC_VIEWER_STDOUT_SELF
164:   i12 = 12
165:   i0 = 0
166:   PetscCallA(VecCreateSeq(PETSC_COMM_SELF, i12, x, ierr))
167:   PetscCallA(VecCreateSeq(PETSC_COMM_SELF, i12, y, ierr))
168:   PetscCallA(VecCreateSeq(PETSC_COMM_SELF, i12, z, ierr))
169:   PetscCallA(MatCreateShell(PETSC_COMM_SELF, i12, i12, i12, i12, i0, m, ierr))
170:   PetscCallA(MatShellSetManageScalingShifts(m, ierr))
171:   PetscCallA(MatAssemblyBegin(m, MAT_FINAL_ASSEMBLY, ierr))
172:   PetscCallA(MatAssemblyEnd(m, MAT_FINAL_ASSEMBLY, ierr))

174:   op = MATOP_MULT
175:   PetscCallA(MatShellSetOperation(m, op, mymatmult, ierr))
176:   op = MATOP_MULT_ADD
177:   PetscCallA(MatShellSetOperation(m, op, mymatmultadd, ierr))
178:   op = MATOP_MULT_TRANSPOSE
179:   PetscCallA(MatShellSetOperation(m, op, mymatmulttranspose, ierr))
180:   op = MATOP_MULT_HERMITIAN_TRANSPOSE
181:   PetscCallA(MatShellSetOperation(m, op, mymatmulthermitiantranspose, ierr))
182:   op = MATOP_MULT_TRANSPOSE_ADD
183:   PetscCallA(MatShellSetOperation(m, op, mymatmulttransposeadd, ierr))
184:   op = MATOP_MULT_HERMITIAN_TRANS_ADD
185:   PetscCallA(MatShellSetOperation(m, op, mymatmulthermitiantransposeadd, ierr))
186:   op = MATOP_TRANSPOSE
187:   PetscCallA(MatShellSetOperation(m, op, mymattranspose, ierr))
188:   op = MATOP_GET_DIAGONAL
189:   PetscCallA(MatShellSetOperation(m, op, mymatgetdiagonal, ierr))
190:   op = MATOP_DIAGONAL_SCALE
191:   PetscCallA(MatShellSetOperation(m, op, mymatdiagonalscale, ierr))
192:   op = MATOP_ZERO_ENTRIES
193:   PetscCallA(MatShellSetOperation(m, op, mymatzeroentries, ierr))
194:   op = MATOP_AXPY
195:   PetscCallA(MatShellSetOperation(m, op, mymataxpy, ierr))
196:   op = MATOP_SHIFT
197:   PetscCallA(MatShellSetOperation(m, op, mymatshift, ierr))
198:   op = MATOP_DIAGONAL_SET
199:   PetscCallA(MatShellSetOperation(m, op, mymatdiagonalset, ierr))
200:   op = MATOP_DESTROY
201:   PetscCallA(MatShellSetOperation(m, op, mymatdestroy, ierr))
202:   op = MATOP_VIEW
203:   PetscCallA(MatShellSetOperation(m, op, mymatview, ierr))
204:   op = MATOP_CREATE_VECS
205:   PetscCallA(MatShellSetOperation(m, op, mymatgetvecs, ierr))

207:   PetscCallA(MatMult(m, x, y, ierr))
208:   PetscCallA(MatMultAdd(m, x, y, z, ierr))
209:   PetscCallA(MatMultTranspose(m, x, y, ierr))
210:   PetscCallA(MatMultHermitianTranspose(m, x, y, ierr))
211:   PetscCallA(MatMultTransposeAdd(m, x, y, z, ierr))
212:   PetscCallA(MatMultHermitianTransposeAdd(m, x, y, z, ierr))
213:   PetscCallA(MatTranspose(m, MAT_INITIAL_MATRIX, mt, ierr))
214:   PetscCallA(MatGetDiagonal(m, x, ierr))
215:   PetscCallA(MatDiagonalScale(m, x, y, ierr))
216:   PetscCallA(MatZeroEntries(m, ierr))
217:   a = 102.
218:   PetscCallA(MatAXPY(m, a, mt, SAME_NONZERO_PATTERN, ierr))
219:   PetscCallA(MatShift(m, a, ierr))
220:   PetscCallA(MatDiagonalSet(m, x, INSERT_VALUES, ierr))
221:   PetscCallA(MatView(m, viewer, ierr))
222:   PetscCallA(MatCreateVecs(m, x, y, ierr))
223:   PetscCallA(MatDestroy(m, ierr))
224:   PetscCallA(MatDestroy(mt, ierr))
225:   PetscCallA(VecDestroy(x, ierr))
226:   PetscCallA(VecDestroy(y, ierr))
227:   PetscCallA(VecDestroy(z, ierr))

229:   PetscCallA(PetscFinalize(ierr))
230: end

232: !/*TEST
233: !
234: !   testset:
235: !     args: -malloc_dump
236: !     filter: sort -b
237: !     filter_output: sort -b
238: !     test:
239: !       suffix: 1
240: !       requires: !complex
241: !     test:
242: !       suffix: 2
243: !       requires: complex
244: !
245: !TEST*/