2329
|
1 REAL FUNCTION SDOT(N,SX,INCX,SY,INCY) |
|
2 C |
|
3 C FORMS THE DOT PRODUCT OF TWO VECTORS. |
|
4 C USES UNROLLED LOOPS FOR INCREMENTS EQUAL TO ONE. |
|
5 C JACK DONGARRA, LINPACK, 3/11/78. |
|
6 C |
|
7 REAL SX(1),SY(1),STEMP |
|
8 INTEGER I,INCX,INCY,IX,IY,M,MP1,N |
|
9 C |
|
10 STEMP = 0.0E0 |
|
11 SDOT = 0.0E0 |
|
12 IF(N.LE.0)RETURN |
|
13 IF(INCX.EQ.1.AND.INCY.EQ.1)GO TO 20 |
|
14 C |
|
15 C CODE FOR UNEQUAL INCREMENTS OR EQUAL INCREMENTS |
|
16 C NOT EQUAL TO 1 |
|
17 C |
|
18 IX = 1 |
|
19 IY = 1 |
|
20 IF(INCX.LT.0)IX = (-N+1)*INCX + 1 |
|
21 IF(INCY.LT.0)IY = (-N+1)*INCY + 1 |
|
22 DO 10 I = 1,N |
|
23 STEMP = STEMP + SX(IX)*SY(IY) |
|
24 IX = IX + INCX |
|
25 IY = IY + INCY |
|
26 10 CONTINUE |
|
27 SDOT = STEMP |
|
28 RETURN |
|
29 C |
|
30 C CODE FOR BOTH INCREMENTS EQUAL TO 1 |
|
31 C |
|
32 C |
|
33 C CLEAN-UP LOOP |
|
34 C |
|
35 20 M = MOD(N,5) |
|
36 IF( M .EQ. 0 ) GO TO 40 |
|
37 DO 30 I = 1,M |
|
38 STEMP = STEMP + SX(I)*SY(I) |
|
39 30 CONTINUE |
|
40 IF( N .LT. 5 ) GO TO 60 |
|
41 40 MP1 = M + 1 |
|
42 DO 50 I = MP1,N,5 |
|
43 STEMP = STEMP + SX(I)*SY(I) + SX(I + 1)*SY(I + 1) + |
|
44 * SX(I + 2)*SY(I + 2) + SX(I + 3)*SY(I + 3) + SX(I + 4)*SY(I + 4) |
|
45 50 CONTINUE |
|
46 60 SDOT = STEMP |
|
47 RETURN |
|
48 END |