OpenLibm/slatec/dqdoti.f
Viral B. Shah c977aa998f Add Makefile.extras to build libopenlibm-extras.
Replace amos with slatec
2012-12-31 16:37:05 -05:00

90 lines
3.3 KiB
Fortran

*DECK DQDOTI
DOUBLE PRECISION FUNCTION DQDOTI (N, DB, QC, DX, INCX, DY, INCY)
C***BEGIN PROLOGUE DQDOTI
C***PURPOSE Compute the inner product of two vectors with extended
C precision accumulation and result.
C***LIBRARY SLATEC
C***CATEGORY D1A4
C***TYPE DOUBLE PRECISION (DQDOTI-D)
C***KEYWORDS DOT PRODUCT, INNER PRODUCT
C***AUTHOR Lawson, C. L., (JPL)
C Hanson, R. J., (SNLA)
C Kincaid, D. R., (U. of Texas)
C Krogh, F. T., (JPL)
C***DESCRIPTION
C
C B L A S Subprogram
C Description of parameters
C
C --Input--
C N number of elements in input vector(s)
C DB double precision scalar to be added to inner product
C QC extended precision scalar to be added
C DX double precision vector with N elements
C INCX storage spacing between elements of DX
C DY double precision vector with N elements
C INCY storage spacing between elements of DY
C
C --Output--
C DQDOTI double precision result
C QC extended precision result
C
C D.P. dot product with extended precision accumulation (and result)
C QC and DQDOTI are set = DB + sum for I = 0 to N-1 of
C DX(LX+I*INCX) * DY(LY+I*INCY), where QC is an extended
C precision result which can be used as input to DQDOTA,
C and LX = 1 if INCX .GE. 0, else LX = (-INCX)*N, and LY is
C defined in a similar way using INCY. The MP package by
C Richard P. Brent is used for the extended precision arithmetic.
C
C Fred T. Krogh, JPL, 1977, June 1
C
C The common block for the MP package is named MPCOM. If local
C variable I1 is zero, DQDOTI calls MPBLAS to initialize the MP
C package and reset I1 to 1.
C
C The argument QC(*), and the local variables QX and QY are INTEGER
C arrays of size 30. See the comments in the routine MPBLAS for the
C reason for this choice.
C
C***REFERENCES C. L. Lawson, R. J. Hanson, D. R. Kincaid and F. T.
C Krogh, Basic linear algebra subprograms for Fortran
C usage, Algorithm No. 539, Transactions on Mathematical
C Software 5, 3 (September 1979), pp. 308-323.
C***ROUTINES CALLED MPADD, MPBLAS, MPCDM, MPCMD, MPMUL
C***COMMON BLOCKS MPCOM
C***REVISION HISTORY (YYMMDD)
C 791001 DATE WRITTEN
C 890831 Modified array declarations. (WRB)
C 890831 REVISION DATE from Version 3.2
C 891214 Prologue converted to Version 4.0 format. (BAB)
C 920501 Reformatted the REFERENCES section. (WRB)
C 930124 Increased Array sizes for SUN -r8. (RWC)
C***END PROLOGUE DQDOTI
DOUBLE PRECISION DX(*), DY(*), DB
INTEGER QC(30), QX(30), QY(30)
COMMON /MPCOM/ MPB, MPT, MPM, MPLUN, MPMXR, MPR(30)
SAVE I1
DATA I1 / 0 /
C***FIRST EXECUTABLE STATEMENT DQDOTI
IF (I1 .EQ. 0) CALL MPBLAS(I1)
QC(1) = 0
IF (DB .EQ. 0.D0) GO TO 60
CALL MPCDM(DB, QX)
CALL MPADD(QC, QX, QC)
60 IF (N .EQ. 0) GO TO 80
IX = 1
IY = 1
IF (INCX .LT. 0) IX = (-N + 1) * INCX + 1
IF (INCY .LT. 0) IY = (-N + 1) * INCY + 1
DO 70 I = 1,N
CALL MPCDM(DX(IX), QX)
CALL MPCDM(DY(IY), QY)
CALL MPMUL(QX, QY, QX)
CALL MPADD(QC, QX, QC)
IX = IX + INCX
IY = IY + INCY
70 CONTINUE
80 CALL MPCMD(QC, DQDOTI)
RETURN
END