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