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.
		
		
		
		
		
			
		
			
				
					
					
						
							148 lines
						
					
					
						
							3.6 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							148 lines
						
					
					
						
							3.6 KiB
						
					
					
				
								      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
							 | 
						|
								*     (DX**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)) GO TO 140
							 | 
						|
								      IF (.NOT. (INCX.EQ.INCY.AND.INCX.GT.0)) GO TO 70
							 | 
						|
								*
							 | 
						|
								      NSTEPS = N*INCX
							 | 
						|
								      IF (SFLAG) 50,10,30
							 | 
						|
								   10 CONTINUE
							 | 
						|
								      SH12 = SPARAM(4)
							 | 
						|
								      SH21 = SPARAM(3)
							 | 
						|
								      DO 20 I = 1,NSTEPS,INCX
							 | 
						|
								          W = SX(I)
							 | 
						|
								          Z = SY(I)
							 | 
						|
								          SX(I) = W + Z*SH12
							 | 
						|
								          SY(I) = W*SH21 + Z
							 | 
						|
								   20 CONTINUE
							 | 
						|
								      GO TO 140
							 | 
						|
								   30 CONTINUE
							 | 
						|
								      SH11 = SPARAM(2)
							 | 
						|
								      SH22 = SPARAM(5)
							 | 
						|
								      DO 40 I = 1,NSTEPS,INCX
							 | 
						|
								          W = SX(I)
							 | 
						|
								          Z = SY(I)
							 | 
						|
								          SX(I) = W*SH11 + Z
							 | 
						|
								          SY(I) = -W + SH22*Z
							 | 
						|
								   40 CONTINUE
							 | 
						|
								      GO TO 140
							 | 
						|
								   50 CONTINUE
							 | 
						|
								      SH11 = SPARAM(2)
							 | 
						|
								      SH12 = SPARAM(4)
							 | 
						|
								      SH21 = SPARAM(3)
							 | 
						|
								      SH22 = SPARAM(5)
							 | 
						|
								      DO 60 I = 1,NSTEPS,INCX
							 | 
						|
								          W = SX(I)
							 | 
						|
								          Z = SY(I)
							 | 
						|
								          SX(I) = W*SH11 + Z*SH12
							 | 
						|
								          SY(I) = W*SH21 + Z*SH22
							 | 
						|
								   60 CONTINUE
							 | 
						|
								      GO TO 140
							 | 
						|
								   70 CONTINUE
							 | 
						|
								      KX = 1
							 | 
						|
								      KY = 1
							 | 
						|
								      IF (INCX.LT.0) KX = 1 + (1-N)*INCX
							 | 
						|
								      IF (INCY.LT.0) KY = 1 + (1-N)*INCY
							 | 
						|
								*
							 | 
						|
								      IF (SFLAG) 120,80,100
							 | 
						|
								   80 CONTINUE
							 | 
						|
								      SH12 = SPARAM(4)
							 | 
						|
								      SH21 = SPARAM(3)
							 | 
						|
								      DO 90 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
							 | 
						|
								   90 CONTINUE
							 | 
						|
								      GO TO 140
							 | 
						|
								  100 CONTINUE
							 | 
						|
								      SH11 = SPARAM(2)
							 | 
						|
								      SH22 = SPARAM(5)
							 | 
						|
								      DO 110 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
							 | 
						|
								  110 CONTINUE
							 | 
						|
								      GO TO 140
							 | 
						|
								  120 CONTINUE
							 | 
						|
								      SH11 = SPARAM(2)
							 | 
						|
								      SH12 = SPARAM(4)
							 | 
						|
								      SH21 = SPARAM(3)
							 | 
						|
								      SH22 = SPARAM(5)
							 | 
						|
								      DO 130 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
							 | 
						|
								  130 CONTINUE
							 | 
						|
								  140 CONTINUE
							 | 
						|
								      RETURN
							 | 
						|
								      END
							 |