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