Statistiques
| Révision :

root / src / blas / drotm.f @ 1

Historique | Voir | Annoter | Télécharger (3,68 ko)

1 1 equemene
      SUBROUTINE DROTM(N,DX,INCX,DY,INCY,DPARAM)
2 1 equemene
*     .. Scalar Arguments ..
3 1 equemene
      INTEGER INCX,INCY,N
4 1 equemene
*     ..
5 1 equemene
*     .. Array Arguments ..
6 1 equemene
      DOUBLE PRECISION DPARAM(5),DX(1),DY(1)
7 1 equemene
*     ..
8 1 equemene
*
9 1 equemene
*  Purpose
10 1 equemene
*  =======
11 1 equemene
*
12 1 equemene
*     APPLY THE MODIFIED GIVENS TRANSFORMATION, H, TO THE 2 BY N MATRIX
13 1 equemene
*
14 1 equemene
*     (DX**T) , WHERE **T INDICATES TRANSPOSE. THE ELEMENTS OF DX ARE IN
15 1 equemene
*     (DY**T)
16 1 equemene
*
17 1 equemene
*     DX(LX+I*INCX), I = 0 TO N-1, WHERE LX = 1 IF INCX .GE. 0, ELSE
18 1 equemene
*     LX = (-INCX)*N, AND SIMILARLY FOR SY USING LY AND INCY.
19 1 equemene
*     WITH DPARAM(1)=DFLAG, H HAS ONE OF THE FOLLOWING FORMS..
20 1 equemene
*
21 1 equemene
*     DFLAG=-1.D0     DFLAG=0.D0        DFLAG=1.D0     DFLAG=-2.D0
22 1 equemene
*
23 1 equemene
*       (DH11  DH12)    (1.D0  DH12)    (DH11  1.D0)    (1.D0  0.D0)
24 1 equemene
*     H=(          )    (          )    (          )    (          )
25 1 equemene
*       (DH21  DH22),   (DH21  1.D0),   (-1.D0 DH22),   (0.D0  1.D0).
26 1 equemene
*     SEE DROTMG FOR A DESCRIPTION OF DATA STORAGE IN DPARAM.
27 1 equemene
*
28 1 equemene
*  Arguments
29 1 equemene
*  =========
30 1 equemene
*
31 1 equemene
*  N      (input) INTEGER
32 1 equemene
*         number of elements in input vector(s)
33 1 equemene
*
34 1 equemene
*  DX     (input/output) DOUBLE PRECISION array, dimension N
35 1 equemene
*         double precision vector with 5 elements
36 1 equemene
*
37 1 equemene
*  INCX   (input) INTEGER
38 1 equemene
*         storage spacing between elements of DX
39 1 equemene
*
40 1 equemene
*  DY     (input/output) DOUBLE PRECISION array, dimension N
41 1 equemene
*         double precision vector with N elements
42 1 equemene
*
43 1 equemene
*  INCY   (input) INTEGER
44 1 equemene
*         storage spacing between elements of DY
45 1 equemene
*
46 1 equemene
*  DPARAM (input/output)  DOUBLE PRECISION array, dimension 5
47 1 equemene
*     DPARAM(1)=DFLAG
48 1 equemene
*     DPARAM(2)=DH11
49 1 equemene
*     DPARAM(3)=DH21
50 1 equemene
*     DPARAM(4)=DH12
51 1 equemene
*     DPARAM(5)=DH22
52 1 equemene
*
53 1 equemene
*  =====================================================================
54 1 equemene
*
55 1 equemene
*     .. Local Scalars ..
56 1 equemene
      DOUBLE PRECISION DFLAG,DH11,DH12,DH21,DH22,TWO,W,Z,ZERO
57 1 equemene
      INTEGER I,KX,KY,NSTEPS
58 1 equemene
*     ..
59 1 equemene
*     .. Data statements ..
60 1 equemene
      DATA ZERO,TWO/0.D0,2.D0/
61 1 equemene
*     ..
62 1 equemene
*
63 1 equemene
      DFLAG = DPARAM(1)
64 1 equemene
      IF (N.LE.0 .OR. (DFLAG+TWO.EQ.ZERO)) GO TO 140
65 1 equemene
      IF (.NOT. (INCX.EQ.INCY.AND.INCX.GT.0)) GO TO 70
