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 14dcb3e689SBarry 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 25dcb3e689SBarry 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 36dcb3e689SBarry Smith print*, 'Called MatMultTranspose' 37d8606c27SBarry Smith return 38d8606c27SBarry Smith end 39d8606c27SBarry Smith 40*f8e07d23SBlanca Mellado Pinto subroutine mymatmulthermitiantranspose(A, x, y, ierr) 41*f8e07d23SBlanca Mellado Pinto use petscmat 42*f8e07d23SBlanca Mellado Pinto implicit none 43*f8e07d23SBlanca Mellado Pinto Mat A 44*f8e07d23SBlanca Mellado Pinto Vec x, y 45*f8e07d23SBlanca Mellado Pinto PetscErrorCode ierr 46*f8e07d23SBlanca Mellado Pinto 47*f8e07d23SBlanca Mellado Pinto print*, 'Called MatMultHermitianTranspose' 48*f8e07d23SBlanca Mellado Pinto return 49*f8e07d23SBlanca Mellado Pinto end 50*f8e07d23SBlanca Mellado Pinto 51d8606c27SBarry Smith subroutine mymatmulttransposeadd(A, x, y, z, ierr) 52d8606c27SBarry Smith use petscmat 53d8606c27SBarry Smith implicit none 54d8606c27SBarry Smith Mat A 55d8606c27SBarry Smith Vec x, y, z 56d8606c27SBarry Smith PetscErrorCode ierr 57d8606c27SBarry Smith 58dcb3e689SBarry Smith print*, 'Called MatMultTransposeAdd' 59d8606c27SBarry Smith return 60d8606c27SBarry Smith end 61d8606c27SBarry Smith 62*f8e07d23SBlanca Mellado Pinto subroutine mymatmulthermitiantransposeadd(A, x, y, z, ierr) 63*f8e07d23SBlanca Mellado Pinto use petscmat 64*f8e07d23SBlanca Mellado Pinto implicit none 65*f8e07d23SBlanca Mellado Pinto Mat A 66*f8e07d23SBlanca Mellado Pinto Vec x, y, z 67*f8e07d23SBlanca Mellado Pinto PetscErrorCode ierr 68*f8e07d23SBlanca Mellado Pinto 69*f8e07d23SBlanca Mellado Pinto print*, 'Called MatMultHermitianTransposeAdd' 70*f8e07d23SBlanca Mellado Pinto return 71*f8e07d23SBlanca Mellado Pinto end 72*f8e07d23SBlanca Mellado Pinto 73d8606c27SBarry Smith subroutine mymattranspose(A, reuse, B, ierr) 74d8606c27SBarry Smith use petscmat 75d8606c27SBarry Smith implicit none 76d8606c27SBarry Smith Mat A, B 77d8606c27SBarry Smith MatReuse reuse 78d8606c27SBarry Smith PetscErrorCode ierr 79d8606c27SBarry Smith PetscInt i12,i0 80d8606c27SBarry Smith 81d8606c27SBarry Smith i12 = 12 82d8606c27SBarry Smith i0 = 0 83d8606c27SBarry Smith PetscCallA(MatCreateShell(PETSC_COMM_SELF,i12,i12,i12,i12,i0,B,ierr)) 84d8606c27SBarry Smith PetscCallA(MatAssemblyBegin(B, MAT_FINAL_ASSEMBLY, ierr)) 85d8606c27SBarry Smith PetscCallA(MatAssemblyEnd(B, MAT_FINAL_ASSEMBLY, ierr)) 86d8606c27SBarry Smith 87dcb3e689SBarry Smith print*, 'Called MatTranspose' 88d8606c27SBarry Smith return 89d8606c27SBarry Smith end 90d8606c27SBarry Smith 91d8606c27SBarry Smith subroutine mymatgetdiagonal(A, x, ierr) 92d8606c27SBarry Smith use petscmat 93d8606c27SBarry Smith implicit none 94d8606c27SBarry Smith Mat A 95d8606c27SBarry Smith Vec x 96d8606c27SBarry Smith PetscErrorCode ierr 97d8606c27SBarry Smith 98dcb3e689SBarry Smith print*, 'Called MatGetDiagonal' 99d8606c27SBarry Smith return 100d8606c27SBarry Smith end 101d8606c27SBarry Smith 102d8606c27SBarry Smith subroutine mymatdiagonalscale(A, x, y, ierr) 103d8606c27SBarry Smith use petscmat 104d8606c27SBarry Smith implicit none 105d8606c27SBarry Smith Mat A 106d8606c27SBarry Smith Vec x, y 107d8606c27SBarry Smith PetscErrorCode ierr 108d8606c27SBarry Smith 109dcb3e689SBarry Smith print*, 'Called MatDiagonalScale' 110d8606c27SBarry Smith return 111d8606c27SBarry Smith end 112d8606c27SBarry Smith 113d8606c27SBarry Smith subroutine mymatzeroentries(A, ierr) 114d8606c27SBarry Smith use petscmat 115d8606c27SBarry Smith implicit none 116d8606c27SBarry Smith Mat A 117d8606c27SBarry Smith PetscErrorCode ierr 118d8606c27SBarry Smith 119dcb3e689SBarry Smith print*, 'Called MatZeroEntries' 120d8606c27SBarry Smith return 121d8606c27SBarry Smith end 122d8606c27SBarry Smith 123d8606c27SBarry Smith subroutine mymataxpy(A, alpha, B, str, ierr) 124d8606c27SBarry Smith use petscmat 125d8606c27SBarry Smith implicit none 126d8606c27SBarry Smith Mat A, B 127d8606c27SBarry Smith PetscScalar alpha 128d8606c27SBarry Smith MatStructure str 129d8606c27SBarry Smith PetscErrorCode ierr 130d8606c27SBarry Smith 131dcb3e689SBarry Smith print*, 'Called MatAXPY' 132d8606c27SBarry Smith return 133d8606c27SBarry Smith end 134d8606c27SBarry Smith 135d8606c27SBarry Smith subroutine mymatshift(A, alpha, ierr) 136d8606c27SBarry Smith use petscmat 137d8606c27SBarry Smith implicit none 138d8606c27SBarry Smith Mat A 139d8606c27SBarry Smith PetscScalar alpha 140d8606c27SBarry Smith PetscErrorCode ierr 141d8606c27SBarry Smith 142dcb3e689SBarry Smith print*, 'Called MatShift' 143d8606c27SBarry Smith return 144d8606c27SBarry Smith end 145d8606c27SBarry Smith 146d8606c27SBarry Smith subroutine mymatdiagonalset(A, x, ins, ierr) 147d8606c27SBarry Smith use petscmat 148d8606c27SBarry Smith implicit none 149d8606c27SBarry Smith Mat A 150d8606c27SBarry Smith Vec x 151d8606c27SBarry Smith InsertMode ins 152d8606c27SBarry Smith PetscErrorCode ierr 153d8606c27SBarry Smith 154dcb3e689SBarry Smith print*, 'Called MatDiagonalSet' 155d8606c27SBarry Smith return 156d8606c27SBarry Smith end 157d8606c27SBarry Smith 158d8606c27SBarry Smith subroutine mymatdestroy(A, ierr) 159d8606c27SBarry Smith use petscmat 160d8606c27SBarry Smith implicit none 161d8606c27SBarry Smith Mat A 162d8606c27SBarry Smith PetscErrorCode ierr 163d8606c27SBarry Smith 164dcb3e689SBarry Smith print*, 'Called MatDestroy' 165d8606c27SBarry Smith return 166d8606c27SBarry Smith end 167d8606c27SBarry Smith 168d8606c27SBarry Smith subroutine mymatview(A, viewer, ierr) 169d8606c27SBarry Smith use petscmat 170d8606c27SBarry Smith implicit none 171d8606c27SBarry Smith Mat A 172d8606c27SBarry Smith PetscViewer viewer 173d8606c27SBarry Smith PetscErrorCode ierr 174d8606c27SBarry Smith 175dcb3e689SBarry Smith print*, 'Called MatView' 176d8606c27SBarry Smith return 177d8606c27SBarry Smith end 178d8606c27SBarry Smith 179d8606c27SBarry Smith subroutine mymatgetvecs(A, x, y, ierr) 180d8606c27SBarry Smith use petscmat 181d8606c27SBarry Smith implicit none 182d8606c27SBarry Smith Mat A 183d8606c27SBarry Smith Vec x, y 184d8606c27SBarry Smith PetscErrorCode ierr 185d8606c27SBarry Smith 186dcb3e689SBarry Smith print*, 'Called MatCreateVecs' 187d8606c27SBarry Smith return 188d8606c27SBarry Smith end 189d8606c27SBarry Smith 190d8606c27SBarry Smith program main 191d8606c27SBarry Smith use petscmat 192d8606c27SBarry Smith implicit none 193d8606c27SBarry Smith 194d8606c27SBarry Smith Mat m, mt 195d8606c27SBarry Smith Vec x, y, z 196d8606c27SBarry Smith PetscScalar a 197d8606c27SBarry Smith PetscViewer viewer 198d8606c27SBarry Smith MatOperation op 199d8606c27SBarry Smith PetscErrorCode ierr 200d8606c27SBarry Smith PetscInt i12,i0 201d8606c27SBarry Smith external mymatmult 202d8606c27SBarry Smith external mymatmultadd 203d8606c27SBarry Smith external mymatmulttranspose 204*f8e07d23SBlanca Mellado Pinto external mymatmulthermitiantranspose 205d8606c27SBarry Smith external mymatmulttransposeadd 206*f8e07d23SBlanca Mellado Pinto external mymatmulthermitiantransposeadd 207d8606c27SBarry Smith external mymattranspose 208d8606c27SBarry Smith external mymatgetdiagonal 209d8606c27SBarry Smith external mymatdiagonalscale 210d8606c27SBarry Smith external mymatzeroentries 211d8606c27SBarry Smith external mymataxpy 212d8606c27SBarry Smith external mymatshift 213d8606c27SBarry Smith external mymatdiagonalset 214d8606c27SBarry Smith external mymatdestroy 215d8606c27SBarry Smith external mymatview 216d8606c27SBarry Smith external mymatgetvecs 217d8606c27SBarry Smith 218d8606c27SBarry Smith PetscCallA(PetscInitialize(ierr)) 219d8606c27SBarry Smith 220d8606c27SBarry Smith viewer = PETSC_VIEWER_STDOUT_SELF 221d8606c27SBarry Smith i12 = 12 222d8606c27SBarry Smith i0 = 0 223d8606c27SBarry Smith PetscCallA(VecCreateSeq(PETSC_COMM_SELF, i12, x, ierr)) 224d8606c27SBarry Smith PetscCallA(VecCreateSeq(PETSC_COMM_SELF, i12, y, ierr)) 225d8606c27SBarry Smith PetscCallA(VecCreateSeq(PETSC_COMM_SELF, i12, z, ierr)) 226d8606c27SBarry Smith PetscCallA(MatCreateShell(PETSC_COMM_SELF,i12,i12,i12,i12,i0,m,ierr)) 227d8606c27SBarry Smith PetscCallA(MatShellSetManageScalingShifts(m,ierr)) 228d8606c27SBarry Smith PetscCallA(MatAssemblyBegin(m, MAT_FINAL_ASSEMBLY, ierr)) 229d8606c27SBarry Smith PetscCallA(MatAssemblyEnd(m, MAT_FINAL_ASSEMBLY, ierr)) 230d8606c27SBarry Smith 231d8606c27SBarry Smith op = MATOP_MULT 232d8606c27SBarry Smith PetscCallA(MatShellSetOperation(m, op, mymatmult, ierr)) 233d8606c27SBarry Smith op = MATOP_MULT_ADD 234d8606c27SBarry Smith PetscCallA(MatShellSetOperation(m, op, mymatmultadd, ierr)) 235d8606c27SBarry Smith op = MATOP_MULT_TRANSPOSE 236d8606c27SBarry Smith PetscCallA(MatShellSetOperation(m, op, mymatmulttranspose, ierr)) 237*f8e07d23SBlanca Mellado Pinto op = MATOP_MULT_HERMITIAN_TRANSPOSE 238*f8e07d23SBlanca Mellado Pinto PetscCallA(MatShellSetOperation(m, op, mymatmulthermitiantranspose, ierr)) 239d8606c27SBarry Smith op = MATOP_MULT_TRANSPOSE_ADD 240d8606c27SBarry Smith PetscCallA(MatShellSetOperation(m, op, mymatmulttransposeadd, ierr)) 241*f8e07d23SBlanca Mellado Pinto op = MATOP_MULT_HERMITIAN_TRANS_ADD 242*f8e07d23SBlanca Mellado Pinto PetscCallA(MatShellSetOperation(m, op, mymatmulthermitiantransposeadd, ierr)) 243d8606c27SBarry Smith op = MATOP_TRANSPOSE 244d8606c27SBarry Smith PetscCallA(MatShellSetOperation(m, op, mymattranspose, ierr)) 245d8606c27SBarry Smith op = MATOP_GET_DIAGONAL 246d8606c27SBarry Smith PetscCallA(MatShellSetOperation(m, op, mymatgetdiagonal, ierr)) 247d8606c27SBarry Smith op = MATOP_DIAGONAL_SCALE 248d8606c27SBarry Smith PetscCallA(MatShellSetOperation(m, op, mymatdiagonalscale, ierr)) 249d8606c27SBarry Smith op = MATOP_ZERO_ENTRIES 250d8606c27SBarry Smith PetscCallA(MatShellSetOperation(m, op, mymatzeroentries, ierr)) 251d8606c27SBarry Smith op = MATOP_AXPY 252d8606c27SBarry Smith PetscCallA(MatShellSetOperation(m, op, mymataxpy, ierr)) 253d8606c27SBarry Smith op = MATOP_SHIFT 254d8606c27SBarry Smith PetscCallA(MatShellSetOperation(m, op, mymatshift, ierr)) 255d8606c27SBarry Smith op = MATOP_DIAGONAL_SET 256d8606c27SBarry Smith PetscCallA(MatShellSetOperation(m, op, mymatdiagonalset, ierr)) 257d8606c27SBarry Smith op = MATOP_DESTROY 258d8606c27SBarry Smith PetscCallA(MatShellSetOperation(m, op, mymatdestroy, ierr)) 259d8606c27SBarry Smith op = MATOP_VIEW 260d8606c27SBarry Smith PetscCallA(MatShellSetOperation(m, op, mymatview, ierr)) 261d8606c27SBarry Smith op = MATOP_CREATE_VECS 262d8606c27SBarry Smith PetscCallA(MatShellSetOperation(m, op, mymatgetvecs, ierr)) 263d8606c27SBarry Smith 264d8606c27SBarry Smith PetscCallA(MatMult(m, x, y, ierr)) 265d8606c27SBarry Smith PetscCallA(MatMultAdd(m, x, y, z, ierr)) 266d8606c27SBarry Smith PetscCallA(MatMultTranspose(m, x, y, ierr)) 267*f8e07d23SBlanca Mellado Pinto PetscCallA(MatMultHermitianTranspose(m, x, y, ierr)) 268d8606c27SBarry Smith PetscCallA(MatMultTransposeAdd(m, x, y, z, ierr)) 269*f8e07d23SBlanca Mellado Pinto PetscCallA(MatMultHermitianTransposeAdd(m, x, y, z, ierr)) 270d8606c27SBarry Smith PetscCallA(MatTranspose(m, MAT_INITIAL_MATRIX, mt, ierr)) 271d8606c27SBarry Smith PetscCallA(MatGetDiagonal(m, x, ierr)) 272d8606c27SBarry Smith PetscCallA(MatDiagonalScale(m, x, y, ierr)) 273d8606c27SBarry Smith PetscCallA(MatZeroEntries(m, ierr)) 274d8606c27SBarry Smith a = 102. 275d8606c27SBarry Smith PetscCallA(MatAXPY(m, a, mt, SAME_NONZERO_PATTERN, ierr)) 276d8606c27SBarry Smith PetscCallA(MatShift(m, a, ierr)) 277d8606c27SBarry Smith PetscCallA(MatDiagonalSet(m, x, INSERT_VALUES, ierr)) 278d8606c27SBarry Smith PetscCallA(MatView(m, viewer, ierr)) 279d8606c27SBarry Smith PetscCallA(MatCreateVecs(m, x, y, ierr)) 280d8606c27SBarry Smith PetscCallA(MatDestroy(m,ierr)) 281d8606c27SBarry Smith PetscCallA(MatDestroy(mt, ierr)) 282d8606c27SBarry Smith PetscCallA(VecDestroy(x, ierr)) 283d8606c27SBarry Smith PetscCallA(VecDestroy(y, ierr)) 284d8606c27SBarry Smith PetscCallA(VecDestroy(z, ierr)) 285d8606c27SBarry Smith 286d8606c27SBarry Smith PetscCallA(PetscFinalize(ierr)) 287d8606c27SBarry Smith end 288d8606c27SBarry Smith 289d8606c27SBarry Smith!/*TEST 290d8606c27SBarry Smith! 291*f8e07d23SBlanca Mellado Pinto! testset: 292d8606c27SBarry Smith! args: -malloc_dump 293d8606c27SBarry Smith! filter: sort -b 294d8606c27SBarry Smith! filter_output: sort -b 295*f8e07d23SBlanca Mellado Pinto! test: 296*f8e07d23SBlanca Mellado Pinto! suffix: 1 297*f8e07d23SBlanca Mellado Pinto! requires: !complex 298*f8e07d23SBlanca Mellado Pinto! test: 299*f8e07d23SBlanca Mellado Pinto! suffix: 2 300*f8e07d23SBlanca Mellado Pinto! requires: complex 301*f8e07d23SBlanca Mellado Pinto! 302d8606c27SBarry Smith! 303d8606c27SBarry Smith!TEST*/ 304