98 lines
2.6 KiB
FortranFixed
98 lines
2.6 KiB
FortranFixed
DOUBLE PRECISION FUNCTION DSDOT(N,SX,INCX,SY,INCY)
|
|
* .. Scalar Arguments ..
|
|
INTEGER INCX,INCY,N
|
|
* ..
|
|
* .. Array Arguments ..
|
|
REAL SX(*),SY(*)
|
|
* ..
|
|
*
|
|
* AUTHORS
|
|
* =======
|
|
* Lawson, C. L., (JPL), Hanson, R. J., (SNLA),
|
|
* Kincaid, D. R., (U. of Texas), Krogh, F. T., (JPL)
|
|
*
|
|
* Purpose
|
|
* =======
|
|
* Compute the inner product of two vectors with extended
|
|
* precision accumulation and result.
|
|
*
|
|
* Returns D.P. dot product accumulated in D.P., for S.P. SX and SY
|
|
* DSDOT = sum for I = 0 to N-1 of SX(LX+I*INCX) * SY(LY+I*INCY),
|
|
* where LX = 1 if INCX .GE. 0, else LX = 1+(1-N)*INCX, and LY is
|
|
* defined in a similar way using INCY.
|
|
*
|
|
* Arguments
|
|
* =========
|
|
*
|
|
* N (input) INTEGER
|
|
* number of elements in input vector(s)
|
|
*
|
|
* SX (input) REAL array, dimension(N)
|
|
* single precision vector with N elements
|
|
*
|
|
* INCX (input) INTEGER
|
|
* storage spacing between elements of SX
|
|
*
|
|
* SY (input) REAL array, dimension(N)
|
|
* single precision vector with N elements
|
|
*
|
|
* INCY (input) INTEGER
|
|
* storage spacing between elements of SY
|
|
*
|
|
* DSDOT (output) DOUBLE PRECISION
|
|
* DSDOT double precision dot product (zero if N.LE.0)
|
|
*
|
|
* Further Details
|
|
* ===============
|
|
*
|
|
* REFERENCES
|
|
*
|
|
* C. L. Lawson, R. J. Hanson, D. R. Kincaid and F. T.
|
|
* Krogh, Basic linear algebra subprograms for Fortran
|
|
* usage, Algorithm No. 539, Transactions on Mathematical
|
|
* Software 5, 3 (September 1979), pp. 308-323.
|
|
*
|
|
* REVISION HISTORY (YYMMDD)
|
|
*
|
|
* 791001 DATE WRITTEN
|
|
* 890831 Modified array declarations. (WRB)
|
|
* 890831 REVISION DATE from Version 3.2
|
|
* 891214 Prologue converted to Version 4.0 format. (BAB)
|
|
* 920310 Corrected definition of LX in DESCRIPTION. (WRB)
|
|
* 920501 Reformatted the REFERENCES section. (WRB)
|
|
* 070118 Reformat to LAPACK style (JL)
|
|
*
|
|
* =====================================================================
|
|
*
|
|
* .. Local Scalars ..
|
|
INTEGER I,KX,KY,NS
|
|
* ..
|
|
* .. Intrinsic Functions ..
|
|
INTRINSIC DBLE
|
|
* ..
|
|
DSDOT = 0.0D0
|
|
IF (N.LE.0) RETURN
|
|
IF (INCX.EQ.INCY .AND. INCX.GT.0) GO TO 20
|
|
*
|
|
* Code for unequal or nonpositive increments.
|
|
*
|
|
KX = 1
|
|
KY = 1
|
|
IF (INCX.LT.0) KX = 1 + (1-N)*INCX
|
|
IF (INCY.LT.0) KY = 1 + (1-N)*INCY
|
|
DO 10 I = 1,N
|
|
DSDOT = DSDOT + DBLE(SX(KX))*DBLE(SY(KY))
|
|
KX = KX + INCX
|
|
KY = KY + INCY
|
|
10 CONTINUE
|
|
RETURN
|
|
*
|
|
* Code for equal, positive, non-unit increments.
|
|
*
|
|
20 NS = N*INCX
|
|
DO 30 I = 1,NS,INCX
|
|
DSDOT = DSDOT + DBLE(SX(I))*DBLE(SY(I))
|
|
30 CONTINUE
|
|
RETURN
|
|
END
|