66 1 equemene
*
67 1 equemene
      NSTEPS = N*INCX
68 1 equemene
      IF (DFLAG) 50,10,30
69 1 equemene
   10 CONTINUE
70 1 equemene
      DH12 = DPARAM(4)
71 1 equemene
      DH21 = DPARAM(3)
72 1 equemene
      DO 20 I = 1,NSTEPS,INCX
73 1 equemene
          W = DX(I)
74 1 equemene
          Z = DY(I)
75 1 equemene
          DX(I) = W + Z*DH12
76 1 equemene
          DY(I) = W*DH21 + Z
77 1 equemene
   20 CONTINUE
78 1 equemene
      GO TO 140
79 1 equemene
   30 CONTINUE
80 1 equemene
      DH11 = DPARAM(2)
81 1 equemene
      DH22 = DPARAM(5)
82 1 equemene
      DO 40 I = 1,NSTEPS,INCX
83 1 equemene
          W = DX(I)
84 1 equemene
          Z = DY(I)
85 1 equemene
          DX(I) = W*DH11 + Z
86 1 equemene
          DY(I) = -W + DH22*Z
87 1 equemene
   40 CONTINUE
88 1 equemene
      GO TO 140
89 1 equemene
   50 CONTINUE
90 1 equemene
      DH11 = DPARAM(2)
91 1 equemene
      DH12 = DPARAM(4)
92 1 equemene
      DH21 = DPARAM(3)
93 1 equemene
      DH22 = DPARAM(5)
94 1 equemene
      DO 60 I = 1,NSTEPS,INCX
95 1 equemene
          W = DX(I)
96 1 equemene
          Z = DY(I)
97 1 equemene
          DX(I) = W*DH11 + Z*DH12
98 1 equemene
          DY(I) = W*DH21 + Z*DH22
99 1 equemene
   60 CONTINUE
100 1 equemene
      GO TO 140
101 1 equemene
   70 CONTINUE
102 1 equemene
      KX = 1
103 1 equemene
      KY = 1
104 1 equemene
      IF (INCX.LT.0) KX = 1 + (1-N)*INCX
105 1 equemene
      IF (INCY.LT.0) KY = 1 + (1-N)*INCY
106 1 equemene
*
107 1 equemene
      IF (DFLAG) 120,80,100
108 1 equemene
   80 CONTINUE
109 1 equemene
      DH12 = DPARAM(4)
110 1 equemene
      DH21 = DPARAM(3)
111 1 equemene
      DO 90 I = 1,N
112 1 equemene
          W = DX(KX)
113 1 equemene
          Z = DY(KY)
114 1 equemene
          DX(KX) = W + Z*DH12
115 1 equemene
          DY(KY) = W*DH21 + Z
116 1 equemene
          KX = KX + INCX
117 1 equemene
          KY = KY + INCY
118 1 equemene
   90 CONTINUE
119 1 equemene
      GO TO 140
120 1 equemene
  100 CONTINUE
121 1 equemene
      DH11 = DPARAM(2)
122 1 equemene
      DH22 = DPARAM(5)
123 1 equemene
      DO 110 I = 1,N
124 1 equemene
          W = DX(KX)
125 1 equemene
          Z = DY(KY)
126 1 equemene
          DX(KX) = W*DH11 + Z
127 1 equemene
          DY(KY) = -W + DH22*Z
128 1 equemene
          KX = KX + INCX
129 1 equemene
          KY = KY + INCY
130 1 equemene
  110 CONTINUE
131 1 equemene
      GO TO 140
132 1 equemene
  120 CONTINUE
133 1 equemene
      DH11 = DPARAM(2)
134 1 equemene
      DH12 = DPARAM(4)
135 1 equemene
      DH21 = DPARAM(3)
136 1 equemene
      DH22 = DPARAM(5)
137 1 equemene
      DO 130 I = 1,N
138 1 equemene
          W = DX(KX)
139 1 equemene
          Z = DY(KY)
140 1 equemene
          DX(KX) = W*DH11 + Z*DH12
141 1 equemene
          DY(KY) = W*DH21 + Z*DH22
142 1 equemene
          KX = KX + INCX
143 1 equemene
          KY = KY + INCY
144 1 equemene
  130 CONTINUE
145 1 equemene
  140 CONTINUE
146 1 equemene
      RETURN
147 1 equemene
      END