Annotation of rpl/lapack/blas/drotm.f, revision 1.8
1.1 bertrand 1: SUBROUTINE DROTM(N,DX,INCX,DY,INCY,DPARAM)
2: * .. Scalar Arguments ..
3: INTEGER INCX,INCY,N
4: * ..
5: * .. Array Arguments ..
6: DOUBLE PRECISION DPARAM(5),DX(*),DY(*)
7: * ..
8: *
9: * Purpose
10: * =======
11: *
12: * APPLY THE MODIFIED GIVENS TRANSFORMATION, H, TO THE 2 BY N MATRIX
13: *
14: * (DX**T) , WHERE **T INDICATES TRANSPOSE. THE ELEMENTS OF DX ARE IN
15: * (DY**T)
16: *
17: * DX(LX+I*INCX), I = 0 TO N-1, WHERE LX = 1 IF INCX .GE. 0, ELSE
18: * LX = (-INCX)*N, AND SIMILARLY FOR SY USING LY AND INCY.
19: * WITH DPARAM(1)=DFLAG, H HAS ONE OF THE FOLLOWING FORMS..
20: *
21: * DFLAG=-1.D0 DFLAG=0.D0 DFLAG=1.D0 DFLAG=-2.D0
22: *
23: * (DH11 DH12) (1.D0 DH12) (DH11 1.D0) (1.D0 0.D0)
24: * H=( ) ( ) ( ) ( )
25: * (DH21 DH22), (DH21 1.D0), (-1.D0 DH22), (0.D0 1.D0).
26: * SEE DROTMG FOR A DESCRIPTION OF DATA STORAGE IN DPARAM.
27: *
28: * Arguments
29: * =========
30: *
31: * N (input) INTEGER
32: * number of elements in input vector(s)
33: *
34: * DX (input/output) DOUBLE PRECISION array, dimension N
35: * double precision vector with N elements
36: *
37: * INCX (input) INTEGER
38: * storage spacing between elements of DX
39: *
40: * DY (input/output) DOUBLE PRECISION array, dimension N
41: * double precision vector with N elements
42: *
43: * INCY (input) INTEGER
44: * storage spacing between elements of DY
45: *
46: * DPARAM (input/output) DOUBLE PRECISION array, dimension 5
47: * DPARAM(1)=DFLAG
48: * DPARAM(2)=DH11
49: * DPARAM(3)=DH21
50: * DPARAM(4)=DH12
51: * DPARAM(5)=DH22
52: *
53: * =====================================================================
54: *
55: * .. Local Scalars ..
56: DOUBLE PRECISION DFLAG,DH11,DH12,DH21,DH22,TWO,W,Z,ZERO
57: INTEGER I,KX,KY,NSTEPS
58: * ..
59: * .. Data statements ..
60: DATA ZERO,TWO/0.D0,2.D0/
61: * ..
62: *
63: DFLAG = DPARAM(1)
1.8 ! bertrand 64: IF (N.LE.0 .OR. (DFLAG+TWO.EQ.ZERO)) RETURN
! 65: IF (INCX.EQ.INCY.AND.INCX.GT.0) THEN
1.1 bertrand 66: *
1.8 ! bertrand 67: NSTEPS = N*INCX
! 68: IF (DFLAG.LT.ZERO) THEN
! 69: DH11 = DPARAM(2)
! 70: DH12 = DPARAM(4)
! 71: DH21 = DPARAM(3)
! 72: DH22 = DPARAM(5)
! 73: DO I = 1,NSTEPS,INCX
! 74: W = DX(I)
! 75: Z = DY(I)
! 76: DX(I) = W*DH11 + Z*DH12
! 77: DY(I) = W*DH21 + Z*DH22
! 78: END DO
! 79: ELSE IF (DFLAG.EQ.ZERO) THEN
! 80: DH12 = DPARAM(4)
! 81: DH21 = DPARAM(3)
! 82: DO I = 1,NSTEPS,INCX
! 83: W = DX(I)
! 84: Z = DY(I)
! 85: DX(I) = W + Z*DH12
! 86: DY(I) = W*DH21 + Z
! 87: END DO
! 88: ELSE
! 89: DH11 = DPARAM(2)
! 90: DH22 = DPARAM(5)
! 91: DO I = 1,NSTEPS,INCX
! 92: W = DX(I)
! 93: Z = DY(I)
! 94: DX(I) = W*DH11 + Z
! 95: DY(I) = -W + DH22*Z
! 96: END DO
! 97: END IF
1.4 bertrand 98: ELSE
1.8 ! bertrand 99: KX = 1
! 100: KY = 1
! 101: IF (INCX.LT.0) KX = 1 + (1-N)*INCX
! 102: IF (INCY.LT.0) KY = 1 + (1-N)*INCY
1.1 bertrand 103: *
1.8 ! bertrand 104: IF (DFLAG.LT.ZERO) THEN
! 105: DH11 = DPARAM(2)
! 106: DH12 = DPARAM(4)
! 107: DH21 = DPARAM(3)
! 108: DH22 = DPARAM(5)
! 109: DO I = 1,N
! 110: W = DX(KX)
! 111: Z = DY(KY)
! 112: DX(KX) = W*DH11 + Z*DH12
! 113: DY(KY) = W*DH21 + Z*DH22
! 114: KX = KX + INCX
! 115: KY = KY + INCY
! 116: END DO
! 117: ELSE IF (DFLAG.EQ.ZERO) THEN
! 118: DH12 = DPARAM(4)
! 119: DH21 = DPARAM(3)
! 120: DO I = 1,N
! 121: W = DX(KX)
! 122: Z = DY(KY)
! 123: DX(KX) = W + Z*DH12
! 124: DY(KY) = W*DH21 + Z
! 125: KX = KX + INCX
! 126: KY = KY + INCY
! 127: END DO
! 128: ELSE
! 129: DH11 = DPARAM(2)
! 130: DH22 = DPARAM(5)
! 131: DO I = 1,N
! 132: W = DX(KX)
! 133: Z = DY(KY)
! 134: DX(KX) = W*DH11 + Z
! 135: DY(KY) = -W + DH22*Z
! 136: KX = KX + INCX
! 137: KY = KY + INCY
! 138: END DO
! 139: END IF
1.4 bertrand 140: END IF
1.1 bertrand 141: RETURN
142: END
CVSweb interface <joel.bertrand@systella.fr>