1! 2! Fortran kernel for gemv() BLAS operation. This version supports 3! matrix array stored in single precision but vectors in double 4! 5#include <petsc/finclude/petscsys.h> 6! 7 subroutine MSGemv(bs,ncols,A,x,y) 8 implicit none 9 PetscInt bs,ncols 10 MatScalar A(bs,ncols) 11 PetscScalar x(ncols),y(bs) 12 13 PetscInt i,j 14 15 do 5, j=1,bs 16 y(j) = 0.0d0 17 5 continue 18 19 do 10, i=1,ncols 20 do 20, j=1,bs 21 y(j) = y(j) + A(j,i)*x(i) 22 20 continue 23 10 continue 24 25 return 26 end 27 28 subroutine MSGemvp(bs,ncols,A,x,y) 29 implicit none 30 PetscInt bs,ncols 31 MatScalar A(bs,ncols) 32 PetscScalar x(ncols),y(bs) 33 34 PetscInt i, j 35 36 do 10, i=1,ncols 37 do 20, j=1,bs 38 y(j) = y(j) + A(j,i)*x(i) 39 20 continue 40 10 continue 41 42 return 43 end 44 45 subroutine MSGemvm(bs,ncols,A,x,y) 46 implicit none 47 PetscInt bs,ncols 48 MatScalar A(bs,ncols) 49 PetscScalar x(ncols),y(bs) 50 51 PetscInt i, j 52 53 do 10, i=1,ncols 54 do 20, j=1,bs 55 y(j) = y(j) - A(j,i)*x(i) 56 20 continue 57 10 continue 58 59 return 60 end 61 62 subroutine MSGemvt(bs,ncols,A,x,y) 63 implicit none 64 PetscInt bs,ncols 65 MatScalar A(bs,ncols) 66 PetscScalar x(bs),y(ncols) 67 68 PetscInt i,j 69 PetscScalar sum 70 do 10, i=1,ncols 71 sum = y(i) 72 do 20, j=1,bs 73 sum = sum + A(j,i)*x(j) 74 20 continue 75 y(i) = sum 76 10 continue 77 78 return 79 end 80 81 subroutine MSGemm(bs,A,B,C) 82 implicit none 83 PetscInt bs 84 MatScalar A(bs,bs),B(bs,bs),C(bs,bs) 85 PetscScalar sum 86 PetscInt i,j,k 87 88 do 10, i=1,bs 89 do 20, j=1,bs 90 sum = A(i,j) 91 do 30, k=1,bs 92 sum = sum - B(i,k)*C(k,j) 93 30 continue 94 A(i,j) = sum 95 20 continue 96 10 continue 97 98 return 99 end 100 101 subroutine MSGemmi(bs,A,C,B) 102 implicit none 103 PetscInt bs 104 MatScalar A(bs,bs),B(bs,bs),C(bs,bs) 105 PetscScalar sum 106 107 PetscInt i,j,k 108 109 do 10, i=1,bs 110 do 20, j=1,bs 111 sum = 0.0d0 112 do 30, k=1,bs 113 sum = sum + B(i,k)*C(k,j) 114 30 continue 115 A(i,j) = sum 116 20 continue 117 10 continue 118 119 return 120 end 121