xref: /petsc/src/mat/ftn-kernels/sgemv.F90 (revision edb0e59d3c097acd4a4005a4e51d4daa5c739255)
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