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) 64 IF (N.LE.0 .OR. (DFLAG+TWO.EQ.ZERO)) GO TO 140 65 IF (.NOT. (INCX.EQ.INCY.AND.INCX.GT.0)) GO TO 70 66 * 67 NSTEPS = N*INCX 68 IF (DFLAG) 50,10,30 69 10 CONTINUE 70 DH12 = DPARAM(4) 71 DH21 = DPARAM(3) 72 DO 20 I = 1,NSTEPS,INCX 73 W = DX(I) 74 Z = DY(I) 75 DX(I) = W + Z*DH12 76 DY(I) = W*DH21 + Z 77 20 CONTINUE 78 GO TO 140 79 30 CONTINUE 80 DH11 = DPARAM(2) 81 DH22 = DPARAM(5) 82 DO 40 I = 1,NSTEPS,INCX 83 W = DX(I) 84 Z = DY(I) 85 DX(I) = W*DH11 + Z 86 DY(I) = -W + DH22*Z 87 40 CONTINUE 88 GO TO 140 89 50 CONTINUE 90 DH11 = DPARAM(2) 91 DH12 = DPARAM(4) 92 DH21 = DPARAM(3) 93 DH22 = DPARAM(5) 94 DO 60 I = 1,NSTEPS,INCX 95 W = DX(I) 96 Z = DY(I) 97 DX(I) = W*DH11 + Z*DH12 98 DY(I) = W*DH21 + Z*DH22 99 60 CONTINUE 100 GO TO 140 101 70 CONTINUE 102 KX = 1 103 KY = 1 104 IF (INCX.LT.0) KX = 1 + (1-N)*INCX 105 IF (INCY.LT.0) KY = 1 + (1-N)*INCY 106 * 107 IF (DFLAG) 120,80,100 108 80 CONTINUE 109 DH12 = DPARAM(4) 110 DH21 = DPARAM(3) 111 DO 90 I = 1,N 112 W = DX(KX) 113 Z = DY(KY) 114 DX(KX) = W + Z*DH12 115 DY(KY) = W*DH21 + Z 116 KX = KX + INCX 117 KY = KY + INCY 118 90 CONTINUE 119 GO TO 140 120 100 CONTINUE 121 DH11 = DPARAM(2) 122 DH22 = DPARAM(5) 123 DO 110 I = 1,N 124 W = DX(KX) 125 Z = DY(KY) 126 DX(KX) = W*DH11 + Z 127 DY(KY) = -W + DH22*Z 128 KX = KX + INCX 129 KY = KY + INCY 130 110 CONTINUE 131 GO TO 140 132 120 CONTINUE 133 DH11 = DPARAM(2) 134 DH12 = DPARAM(4) 135 DH21 = DPARAM(3) 136 DH22 = DPARAM(5) 137 DO 130 I = 1,N 138 W = DX(KX) 139 Z = DY(KY) 140 DX(KX) = W*DH11 + Z*DH12 141 DY(KY) = W*DH21 + Z*DH22 142 KX = KX + INCX 143 KY = KY + INCY 144 130 CONTINUE 145 140 CONTINUE 146 RETURN 147 END 148