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