summaryrefslogtreecommitdiff
path: root/Utilib/src/SAXPY.f
diff options
context:
space:
mode:
authorstainer_t <thomas.stainer@oecd-nea.org>2025-09-08 13:48:49 +0200
committerstainer_t <thomas.stainer@oecd-nea.org>2025-09-08 13:48:49 +0200
commit7dfcc480ba1e19bd3232349fc733caef94034292 (patch)
tree03ee104eb8846d5cc1a981d267687a729185d3f3 /Utilib/src/SAXPY.f
Initial commit from Polytechnique Montreal
Diffstat (limited to 'Utilib/src/SAXPY.f')
-rw-r--r--Utilib/src/SAXPY.f74
1 files changed, 74 insertions, 0 deletions
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