sdot.f
148 lines
| 3.2 KiB
| text/x-fortran
|
FortranFixedLexer
r1601 | *> \brief \b SDOT | |||
* | ||||
* =========== DOCUMENTATION =========== | ||||
* | ||||
* Online html documentation available at | ||||
* http://www.netlib.org/lapack/explore-html/ | ||||
* | ||||
* Definition: | ||||
* =========== | ||||
* | ||||
* REAL FUNCTION SDOT(N,SX,INCX,SY,INCY) | ||||
* | ||||
* .. Scalar Arguments .. | ||||
* INTEGER INCX,INCY,N | ||||
* .. | ||||
* .. Array Arguments .. | ||||
* REAL SX(*),SY(*) | ||||
* .. | ||||
* | ||||
* | ||||
*> \par Purpose: | ||||
* ============= | ||||
*> | ||||
*> \verbatim | ||||
*> | ||||
*> SDOT forms the dot product of two vectors. | ||||
*> uses unrolled loops for increments equal to one. | ||||
*> \endverbatim | ||||
* | ||||
* Arguments: | ||||
* ========== | ||||
* | ||||
*> \param[in] N | ||||
*> \verbatim | ||||
*> N is INTEGER | ||||
*> number of elements in input vector(s) | ||||
*> \endverbatim | ||||
*> | ||||
*> \param[in] SX | ||||
*> \verbatim | ||||
*> SX is REAL array, dimension ( 1 + ( N - 1 )*abs( INCX ) ) | ||||
*> \endverbatim | ||||
*> | ||||
*> \param[in] INCX | ||||
*> \verbatim | ||||
*> INCX is INTEGER | ||||
*> storage spacing between elements of SX | ||||
*> \endverbatim | ||||
*> | ||||
*> \param[in] SY | ||||
*> \verbatim | ||||
*> SY is REAL array, dimension ( 1 + ( N - 1 )*abs( INCY ) ) | ||||
*> \endverbatim | ||||
*> | ||||
*> \param[in] INCY | ||||
*> \verbatim | ||||
*> INCY is INTEGER | ||||
*> storage spacing between elements of SY | ||||
*> \endverbatim | ||||
* | ||||
* Authors: | ||||
* ======== | ||||
* | ||||
*> \author Univ. of Tennessee | ||||
*> \author Univ. of California Berkeley | ||||
*> \author Univ. of Colorado Denver | ||||
*> \author NAG Ltd. | ||||
* | ||||
*> \date November 2017 | ||||
* | ||||
*> \ingroup single_blas_level1 | ||||
* | ||||
*> \par Further Details: | ||||
* ===================== | ||||
*> | ||||
*> \verbatim | ||||
*> | ||||
*> jack dongarra, linpack, 3/11/78. | ||||
*> modified 12/3/93, array(1) declarations changed to array(*) | ||||
*> \endverbatim | ||||
*> | ||||
* ===================================================================== | ||||
REAL FUNCTION SDOT(N,SX,INCX,SY,INCY) | ||||
* | ||||
* -- Reference BLAS level1 routine (version 3.8.0) -- | ||||
* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- | ||||
* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- | ||||
* November 2017 | ||||
* | ||||
* .. Scalar Arguments .. | ||||
INTEGER INCX,INCY,N | ||||
* .. | ||||
* .. Array Arguments .. | ||||
REAL SX(*),SY(*) | ||||
* .. | ||||
* | ||||
* ===================================================================== | ||||
* | ||||
* .. Local Scalars .. | ||||
REAL STEMP | ||||
INTEGER I,IX,IY,M,MP1 | ||||
* .. | ||||
* .. Intrinsic Functions .. | ||||
INTRINSIC MOD | ||||
* .. | ||||
STEMP = 0.0e0 | ||||
SDOT = 0.0e0 | ||||
IF (N.LE.0) RETURN | ||||
IF (INCX.EQ.1 .AND. INCY.EQ.1) THEN | ||||
* | ||||
* code for both increments equal to 1 | ||||
* | ||||
* | ||||
* clean-up loop | ||||
* | ||||
M = MOD(N,5) | ||||
IF (M.NE.0) THEN | ||||
DO I = 1,M | ||||
STEMP = STEMP + SX(I)*SY(I) | ||||
END DO | ||||
IF (N.LT.5) THEN | ||||
SDOT=STEMP | ||||
RETURN | ||||
END IF | ||||
END IF | ||||
MP1 = M + 1 | ||||
DO I = MP1,N,5 | ||||
STEMP = STEMP + SX(I)*SY(I) + SX(I+1)*SY(I+1) + | ||||
$ SX(I+2)*SY(I+2) + SX(I+3)*SY(I+3) + SX(I+4)*SY(I+4) | ||||
END DO | ||||
ELSE | ||||
* | ||||
* 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 I = 1,N | ||||
STEMP = STEMP + SX(IX)*SY(IY) | ||||
IX = IX + INCX | ||||
IY = IY + INCY | ||||
END DO | ||||
END IF | ||||
SDOT = STEMP | ||||
RETURN | ||||
END | ||||