From 7dfcc480ba1e19bd3232349fc733caef94034292 Mon Sep 17 00:00:00 2001 From: stainer_t Date: Mon, 8 Sep 2025 13:48:49 +0200 Subject: Initial commit from Polytechnique Montreal --- Utilib/src/SAXPY.f | 74 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 Utilib/src/SAXPY.f (limited to 'Utilib/src/SAXPY.f') diff --git a/Utilib/src/SAXPY.f b/Utilib/src/SAXPY.f new file mode 100644 index 0000000..af2c3d1 --- /dev/null +++ b/Utilib/src/SAXPY.f @@ -0,0 +1,74 @@ +*DECK SAXPY + SUBROUTINE SAXPY(N,SA,SX,INCX,SY,INCY) +* +*----------------------------------------------------------------------- +* +*Purpose: +* constant times a vector plus a vector. Uses unrolled loop for +* increments equal to one. +* +*Copyright: +* Copyright (C) 2002 Ecole Polytechnique de Montreal +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version +* +*Author(s): Jack Dongarra, linpack, 3/11/78. +* +*Parameters: input +* N number of components in the vector. +* SA constant. +* SX RHS vector. +* INCX increment in RHS vector. +* +*Parameters: output +* SY LHS vector. +* INCY increment in LHS vector. +* +*----------------------------------------------------------------------- +* +*---- +* SUBROUTINE ARGUMENTS +*---- + REAL SX(N*INCX),SY(N*INCY),SA + INTEGER N,INCX,INCY +*---- +* LOCAL VARIABLES +*---- + INTEGER I,IX,IY,M,MP1 +* + IF(N.LE.0)RETURN + IF (SA .EQ. 0.0) RETURN + IF(INCX.EQ.1.AND.INCY.EQ.1)GO TO 20 +*---- +* CODE FOR UNEQUAL INCREMENTS OR EQUAL INCREMENTS NOT EQUAL TO 1. +*---- + IX = 1 + IY = 1 + IF(INCX.LT.0)IX = (-N+1)*INCX + 1 + IF(INCY.LT.0)IY = (-N+1)*INCY + 1 + DO 10 I = 1,N + SY(IY) = SY(IY) + SA*SX(IX) + IX = IX + INCX + IY = IY + INCY + 10 CONTINUE + RETURN +*---- +* CODE FOR BOTH INCREMENTS EQUAL TO 1. CLEAN-UP LOOP. +*---- + 20 M = MOD(N,4) + IF( M .EQ. 0 ) GO TO 40 + DO 30 I = 1,M + SY(I) = SY(I) + SA*SX(I) + 30 CONTINUE + IF( N .LT. 4 ) RETURN + 40 MP1 = M + 1 + DO 50 I = MP1,N,4 + SY(I) = SY(I) + SA*SX(I) + SY(I + 1) = SY(I + 1) + SA*SX(I + 1) + SY(I + 2) = SY(I + 2) + SA*SX(I + 2) + SY(I + 3) = SY(I + 3) + SA*SX(I + 3) + 50 CONTINUE + RETURN + END -- cgit v1.2.3