1       SUBROUTINE DSWAP(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 *     interchanges two vectors.
13 *     uses unrolled loops for increments equal 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       IF (N.LE.0RETURN
31       IF (INCX.EQ.1 .AND. INCY.EQ.1THEN
32 *
33 *       code for both increments equal to 1
34 *
35 *
36 *       clean-up loop
37 *
38          M = MOD(N,3)
39          IF (M.NE.0THEN
40             DO I = 1,M
41                DTEMP = DX(I)
42                DX(I) = DY(I)
43                DY(I) = DTEMP
44             END DO
45             IF (N.LT.3RETURN
46          END IF
47          MP1 = M + 1
48          DO I = MP1,N,3
49             DTEMP = DX(I)
50             DX(I) = DY(I)
51             DY(I) = DTEMP
52             DTEMP = DX(I+1)
53             DX(I+1= DY(I+1)
54             DY(I+1= DTEMP
55             DTEMP = DX(I+2)
56             DX(I+2= DY(I+2)
57             DY(I+2= DTEMP
58          END DO
59       ELSE
60 *
61 *       code for unequal increments or equal increments not equal
62 *         to 1
63 *
64          IX = 1
65          IY = 1
66          IF (INCX.LT.0) IX = (-N+1)*INCX + 1
67          IF (INCY.LT.0) IY = (-N+1)*INCY + 1
68          DO I = 1,N
69             DTEMP = DX(IX)
70             DX(IX) = DY(IY)
71             DY(IY) = DTEMP
72             IX = IX + INCX
73             IY = IY + INCY
74          END DO
75       END IF
76       RETURN
77       END