|
|
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
|