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