| SUBROUTINE SROTMG(SD1,SD2,SX1,SY1,SPARAM) |
| * .. Scalar Arguments .. |
| REAL SD1,SD2,SX1,SY1 |
| * .. |
| * .. Array Arguments .. |
| REAL SPARAM(5) |
| * .. |
| * |
| * Purpose |
| * ======= |
| * |
| * CONSTRUCT THE MODIFIED GIVENS TRANSFORMATION MATRIX H WHICH ZEROS |
| * THE SECOND COMPONENT OF THE 2-VECTOR (SQRT(SD1)*SX1,SQRT(SD2)* |
| * SY2)**T. |
| * 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). |
| * LOCATIONS 2-4 OF SPARAM CONTAIN SH11,SH21,SH12, AND SH22 |
| * RESPECTIVELY. (VALUES OF 1.E0, -1.E0, OR 0.E0 IMPLIED BY THE |
| * VALUE OF SPARAM(1) ARE NOT STORED IN SPARAM.) |
| * |
| * THE VALUES OF GAMSQ AND RGAMSQ SET IN THE DATA STATEMENT MAY BE |
| * INEXACT. THIS IS OK AS THEY ARE ONLY USED FOR TESTING THE SIZE |
| * OF SD1 AND SD2. ALL ACTUAL SCALING OF DATA IS DONE USING GAM. |
| * |
| * |
| * Arguments |
| * ========= |
| * |
| * |
| * SD1 (input/output) REAL |
| * |
| * SD2 (input/output) REAL |
| * |
| * SX1 (input/output) REAL |
| * |
| * SY1 (input) REAL |
| * |
| * |
| * 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 GAM,GAMSQ,ONE,RGAMSQ,SFLAG,SH11,SH12,SH21,SH22,SP1,SP2,SQ1, |
| + SQ2,STEMP,SU,TWO,ZERO |
| INTEGER IGO |
| * .. |
| * .. Intrinsic Functions .. |
| INTRINSIC ABS |
| * .. |
| * .. Data statements .. |
| * |
| DATA ZERO,ONE,TWO/0.E0,1.E0,2.E0/ |
| DATA GAM,GAMSQ,RGAMSQ/4096.E0,1.67772E7,5.96046E-8/ |
| * .. |
| |
| IF (.NOT.SD1.LT.ZERO) GO TO 10 |
| * GO ZERO-H-D-AND-SX1.. |
| GO TO 60 |
| 10 CONTINUE |
| * CASE-SD1-NONNEGATIVE |
| SP2 = SD2*SY1 |
| IF (.NOT.SP2.EQ.ZERO) GO TO 20 |
| SFLAG = -TWO |
| GO TO 260 |
| * REGULAR-CASE.. |
| 20 CONTINUE |
| SP1 = SD1*SX1 |
| SQ2 = SP2*SY1 |
| SQ1 = SP1*SX1 |
| * |
| IF (.NOT.ABS(SQ1).GT.ABS(SQ2)) GO TO 40 |
| SH21 = -SY1/SX1 |
| SH12 = SP2/SP1 |
| * |
| SU = ONE - SH12*SH21 |
| * |
| IF (.NOT.SU.LE.ZERO) GO TO 30 |
| * GO ZERO-H-D-AND-SX1.. |
| GO TO 60 |
| 30 CONTINUE |
| SFLAG = ZERO |
| SD1 = SD1/SU |
| SD2 = SD2/SU |
| SX1 = SX1*SU |
| * GO SCALE-CHECK.. |
| GO TO 100 |
| 40 CONTINUE |
| IF (.NOT.SQ2.LT.ZERO) GO TO 50 |
| * GO ZERO-H-D-AND-SX1.. |
| GO TO 60 |
| 50 CONTINUE |
| SFLAG = ONE |
| SH11 = SP1/SP2 |
| SH22 = SX1/SY1 |
| SU = ONE + SH11*SH22 |
| STEMP = SD2/SU |
| SD2 = SD1/SU |
| SD1 = STEMP |
| SX1 = SY1*SU |
| * GO SCALE-CHECK |
| GO TO 100 |
| * PROCEDURE..ZERO-H-D-AND-SX1.. |
| 60 CONTINUE |
| SFLAG = -ONE |
| SH11 = ZERO |
| SH12 = ZERO |
| SH21 = ZERO |
| SH22 = ZERO |
| * |
| SD1 = ZERO |
| SD2 = ZERO |
| SX1 = ZERO |
| * RETURN.. |
| GO TO 220 |
| * PROCEDURE..FIX-H.. |
| 70 CONTINUE |
| IF (.NOT.SFLAG.GE.ZERO) GO TO 90 |
| * |
| IF (.NOT.SFLAG.EQ.ZERO) GO TO 80 |
| SH11 = ONE |
| SH22 = ONE |
| SFLAG = -ONE |
| GO TO 90 |
| 80 CONTINUE |
| SH21 = -ONE |
| SH12 = ONE |
| SFLAG = -ONE |
| 90 CONTINUE |
| GO TO IGO(120,150,180,210) |
| * PROCEDURE..SCALE-CHECK |
| 100 CONTINUE |
| 110 CONTINUE |
| IF (.NOT.SD1.LE.RGAMSQ) GO TO 130 |
| IF (SD1.EQ.ZERO) GO TO 160 |
| ASSIGN 120 TO IGO |
| * FIX-H.. |
| GO TO 70 |
| 120 CONTINUE |
| SD1 = SD1*GAM**2 |
| SX1 = SX1/GAM |
| SH11 = SH11/GAM |
| SH12 = SH12/GAM |
| GO TO 110 |
| 130 CONTINUE |
| 140 CONTINUE |
| IF (.NOT.SD1.GE.GAMSQ) GO TO 160 |
| ASSIGN 150 TO IGO |
| * FIX-H.. |
| GO TO 70 |
| 150 CONTINUE |
| SD1 = SD1/GAM**2 |
| SX1 = SX1*GAM |
| SH11 = SH11*GAM |
| SH12 = SH12*GAM |
| GO TO 140 |
| 160 CONTINUE |
| 170 CONTINUE |
| IF (.NOT.ABS(SD2).LE.RGAMSQ) GO TO 190 |
| IF (SD2.EQ.ZERO) GO TO 220 |
| ASSIGN 180 TO IGO |
| * FIX-H.. |
| GO TO 70 |
| 180 CONTINUE |
| SD2 = SD2*GAM**2 |
| SH21 = SH21/GAM |
| SH22 = SH22/GAM |
| GO TO 170 |
| 190 CONTINUE |
| 200 CONTINUE |
| IF (.NOT.ABS(SD2).GE.GAMSQ) GO TO 220 |
| ASSIGN 210 TO IGO |
| * FIX-H.. |
| GO TO 70 |
| 210 CONTINUE |
| SD2 = SD2/GAM**2 |
| SH21 = SH21*GAM |
| SH22 = SH22*GAM |
| GO TO 200 |
| 220 CONTINUE |
| IF (SFLAG) 250,230,240 |
| 230 CONTINUE |
| SPARAM(3) = SH21 |
| SPARAM(4) = SH12 |
| GO TO 260 |
| 240 CONTINUE |
| SPARAM(2) = SH11 |
| SPARAM(5) = SH22 |
| GO TO 260 |
| 250 CONTINUE |
| SPARAM(2) = SH11 |
| SPARAM(3) = SH21 |
| SPARAM(4) = SH12 |
| SPARAM(5) = SH22 |
| 260 CONTINUE |
| SPARAM(1) = SFLAG |
| RETURN |
| END |