root / src / lapack / double / dlasq6.f @ 2
Historique | Voir | Annoter | Télécharger (5,09 ko)
1 |
SUBROUTINE DLASQ6( I0, N0, Z, PP, DMIN, DMIN1, DMIN2, DN, |
---|---|
2 |
$ DNM1, DNM2 ) |
3 |
* |
4 |
* -- LAPACK routine (version 3.2) -- |
5 |
* |
6 |
* -- Contributed by Osni Marques of the Lawrence Berkeley National -- |
7 |
* -- Laboratory and Beresford Parlett of the Univ. of California at -- |
8 |
* -- Berkeley -- |
9 |
* -- November 2008 -- |
10 |
* |
11 |
* -- LAPACK is a software package provided by Univ. of Tennessee, -- |
12 |
* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- |
13 |
* |
14 |
* .. Scalar Arguments .. |
15 |
INTEGER I0, N0, PP |
16 |
DOUBLE PRECISION DMIN, DMIN1, DMIN2, DN, DNM1, DNM2 |
17 |
* .. |
18 |
* .. Array Arguments .. |
19 |
DOUBLE PRECISION Z( * ) |
20 |
* .. |
21 |
* |
22 |
* Purpose |
23 |
* ======= |
24 |
* |
25 |
* DLASQ6 computes one dqd (shift equal to zero) transform in |
26 |
* ping-pong form, with protection against underflow and overflow. |
27 |
* |
28 |
* Arguments |
29 |
* ========= |
30 |
* |
31 |
* I0 (input) INTEGER |
32 |
* First index. |
33 |
* |
34 |
* N0 (input) INTEGER |
35 |
* Last index. |
36 |
* |
37 |
* Z (input) DOUBLE PRECISION array, dimension ( 4*N ) |
38 |
* Z holds the qd array. EMIN is stored in Z(4*N0) to avoid |
39 |
* an extra argument. |
40 |
* |
41 |
* PP (input) INTEGER |
42 |
* PP=0 for ping, PP=1 for pong. |
43 |
* |
44 |
* DMIN (output) DOUBLE PRECISION |
45 |
* Minimum value of d. |
46 |
* |
47 |
* DMIN1 (output) DOUBLE PRECISION |
48 |
* Minimum value of d, excluding D( N0 ). |
49 |
* |
50 |
* DMIN2 (output) DOUBLE PRECISION |
51 |
* Minimum value of d, excluding D( N0 ) and D( N0-1 ). |
52 |
* |
53 |
* DN (output) DOUBLE PRECISION |
54 |
* d(N0), the last value of d. |
55 |
* |
56 |
* DNM1 (output) DOUBLE PRECISION |
57 |
* d(N0-1). |
58 |
* |
59 |
* DNM2 (output) DOUBLE PRECISION |
60 |
* d(N0-2). |
61 |
* |
62 |
* ===================================================================== |
63 |
* |
64 |
* .. Parameter .. |
65 |
DOUBLE PRECISION ZERO |
66 |
PARAMETER ( ZERO = 0.0D0 ) |
67 |
* .. |
68 |
* .. Local Scalars .. |
69 |
INTEGER J4, J4P2 |
70 |
DOUBLE PRECISION D, EMIN, SAFMIN, TEMP |
71 |
* .. |
72 |
* .. External Function .. |
73 |
DOUBLE PRECISION DLAMCH |
74 |
EXTERNAL DLAMCH |
75 |
* .. |
76 |
* .. Intrinsic Functions .. |
77 |
INTRINSIC MIN |
78 |
* .. |
79 |
* .. Executable Statements .. |
80 |
* |
81 |
IF( ( N0-I0-1 ).LE.0 ) |
82 |
$ RETURN |
83 |
* |
84 |
SAFMIN = DLAMCH( 'Safe minimum' ) |
85 |
J4 = 4*I0 + PP - 3 |
86 |
EMIN = Z( J4+4 ) |
87 |
D = Z( J4 ) |
88 |
DMIN = D |
89 |
* |
90 |
IF( PP.EQ.0 ) THEN |
91 |
DO 10 J4 = 4*I0, 4*( N0-3 ), 4 |
92 |
Z( J4-2 ) = D + Z( J4-1 ) |
93 |
IF( Z( J4-2 ).EQ.ZERO ) THEN |
94 |
Z( J4 ) = ZERO |
95 |
D = Z( J4+1 ) |
96 |
DMIN = D |
97 |
EMIN = ZERO |
98 |
ELSE IF( SAFMIN*Z( J4+1 ).LT.Z( J4-2 ) .AND. |
99 |
$ SAFMIN*Z( J4-2 ).LT.Z( J4+1 ) ) THEN |
100 |
TEMP = Z( J4+1 ) / Z( J4-2 ) |
101 |
Z( J4 ) = Z( J4-1 )*TEMP |
102 |
D = D*TEMP |
103 |
ELSE |
104 |
Z( J4 ) = Z( J4+1 )*( Z( J4-1 ) / Z( J4-2 ) ) |
105 |
D = Z( J4+1 )*( D / Z( J4-2 ) ) |
106 |
END IF |
107 |
DMIN = MIN( DMIN, D ) |
108 |
EMIN = MIN( EMIN, Z( J4 ) ) |
109 |
10 CONTINUE |
110 |
ELSE |
111 |
DO 20 J4 = 4*I0, 4*( N0-3 ), 4 |
112 |
Z( J4-3 ) = D + Z( J4 ) |
113 |
IF( Z( J4-3 ).EQ.ZERO ) THEN |
114 |
Z( J4-1 ) = ZERO |
115 |
D = Z( J4+2 ) |
116 |
DMIN = D |
117 |
EMIN = ZERO |
118 |
ELSE IF( SAFMIN*Z( J4+2 ).LT.Z( J4-3 ) .AND. |
119 |
$ SAFMIN*Z( J4-3 ).LT.Z( J4+2 ) ) THEN |
120 |
TEMP = Z( J4+2 ) / Z( J4-3 ) |
121 |
Z( J4-1 ) = Z( J4 )*TEMP |
122 |
D = D*TEMP |
123 |
ELSE |
124 |
Z( J4-1 ) = Z( J4+2 )*( Z( J4 ) / Z( J4-3 ) ) |
125 |
D = Z( J4+2 )*( D / Z( J4-3 ) ) |
126 |
END IF |
127 |
DMIN = MIN( DMIN, D ) |
128 |
EMIN = MIN( EMIN, Z( J4-1 ) ) |
129 |
20 CONTINUE |
130 |
END IF |
131 |
* |
132 |
* Unroll last two steps. |
133 |
* |
134 |
DNM2 = D |
135 |
DMIN2 = DMIN |
136 |
J4 = 4*( N0-2 ) - PP |
137 |
J4P2 = J4 + 2*PP - 1 |
138 |
Z( J4-2 ) = DNM2 + Z( J4P2 ) |
139 |
IF( Z( J4-2 ).EQ.ZERO ) THEN |
140 |
Z( J4 ) = ZERO |
141 |
DNM1 = Z( J4P2+2 ) |
142 |
DMIN = DNM1 |
143 |
EMIN = ZERO |
144 |
ELSE IF( SAFMIN*Z( J4P2+2 ).LT.Z( J4-2 ) .AND. |
145 |
$ SAFMIN*Z( J4-2 ).LT.Z( J4P2+2 ) ) THEN |
146 |
TEMP = Z( J4P2+2 ) / Z( J4-2 ) |
147 |
Z( J4 ) = Z( J4P2 )*TEMP |
148 |
DNM1 = DNM2*TEMP |
149 |
ELSE |
150 |
Z( J4 ) = Z( J4P2+2 )*( Z( J4P2 ) / Z( J4-2 ) ) |
151 |
DNM1 = Z( J4P2+2 )*( DNM2 / Z( J4-2 ) ) |
152 |
END IF |
153 |
DMIN = MIN( DMIN, DNM1 ) |
154 |
* |
155 |
DMIN1 = DMIN |
156 |
J4 = J4 + 4 |
157 |
J4P2 = J4 + 2*PP - 1 |
158 |
Z( J4-2 ) = DNM1 + Z( J4P2 ) |
159 |
IF( Z( J4-2 ).EQ.ZERO ) THEN |
160 |
Z( J4 ) = ZERO |
161 |
DN = Z( J4P2+2 ) |
162 |
DMIN = DN |
163 |
EMIN = ZERO |
164 |
ELSE IF( SAFMIN*Z( J4P2+2 ).LT.Z( J4-2 ) .AND. |
165 |
$ SAFMIN*Z( J4-2 ).LT.Z( J4P2+2 ) ) THEN |
166 |
TEMP = Z( J4P2+2 ) / Z( J4-2 ) |
167 |
Z( J4 ) = Z( J4P2 )*TEMP |
168 |
DN = DNM1*TEMP |
169 |
ELSE |
170 |
Z( J4 ) = Z( J4P2+2 )*( Z( J4P2 ) / Z( J4-2 ) ) |
171 |
DN = Z( J4P2+2 )*( DNM1 / Z( J4-2 ) ) |
172 |
END IF |
173 |
DMIN = MIN( DMIN, DN ) |
174 |
* |
175 |
Z( J4+2 ) = DN |
176 |
Z( 4*N0-PP ) = EMIN |
177 |
RETURN |
178 |
* |
179 |
* End of DLASQ6 |
180 |
* |
181 |
END |