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