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.
		
		
		
		
		
			
		
			
				
					
					
						
							147 lines
						
					
					
						
							3.7 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							147 lines
						
					
					
						
							3.7 KiB
						
					
					
				
								      SUBROUTINE DROTM(N,DX,INCX,DY,INCY,DPARAM)
							 | 
						|
								*     .. Scalar Arguments ..
							 | 
						|
								      INTEGER INCX,INCY,N
							 | 
						|
								*     ..
							 | 
						|
								*     .. Array Arguments ..
							 | 
						|
								      DOUBLE PRECISION DPARAM(5),DX(*),DY(*)
							 | 
						|
								*     ..
							 | 
						|
								*
							 | 
						|
								*  Purpose
							 | 
						|
								*  =======
							 | 
						|
								*
							 | 
						|
								*     APPLY THE MODIFIED GIVENS TRANSFORMATION, H, TO THE 2 BY N MATRIX
							 | 
						|
								*
							 | 
						|
								*     (DX**T) , WHERE **T INDICATES TRANSPOSE. THE ELEMENTS OF DX ARE IN
							 | 
						|
								*     (DY**T)
							 | 
						|
								*
							 | 
						|
								*     DX(LX+I*INCX), I = 0 TO N-1, WHERE LX = 1 IF INCX .GE. 0, ELSE
							 | 
						|
								*     LX = (-INCX)*N, AND SIMILARLY FOR SY USING LY AND INCY.
							 | 
						|
								*     WITH DPARAM(1)=DFLAG, H HAS ONE OF THE FOLLOWING FORMS..
							 | 
						|
								*
							 | 
						|
								*     DFLAG=-1.D0     DFLAG=0.D0        DFLAG=1.D0     DFLAG=-2.D0
							 | 
						|
								*
							 | 
						|
								*       (DH11  DH12)    (1.D0  DH12)    (DH11  1.D0)    (1.D0  0.D0)
							 | 
						|
								*     H=(          )    (          )    (          )    (          )
							 | 
						|
								*       (DH21  DH22),   (DH21  1.D0),   (-1.D0 DH22),   (0.D0  1.D0).
							 | 
						|
								*     SEE DROTMG FOR A DESCRIPTION OF DATA STORAGE IN DPARAM.
							 | 
						|
								*
							 | 
						|
								*  Arguments
							 | 
						|
								*  =========
							 | 
						|
								*
							 | 
						|
								*  N      (input) INTEGER
							 | 
						|
								*         number of elements in input vector(s)
							 | 
						|
								*
							 | 
						|
								*  DX     (input/output) DOUBLE PRECISION array, dimension N
							 | 
						|
								*         double precision vector with N elements
							 | 
						|
								*
							 | 
						|
								*  INCX   (input) INTEGER
							 | 
						|
								*         storage spacing between elements of DX
							 | 
						|
								*
							 | 
						|
								*  DY     (input/output) DOUBLE PRECISION array, dimension N
							 | 
						|
								*         double precision vector with N elements
							 | 
						|
								*
							 | 
						|
								*  INCY   (input) INTEGER
							 | 
						|
								*         storage spacing between elements of DY
							 | 
						|
								*
							 | 
						|
								*  DPARAM (input/output)  DOUBLE PRECISION array, dimension 5 
							 | 
						|
								*     DPARAM(1)=DFLAG
							 | 
						|
								*     DPARAM(2)=DH11
							 | 
						|
								*     DPARAM(3)=DH21
							 | 
						|
								*     DPARAM(4)=DH12
							 | 
						|
								*     DPARAM(5)=DH22
							 | 
						|
								*
							 | 
						|
								*  =====================================================================
							 | 
						|
								*
							 | 
						|
								*     .. Local Scalars ..
							 | 
						|
								      DOUBLE PRECISION DFLAG,DH11,DH12,DH21,DH22,TWO,W,Z,ZERO
							 | 
						|
								      INTEGER I,KX,KY,NSTEPS
							 | 
						|
								*     ..
							 | 
						|
								*     .. Data statements ..
							 | 
						|
								      DATA ZERO,TWO/0.D0,2.D0/
							 | 
						|
								*     ..
							 | 
						|
								*
							 | 
						|
								      DFLAG = DPARAM(1)
							 | 
						|
								      IF (N.LE.0 .OR. (DFLAG+TWO.EQ.ZERO)) GO TO 140
							 | 
						|
								      IF (.NOT. (INCX.EQ.INCY.AND.INCX.GT.0)) GO TO 70
							 | 
						|
								*
							 | 
						|
								      NSTEPS = N*INCX
							 | 
						|
								      IF (DFLAG) 50,10,30
							 | 
						|
								   10 CONTINUE
							 | 
						|
								      DH12 = DPARAM(4)
							 | 
						|
								      DH21 = DPARAM(3)
							 | 
						|
								      DO 20 I = 1,NSTEPS,INCX
							 | 
						|
								          W = DX(I)
							 | 
						|
								          Z = DY(I)
							 | 
						|
								          DX(I) = W + Z*DH12
							 | 
						|
								          DY(I) = W*DH21 + Z
							 | 
						|
								   20 CONTINUE
							 | 
						|
								      GO TO 140
							 | 
						|
								   30 CONTINUE
							 | 
						|
								      DH11 = DPARAM(2)
							 | 
						|
								      DH22 = DPARAM(5)
							 | 
						|
								      DO 40 I = 1,NSTEPS,INCX
							 | 
						|
								          W = DX(I)
							 | 
						|
								          Z = DY(I)
							 | 
						|
								          DX(I) = W*DH11 + Z
							 | 
						|
								          DY(I) = -W + DH22*Z
							 | 
						|
								   40 CONTINUE
							 | 
						|
								      GO TO 140
							 | 
						|
								   50 CONTINUE
							 | 
						|
								      DH11 = DPARAM(2)
							 | 
						|
								      DH12 = DPARAM(4)
							 | 
						|
								      DH21 = DPARAM(3)
							 | 
						|
								      DH22 = DPARAM(5)
							 | 
						|
								      DO 60 I = 1,NSTEPS,INCX
							 | 
						|
								          W = DX(I)
							 | 
						|
								          Z = DY(I)
							 | 
						|
								          DX(I) = W*DH11 + Z*DH12
							 | 
						|
								          DY(I) = W*DH21 + Z*DH22
							 | 
						|
								   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 (DFLAG) 120,80,100
							 | 
						|
								   80 CONTINUE
							 | 
						|
								      DH12 = DPARAM(4)
							 | 
						|
								      DH21 = DPARAM(3)
							 | 
						|
								      DO 90 I = 1,N
							 | 
						|
								          W = DX(KX)
							 | 
						|
								          Z = DY(KY)
							 | 
						|
								          DX(KX) = W + Z*DH12
							 | 
						|
								          DY(KY) = W*DH21 + Z
							 | 
						|
								          KX = KX + INCX
							 | 
						|
								          KY = KY + INCY
							 | 
						|
								   90 CONTINUE
							 | 
						|
								      GO TO 140
							 | 
						|
								  100 CONTINUE
							 | 
						|
								      DH11 = DPARAM(2)
							 | 
						|
								      DH22 = DPARAM(5)
							 | 
						|
								      DO 110 I = 1,N
							 | 
						|
								          W = DX(KX)
							 | 
						|
								          Z = DY(KY)
							 | 
						|
								          DX(KX) = W*DH11 + Z
							 | 
						|
								          DY(KY) = -W + DH22*Z
							 | 
						|
								          KX = KX + INCX
							 | 
						|
								          KY = KY + INCY
							 | 
						|
								  110 CONTINUE
							 | 
						|
								      GO TO 140
							 | 
						|
								  120 CONTINUE
							 | 
						|
								      DH11 = DPARAM(2)
							 | 
						|
								      DH12 = DPARAM(4)
							 | 
						|
								      DH21 = DPARAM(3)
							 | 
						|
								      DH22 = DPARAM(5)
							 | 
						|
								      DO 130 I = 1,N
							 | 
						|
								          W = DX(KX)
							 | 
						|
								          Z = DY(KY)
							 | 
						|
								          DX(KX) = W*DH11 + Z*DH12
							 | 
						|
								          DY(KY) = W*DH21 + Z*DH22
							 | 
						|
								          KX = KX + INCX
							 | 
						|
								          KY = KY + INCY
							 | 
						|
								  130 CONTINUE
							 | 
						|
								  140 CONTINUE
							 | 
						|
								      RETURN
							 | 
						|
								      END
							 |