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