mirror of
https://git.planet-casio.com/Lephenixnoir/OpenLibm.git
synced 2025-01-01 06:23:39 +01:00
c977aa998f
Replace amos with slatec
89 lines
3.3 KiB
Fortran
89 lines
3.3 KiB
Fortran
*DECK DQDOTA
|
|
DOUBLE PRECISION FUNCTION DQDOTA (N, DB, QC, DX, INCX, DY, INCY)
|
|
C***BEGIN PROLOGUE DQDOTA
|
|
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 (DQDOTA-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 to inner product
|
|
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 DQDOTA double precision result
|
|
C QC extended precision result
|
|
C
|
|
C D.P. dot product with extended precision accumulation (and result)
|
|
C QC and DQDOTA are set = DB + QC + 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 previously computed by DQDOTI or 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 name MPCOM. If local
|
|
C variable I1 is zero, DQDOTA calls MPBLAS to initialize
|
|
C the MP 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 DQDOTA
|
|
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 DQDOTA
|
|
IF (I1 .EQ. 0) CALL MPBLAS(I1)
|
|
IF (DB .EQ. 0.D0) GO TO 20
|
|
CALL MPCDM(DB, QX)
|
|
CALL MPADD(QC, QX, QC)
|
|
20 IF (N .EQ. 0) GO TO 40
|
|
IX = 1
|
|
IY = 1
|
|
IF (INCX .LT. 0) IX = (-N + 1) * INCX + 1
|
|
IF (INCY .LT. 0) IY = (-N + 1) * INCY + 1
|
|
DO 30 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
|
|
30 CONTINUE
|
|
40 CALL MPCMD(QC, DQDOTA)
|
|
RETURN
|
|
END
|