You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							208 lines
						
					
					
						
							4.7 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							208 lines
						
					
					
						
							4.7 KiB
						
					
					
				|       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
 |