1 SUBROUTINE SROTMG(SD1,SD2,SX1,SY1,SPARAM) 2* .. Scalar Arguments .. 3 REAL SD1,SD2,SX1,SY1 4* .. 5* .. Array Arguments .. 6 REAL SPARAM(5) 7* .. 8* 9* Purpose 10* ======= 11* 12* CONSTRUCT THE MODIFIED GIVENS TRANSFORMATION MATRIX H WHICH ZEROS 13* THE SECOND COMPONENT OF THE 2-VECTOR (SQRT(SD1)*SX1,SQRT(SD2)* 14* SY2)**T. 15* WITH SPARAM(1)=SFLAG, H HAS ONE OF THE FOLLOWING FORMS.. 16* 17* SFLAG=-1.E0 SFLAG=0.E0 SFLAG=1.E0 SFLAG=-2.E0 18* 19* (SH11 SH12) (1.E0 SH12) (SH11 1.E0) (1.E0 0.E0) 20* H=( ) ( ) ( ) ( ) 21* (SH21 SH22), (SH21 1.E0), (-1.E0 SH22), (0.E0 1.E0). 22* LOCATIONS 2-4 OF SPARAM CONTAIN SH11,SH21,SH12, AND SH22 23* RESPECTIVELY. (VALUES OF 1.E0, -1.E0, OR 0.E0 IMPLIED BY THE 24* VALUE OF SPARAM(1) ARE NOT STORED IN SPARAM.) 25* 26* THE VALUES OF GAMSQ AND RGAMSQ SET IN THE DATA STATEMENT MAY BE 27* INEXACT. THIS IS OK AS THEY ARE ONLY USED FOR TESTING THE SIZE 28* OF SD1 AND SD2. ALL ACTUAL SCALING OF DATA IS DONE USING GAM. 29* 30* 31* Arguments 32* ========= 33* 34* 35* SD1 (input/output) REAL 36* 37* SD2 (input/output) REAL 38* 39* SX1 (input/output) REAL 40* 41* SY1 (input) REAL 42* 43* 44* SPARAM (input/output) REAL array, dimension 5 45* SPARAM(1)=SFLAG 46* SPARAM(2)=SH11 47* SPARAM(3)=SH21 48* SPARAM(4)=SH12 49* SPARAM(5)=SH22 50* 51* ===================================================================== 52* 53* .. Local Scalars .. 54 REAL GAM,GAMSQ,ONE,RGAMSQ,SFLAG,SH11,SH12,SH21,SH22,SP1,SP2,SQ1, 55 + SQ2,STEMP,SU,TWO,ZERO 56 INTEGER IGO 57* .. 58* .. Intrinsic Functions .. 59 INTRINSIC ABS 60* .. 61* .. Data statements .. 62* 63 DATA ZERO,ONE,TWO/0.E0,1.E0,2.E0/ 64 DATA GAM,GAMSQ,RGAMSQ/4096.E0,1.67772E7,5.96046E-8/ 65* .. 66 67 IF (.NOT.SD1.LT.ZERO) GO TO 10 68* GO ZERO-H-D-AND-SX1.. 69 GO TO 60 70 10 CONTINUE 71* CASE-SD1-NONNEGATIVE 72 SP2 = SD2*SY1 73 IF (.NOT.SP2.EQ.ZERO) GO TO 20 74 SFLAG = -TWO 75 GO TO 260 76* REGULAR-CASE.. 77 20 CONTINUE 78 SP1 = SD1*SX1 79 SQ2 = SP2*SY1 80 SQ1 = SP1*SX1 81* 82 IF (.NOT.ABS(SQ1).GT.ABS(SQ2)) GO TO 40 83 SH21 = -SY1/SX1 84 SH12 = SP2/SP1 85* 86 SU = ONE - SH12*SH21 87* 88 IF (.NOT.SU.LE.ZERO) GO TO 30 89* GO ZERO-H-D-AND-SX1.. 90 GO TO 60 91 30 CONTINUE 92 SFLAG = ZERO 93 SD1 = SD1/SU 94 SD2 = SD2/SU 95 SX1 = SX1*SU 96* GO SCALE-CHECK.. 97 GO TO 100 98 40 CONTINUE 99 IF (.NOT.SQ2.LT.ZERO) GO TO 50 100* GO ZERO-H-D-AND-SX1.. 101 GO TO 60 102 50 CONTINUE 103 SFLAG = ONE 104 SH11 = SP1/SP2 105 SH22 = SX1/SY1 106 SU = ONE + SH11*SH22 107 STEMP = SD2/SU 108 SD2 = SD1/SU 109 SD1 = STEMP 110 SX1 = SY1*SU 111* GO SCALE-CHECK 112 GO TO 100 113* PROCEDURE..ZERO-H-D-AND-SX1.. 114 60 CONTINUE 115 SFLAG = -ONE 116 SH11 = ZERO 117 SH12 = ZERO 118 SH21 = ZERO 119 SH22 = ZERO 120* 121 SD1 = ZERO 122 SD2 = ZERO 123 SX1 = ZERO 124* RETURN.. 125 GO TO 220 126* PROCEDURE..FIX-H.. 127 70 CONTINUE 128 IF (.NOT.SFLAG.GE.ZERO) GO TO 90 129* 130 IF (.NOT.SFLAG.EQ.ZERO) GO TO 80 131 SH11 = ONE 132 SH22 = ONE 133 SFLAG = -ONE 134 GO TO 90 135 80 CONTINUE 136 SH21 = -ONE 137 SH12 = ONE 138 SFLAG = -ONE 139 90 CONTINUE 140 GO TO IGO(120,150,180,210) 141* PROCEDURE..SCALE-CHECK 142 100 CONTINUE 143 110 CONTINUE 144 IF (.NOT.SD1.LE.RGAMSQ) GO TO 130 145 IF (SD1.EQ.ZERO) GO TO 160 146 ASSIGN 120 TO IGO 147* FIX-H.. 148 GO TO 70 149 120 CONTINUE 150 SD1 = SD1*GAM**2 151 SX1 = SX1/GAM 152 SH11 = SH11/GAM 153 SH12 = SH12/GAM 154 GO TO 110 155 130 CONTINUE 156 140 CONTINUE 157 IF (.NOT.SD1.GE.GAMSQ) GO TO 160 158 ASSIGN 150 TO IGO 159* FIX-H.. 160 GO TO 70 161 150 CONTINUE 162 SD1 = SD1/GAM**2 163 SX1 = SX1*GAM 164 SH11 = SH11*GAM 165 SH12 = SH12*GAM 166 GO TO 140 167 160 CONTINUE 168 170 CONTINUE 169 IF (.NOT.ABS(SD2).LE.RGAMSQ) GO TO 190 170 IF (SD2.EQ.ZERO) GO TO 220 171 ASSIGN 180 TO IGO 172* FIX-H.. 173 GO TO 70 174 180 CONTINUE 175 SD2 = SD2*GAM**2 176 SH21 = SH21/GAM 177 SH22 = SH22/GAM 178 GO TO 170 179 190 CONTINUE 180 200 CONTINUE 181 IF (.NOT.ABS(SD2).GE.GAMSQ) GO TO 220 182 ASSIGN 210 TO IGO 183* FIX-H.. 184 GO TO 70 185 210 CONTINUE 186 SD2 = SD2/GAM**2 187 SH21 = SH21*GAM 188 SH22 = SH22*GAM 189 GO TO 200 190 220 CONTINUE 191 IF (SFLAG) 250,230,240 192 230 CONTINUE 193 SPARAM(3) = SH21 194 SPARAM(4) = SH12 195 GO TO 260 196 240 CONTINUE 197 SPARAM(2) = SH11 198 SPARAM(5) = SH22 199 GO TO 260 200 250 CONTINUE 201 SPARAM(2) = SH11 202 SPARAM(3) = SH21 203 SPARAM(4) = SH12 204 SPARAM(5) = SH22 205 260 CONTINUE 206 SPARAM(1) = SFLAG 207 RETURN 208 END 209