2424* >
2525* > \verbatim
2626* >
27- * > DAXPBY constant times a vector plus constanttimes a vector.
27+ * > DAXPBY constant times a vector plus constant times a vector.
2828* >
2929* > Y = ALPHA * X + BETA * Y
3030* >
31- * > uses unrolled loops for increments equal to one.
3231* > \endverbatim
3332*
3433* Arguments:
8180* > \author Univ. of California Berkeley
8281* > \author Univ. of Colorado Denver
8382* > \author NAG Ltd.
84- * > \author Martin Koehler, MPI Magdeburg
83+ * > \author Martin Koehler, MPI Magdeburg
8584*
8685* > \ingroup axpby
8786*
88- * > \par Further Details:
89- * =====================
90- * >
91- * > \verbatim
92- * >
93- * > jack dongarra, linpack, 3/11/78.
94- * > modified 12/3/93, array(1) declarations changed to array(*)
95- * > modfied 8/23/24, implement the axpby case
96- * > \endverbatim
97- * >
9887* =====================================================================
9988 SUBROUTINE DAXPBY (N ,DA ,DX ,INCX ,DB ,DY ,INCY )
89+ IMPLICIT NONE
10090*
10191* -- Reference BLAS level1 routine --
10292* -- Reference BLAS is a software package provided by Univ. of Tennessee, --
@@ -109,6 +99,8 @@ SUBROUTINE DAXPBY(N,DA,DX,INCX,DB,DY,INCY)
10999* .. Array Arguments ..
110100 DOUBLE PRECISION DX(* ),DY(* )
111101* ..
102+ * .. External Subroutines
103+ EXTERNAL DSCAL
112104*
113105* =====================================================================
114106*
@@ -119,26 +111,21 @@ SUBROUTINE DAXPBY(N,DA,DX,INCX,DB,DY,INCY)
119111 INTRINSIC MOD
120112* ..
121113 IF (N.LE. 0 ) RETURN
114+
115+ * Scale if DA.EQ.0
116+ IF (DA.EQ. 0.0D0 .AND. DB.NE. 0.0D0 ) THEN
117+ CALL DSCAL(N, DB, DY, INCY)
118+ RETURN
119+ END IF
120+
122121 IF (INCX.EQ. 1 .AND. INCY.EQ. 1 ) THEN
123122*
124123* code for both increments equal to 1
125124*
126125*
127- * clean-up loop
128- *
129- M = MOD (N,4 )
130- IF (M.NE. 0 ) THEN
131- DO I = 1 ,M
132- DY(I) = DB* DY(I) + DA* DX(I)
133- END DO
134- END IF
135- IF (N.LT. 4 ) RETURN
136- MP1 = M + 1
137- DO I = MP1,N,4
138- DY(I) = DB* DY(I) + DA* DX(I)
139- DY(I+1 ) = DB* DY(I+1 ) + DA* DX(I+1 )
140- DY(I+2 ) = DB* DY(I+2 ) + DA* DX(I+2 )
141- DY(I+3 ) = DB* DY(I+3 ) + DA* DX(I+3 )
126+ *
127+ DO I = 1 ,N
128+ DY(I) = DB* DY(I) + DA* DX(I)
142129 END DO
143130 ELSE
144131*
0 commit comments