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