109 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Fortran
		
	
	
	
			
		
		
	
	
			109 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Fortran
		
	
	
	
      SUBROUTINE DROTMF (N,DX,INCX,DY,INCY,DPARAM)
 | 
						|
C
 | 
						|
C     APPLY THE MODIFIED GIVENS TRANSFORMATION, H, TO THE 2 BY N MATRIX
 | 
						|
C
 | 
						|
C     (DX**T) , WHERE **T INDICATES TRANSPOSE. THE ELEMENTS OF DX ARE IN
 | 
						|
C     (DY**T)
 | 
						|
C
 | 
						|
C     DX(LX+I*INCX), I = 0 TO N-1, WHERE LX = 1 IF INCX .GE. 0, ELSE
 | 
						|
C     LX = (-INCX)*N, AND SIMILARLY FOR SY USING LY AND INCY.
 | 
						|
C     WITH DPARAM(1)=DFLAG, H HAS ONE OF THE FOLLOWING FORMS..
 | 
						|
C
 | 
						|
C     DFLAG=-1.D0     DFLAG=0.D0        DFLAG=1.D0     DFLAG=-2.D0
 | 
						|
C
 | 
						|
C       (DH11  DH12)    (1.D0  DH12)    (DH11  1.D0)    (1.D0  0.D0)
 | 
						|
C     H=(          )    (          )    (          )    (          )
 | 
						|
C       (DH21  DH22),   (DH21  1.D0),   (-1.D0 DH22),   (0.D0  1.D0).
 | 
						|
C     SEE DROTMG FOR A DESCRIPTION OF DATA STORAGE IN DPARAM.
 | 
						|
C
 | 
						|
      DOUBLE PRECISION DFLAG,DH12,DH22,DX,TWO,Z,DH11,DH21,
 | 
						|
     1 DPARAM,DY,W,ZERO
 | 
						|
      DIMENSION DX(1),DY(1),DPARAM(5)
 | 
						|
      DATA ZERO,TWO/0.D0,2.D0/
 | 
						|
C
 | 
						|
      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
 | 
						|
C
 | 
						|
               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
 | 
						|
C
 | 
						|
          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
 |