xref: /petsc/src/vec/vec/impls/seq/ftn-kernels/fmaxpy.F90 (revision c3871b17014c46196ba3ff79cb8a17fe47b2df8c)
1!
2!
3!    Fortran kernel for the MAXPY() vector routine
4!
5#include <petsc/finclude/petscsys.h>
6!
7
8pure subroutine FortranMAXPY4(x, a0, a1, a2, a3, y0, y1, y2, y3, n)
9  use, intrinsic :: ISO_C_binding
10  implicit none(type, external)
11  PetscScalar, intent(in) ::  a0, a1, a2, a3
12  PetscScalar, intent(inout) :: x(*)
13  PetscScalar, intent(in) :: y0(*), y1(*), y2(*), y3(*)
14  PetscInt, intent(in) :: n
15
16  PETSC_AssertAlignx(16, x(1))
17  PETSC_AssertAlignx(16, y0(1))
18  PETSC_AssertAlignx(16, y1(1))
19  PETSC_AssertAlignx(16, y2(1))
20  PETSC_AssertAlignx(16, y3(1))
21
22  x(1:n) = x(1:n) + (a0*y0(1:n) + a1*y1(1:n) + a2*y2(1:n) + a3*y3(1:n))
23end subroutine FortranMAXPY4
24
25pure subroutine FortranMAXPY3(x, a0, a1, a2, y0, y1, y2, n)
26  use, intrinsic :: ISO_C_binding
27  implicit none(type, external)
28  PetscScalar, intent(in) ::  a0, a1, a2
29  PetscScalar, intent(inout) :: x(*)
30  PetscScalar, intent(in) :: y0(*), y1(*), y2(*)
31  PetscInt, intent(in) :: n
32
33  PETSC_AssertAlignx(16, x(1))
34  PETSC_AssertAlignx(16, y0(1))
35  PETSC_AssertAlignx(16, y1(1))
36  PETSC_AssertAlignx(16, y2(1))
37
38  x(1:n) = x(1:n) + (a0*y0(1:n) + a1*y1(1:n) + a2*y2(1:n))
39end subroutine FortranMAXPY3
40
41pure subroutine FortranMAXPY2(x, a0, a1, y0, y1, n)
42  use, intrinsic :: ISO_C_binding
43  implicit none(type, external)
44  PetscScalar, intent(in) ::  a0, a1
45  PetscScalar, intent(inout) :: x(*)
46  PetscScalar, intent(in) :: y0(*), y1(*)
47  PetscInt, intent(in) :: n
48
49  PETSC_AssertAlignx(16, x(1))
50  PETSC_AssertAlignx(16, y0(1))
51  PETSC_AssertAlignx(16, y1(1))
52
53  x(1:n) = x(1:n) + (a0*y0(1:n) + a1*y1(1:n))
54end subroutine FortranMAXPY2
55