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