1       DOUBLE PRECISION FUNCTION DDOT(N,DX,INCX,DY,INCY)
 2 *     .. Scalar Arguments ..
 3       INTEGER INCX,INCY,N
 4 *     ..
 5 *     .. Array Arguments ..
 6       DOUBLE PRECISION DX(*),DY(*)
 7 *     ..
 8 *
 9 *  Purpose
10 *  =======
11 *
12 *     DDOT forms the dot product of two vectors.
13 *     uses unrolled loops for increments equal to one.
14 *
15 *  Further Details
16 *  ===============
17 *
18 *     jack dongarra, linpack, 3/11/78.
19 *     modified 12/3/93, array(1) declarations changed to array(*)
20 *
21 *  =====================================================================
22 *
23 *     .. Local Scalars ..
24       DOUBLE PRECISION DTEMP
25       INTEGER I,IX,IY,M,MP1
26 *     ..
27 *     .. Intrinsic Functions ..
28       INTRINSIC MOD
29 *     ..
30       DDOT = 0.0d0
31       DTEMP = 0.0d0
32       IF (N.LE.0RETURN
33       IF (INCX.EQ.1 .AND. INCY.EQ.1THEN
34 *
35 *        code for both increments equal to 1
36 *
37 *
38 *        clean-up loop
39 *
40          M = MOD(N,5)
41          IF (M.NE.0THEN
42             DO I = 1,M
43                DTEMP = DTEMP + DX(I)*DY(I)
44             END DO
45             IF (N.LT.5THEN
46                DDOT=DTEMP
47             RETURN
48             END IF
49          END IF
50          MP1 = M + 1
51          DO I = MP1,N,5
52           DTEMP = DTEMP + DX(I)*DY(I) + DX(I+1)*DY(I+1+
53      $            DX(I+2)*DY(I+2+ DX(I+3)*DY(I+3+ DX(I+4)*DY(I+4)
54          END DO
55       ELSE
56 *
57 *        code for unequal increments or equal increments
58 *          not equal to 1
59 *
60          IX = 1
61          IY = 1
62          IF (INCX.LT.0) IX = (-N+1)*INCX + 1
63          IF (INCY.LT.0) IY = (-N+1)*INCY + 1
64          DO I = 1,N
65             DTEMP = DTEMP + DX(IX)*DY(IY)
66             IX = IX + INCX
67             IY = IY + INCY
68          END DO
69       END IF
70       DDOT = DTEMP
71       RETURN
72       END