1c96caaccSSatish Balay! 2c96caaccSSatish Balay! Fortran kernel for gemv() BLAS operation. This version supports 3c96caaccSSatish Balay! matrix array stored in single precision but vectors in double 4c96caaccSSatish Balay! 5c96caaccSSatish Balay#include <petsc/finclude/petscsys.h> 60113e719SMartin Diehl 70ccf82acSMartin Diehlpure subroutine MSGemv(bs,ncols,A,x,y) 8*fe66ebccSMartin Diehl use, intrinsic :: ISO_C_binding 90ccf82acSMartin Diehl implicit none (type, external) 100ccf82acSMartin Diehl PetscInt, intent(in) :: bs,ncols 110ccf82acSMartin Diehl MatScalar, intent(in) :: A(bs,ncols) 120ccf82acSMartin Diehl PetscScalar, intent(in) :: x(ncols) 130ccf82acSMartin Diehl PetscScalar, intent(out) :: y(bs) 14c96caaccSSatish Balay 15d66e387eSMartin Diehl PetscInt :: i 16c96caaccSSatish Balay 17ff45ff59SMartin Diehl y(1:bs) = 0.0 180113e719SMartin Diehl do i=1,ncols 19d66e387eSMartin Diehl y(1:bs) = y(1:bs) + A(1:bs,i)*x(i) 200113e719SMartin Diehl end do 210113e719SMartin Diehlend subroutine MSGemv 22c96caaccSSatish Balay 230ccf82acSMartin Diehlpure subroutine MSGemvp(bs,ncols,A,x,y) 24*fe66ebccSMartin Diehl use, intrinsic :: ISO_C_binding 250ccf82acSMartin Diehl implicit none (type, external) 260ccf82acSMartin Diehl PetscInt, intent(in) :: bs,ncols 270ccf82acSMartin Diehl MatScalar, intent(in) :: A(bs,ncols) 280ccf82acSMartin Diehl PetscScalar, intent(in) :: x(ncols) 290ccf82acSMartin Diehl PetscScalar, intent(inout) :: y(bs) 30c96caaccSSatish Balay 31d66e387eSMartin Diehl PetscInt :: i 32c96caaccSSatish Balay 330113e719SMartin Diehl do i=1,ncols 34d66e387eSMartin Diehl y(1:bs) = y(1:bs) + A(1:bs,i)*x(i) 350113e719SMartin Diehl end do 360113e719SMartin Diehlend subroutine MSGemvp 37c96caaccSSatish Balay 380ccf82acSMartin Diehlpure subroutine MSGemvm(bs,ncols,A,x,y) 39*fe66ebccSMartin Diehl use, intrinsic :: ISO_C_binding 400ccf82acSMartin Diehl implicit none (type, external) 410ccf82acSMartin Diehl PetscInt, intent(in) :: bs,ncols 420ccf82acSMartin Diehl MatScalar, intent(in) :: A(bs,ncols) 430ccf82acSMartin Diehl PetscScalar, intent(in) :: x(ncols) 440ccf82acSMartin Diehl PetscScalar, intent(inout) :: y(bs) 45c96caaccSSatish Balay 46d66e387eSMartin Diehl PetscInt :: i 47c96caaccSSatish Balay 480113e719SMartin Diehl do i=1,ncols 49d66e387eSMartin Diehl y(1:bs) = y(1:bs) - A(1:bs,i)*x(i) 500113e719SMartin Diehl end do 510113e719SMartin Diehlend subroutine MSGemvm 52c96caaccSSatish Balay 530ccf82acSMartin Diehlpure subroutine MSGemvt(bs,ncols,A,x,y) 54*fe66ebccSMartin Diehl use, intrinsic :: ISO_C_binding 550ccf82acSMartin Diehl implicit none (type, external) 560ccf82acSMartin Diehl PetscInt, intent(in) :: bs,ncols 570ccf82acSMartin Diehl MatScalar, intent(in) :: A(bs,ncols) 580ccf82acSMartin Diehl PetscScalar, intent(in) :: x(bs) 590ccf82acSMartin Diehl PetscScalar, intent(inout) :: y(ncols) 60c96caaccSSatish Balay 61d66e387eSMartin Diehl PetscInt :: i 620ccf82acSMartin Diehl 630113e719SMartin Diehl do i=1,ncols 64d66e387eSMartin Diehl y(i) = y(i) + sum(A(1:bs,i)*x(1:bs)) 650113e719SMartin Diehl end do 660113e719SMartin Diehlend subroutine MSGemvt 67c96caaccSSatish Balay 680ccf82acSMartin Diehlpure subroutine MSGemm(bs,A,B,C) 69*fe66ebccSMartin Diehl use, intrinsic :: ISO_C_binding 700ccf82acSMartin Diehl implicit none (type, external) 710ccf82acSMartin Diehl PetscInt, intent(in) :: bs 720ccf82acSMartin Diehl MatScalar, intent(in) :: B(bs,bs),C(bs,bs) 730ccf82acSMartin Diehl MatScalar, intent(inout) :: A(bs,bs) 740ccf82acSMartin Diehl 75d66e387eSMartin Diehl PetscInt :: i,j 76c96caaccSSatish Balay 770113e719SMartin Diehl do i=1,bs 780113e719SMartin Diehl do j=1,bs 79d66e387eSMartin Diehl A(i,j) = A(i,j) - sum(B(i,1:bs)*C(1:bs,j)) 800113e719SMartin Diehl end do 810113e719SMartin Diehl end do 820113e719SMartin Diehlend subroutine MSGemm 83c96caaccSSatish Balay 840ccf82acSMartin Diehlpure subroutine MSGemmi(bs,A,C,B) 85*fe66ebccSMartin Diehl use, intrinsic :: ISO_C_binding 860ccf82acSMartin Diehl implicit none (type, external) 870ccf82acSMartin Diehl PetscInt, intent(in) :: bs 880ccf82acSMartin Diehl MatScalar, intent(in) :: B(bs,bs),C(bs,bs) 890ccf82acSMartin Diehl MatScalar, intent(out) :: A(bs,bs) 90c96caaccSSatish Balay 91d66e387eSMartin Diehl PetscInt :: i,j 92c96caaccSSatish Balay 930113e719SMartin Diehl do i=1,bs 940113e719SMartin Diehl do j=1,bs 95d66e387eSMartin Diehl A(i,j) = sum(B(i,1:bs)*C(1:bs,j)) 960113e719SMartin Diehl end do 970113e719SMartin Diehl end do 980113e719SMartin Diehlend subroutine MSGemmi 99