1! 2! 3! This program demonstrates use of MatShellSetOperation() 4! 5#include <petsc/finclude/petscmat.h> 6module ex201fmodule 7 use petscmat 8 implicit none 9 10contains 11 subroutine mymatmult(A, x, y, ierr) 12 Mat A 13 Vec x, y 14 PetscErrorCode ierr 15 16 print *, 'Called MatMult' 17 end 18 19 subroutine mymatmultadd(A, x, y, z, ierr) 20 Mat A 21 Vec x, y, z 22 PetscErrorCode ierr 23 24 print *, 'Called MatMultAdd' 25 end 26 27 subroutine mymatmulttranspose(A, x, y, ierr) 28 Mat A 29 Vec x, y 30 PetscErrorCode ierr 31 32 print *, 'Called MatMultTranspose' 33 end 34 35 subroutine mymatmulthermitiantranspose(A, x, y, ierr) 36 Mat A 37 Vec x, y 38 PetscErrorCode ierr 39 40 print *, 'Called MatMultHermitianTranspose' 41 end 42 43 subroutine mymatmulttransposeadd(A, x, y, z, ierr) 44 Mat A 45 Vec x, y, z 46 PetscErrorCode ierr 47 48 print *, 'Called MatMultTransposeAdd' 49 end 50 51 subroutine mymatmulthermitiantransposeadd(A, x, y, z, ierr) 52 Mat A 53 Vec x, y, z 54 PetscErrorCode ierr 55 56 print *, 'Called MatMultHermitianTransposeAdd' 57 end 58 59 subroutine mymattranspose(A, reuse, B, ierr) 60 Mat A, B 61 MatReuse reuse 62 PetscErrorCode ierr 63 PetscInt i12, i0 64 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)) 70 71 print *, 'Called MatTranspose' 72 end 73 74 subroutine mymatgetdiagonal(A, x, ierr) 75 Mat A 76 Vec x 77 PetscErrorCode ierr 78 79 print *, 'Called MatGetDiagonal' 80 end 81 82 subroutine mymatdiagonalscale(A, x, y, ierr) 83 Mat A 84 Vec x, y 85 PetscErrorCode ierr 86 87 print *, 'Called MatDiagonalScale' 88 end 89 90 subroutine mymatzeroentries(A, ierr) 91 Mat A 92 PetscErrorCode ierr 93 94 print *, 'Called MatZeroEntries' 95 end 96 97 subroutine mymataxpy(A, alpha, B, str, ierr) 98 Mat A, B 99 PetscScalar alpha 100 MatStructure str 101 PetscErrorCode ierr 102 103 print *, 'Called MatAXPY' 104 end 105 106 subroutine mymatshift(A, alpha, ierr) 107 Mat A 108 PetscScalar alpha 109 PetscErrorCode ierr 110 111 print *, 'Called MatShift' 112 end 113 114 subroutine mymatdiagonalset(A, x, ins, ierr) 115 Mat A 116 Vec x 117 InsertMode ins 118 PetscErrorCode ierr 119 120 print *, 'Called MatDiagonalSet' 121 end 122 123 subroutine mymatdestroy(A, ierr) 124 Mat A 125 PetscErrorCode ierr 126 127 print *, 'Called MatDestroy' 128 end 129 130 subroutine mymatview(A, viewer, ierr) 131 Mat A 132 PetscViewer viewer 133 PetscErrorCode ierr 134 135 print *, 'Called MatView' 136 end 137 138 subroutine mymatgetvecs(A, x, y, ierr) 139 Mat A 140 Vec x, y 141 PetscErrorCode ierr 142 143 print *, 'Called MatCreateVecs' 144 end 145 146end module ex201fmodule 147 148program main 149 use petscmat 150 use ex201fmodule 151 implicit none 152 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 160 161 PetscCallA(PetscInitialize(ierr)) 162 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)) 173 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)) 206 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)) 228 229 PetscCallA(PetscFinalize(ierr)) 230end 231 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*/ 246