Statistiques
| Révision :

root / src / lapack / double / dlasq5.f @ 2

Historique | Voir | Annoter | Télécharger (5,46 ko)

1
      SUBROUTINE DLASQ5( I0, N0, Z, PP, TAU, DMIN, DMIN1, DMIN2, DN,
2
     $                   DNM1, DNM2, IEEE )
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
      LOGICAL            IEEE
16
      INTEGER            I0, N0, PP
17
      DOUBLE PRECISION   DMIN, DMIN1, DMIN2, DN, DNM1, DNM2, TAU
18
*     ..
19
*     .. Array Arguments ..
20
      DOUBLE PRECISION   Z( * )
21
*     ..
22
*
23
*  Purpose
24
*  =======
25
*
26
*  DLASQ5 computes one dqds transform in ping-pong form, one
27
*  version for IEEE machines another for non IEEE machines.
28
*
29
*  Arguments
30
*  =========
31
*
32
*  I0    (input) INTEGER
33
*        First index.
34
*
35
*  N0    (input) INTEGER
36
*        Last index.
37
*
38
*  Z     (input) DOUBLE PRECISION array, dimension ( 4*N )
39
*        Z holds the qd array. EMIN is stored in Z(4*N0) to avoid
40
*        an extra argument.
41
*
42
*  PP    (input) INTEGER
43
*        PP=0 for ping, PP=1 for pong.
44
*
45
*  TAU   (input) DOUBLE PRECISION
46
*        This is the shift.
47
*
48
*  DMIN  (output) DOUBLE PRECISION
49
*        Minimum value of d.
50
*
51
*  DMIN1 (output) DOUBLE PRECISION
52
*        Minimum value of d, excluding D( N0 ).
53
*
54
*  DMIN2 (output) DOUBLE PRECISION
55
*        Minimum value of d, excluding D( N0 ) and D( N0-1 ).
56
*
57
*  DN    (output) DOUBLE PRECISION
58
*        d(N0), the last value of d.
59
*
60
*  DNM1  (output) DOUBLE PRECISION
61
*        d(N0-1).
62
*
63
*  DNM2  (output) DOUBLE PRECISION
64
*        d(N0-2).
65
*
66
*  IEEE  (input) LOGICAL
67
*        Flag for IEEE or non IEEE arithmetic.
68
*
69
*  =====================================================================
70
*
71
*     .. Parameter ..
72
      DOUBLE PRECISION   ZERO
73
      PARAMETER          ( ZERO = 0.0D0 )
74
*     ..
75
*     .. Local Scalars ..
76
      INTEGER            J4, J4P2
77
      DOUBLE PRECISION   D, EMIN, TEMP
78
*     ..
79
*     .. Intrinsic Functions ..
80
      INTRINSIC          MIN
81
*     ..
82
*     .. Executable Statements ..
83
*
84
      IF( ( N0-I0-1 ).LE.0 )
85
     $   RETURN
86
*
87
      J4 = 4*I0 + PP - 3
88
      EMIN = Z( J4+4 ) 
89
      D = Z( J4 ) - TAU
90
      DMIN = D
91
      DMIN1 = -Z( J4 )
92
*
93
      IF( IEEE ) THEN
94
*
95
*        Code for IEEE arithmetic.
96
*
97
         IF( PP.EQ.0 ) THEN
98
            DO 10 J4 = 4*I0, 4*( N0-3 ), 4
99
               Z( J4-2 ) = D + Z( J4-1 ) 
100
               TEMP = Z( J4+1 ) / Z( J4-2 )
101
               D = D*TEMP - TAU
102
               DMIN = MIN( DMIN, D )
103
               Z( J4 ) = Z( J4-1 )*TEMP
104
               EMIN = MIN( Z( J4 ), EMIN )
105
   10       CONTINUE
106
         ELSE
107
            DO 20 J4 = 4*I0, 4*( N0-3 ), 4
108
               Z( J4-3 ) = D + Z( J4 ) 
109
               TEMP = Z( J4+2 ) / Z( J4-3 )
110
               D = D*TEMP - TAU
111
               DMIN = MIN( DMIN, D )
112
               Z( J4-1 ) = Z( J4 )*TEMP
113
               EMIN = MIN( Z( J4-1 ), EMIN )
114
   20       CONTINUE
115
         END IF
116
*
117
*        Unroll last two steps. 
118
*
119
         DNM2 = D
120
         DMIN2 = DMIN
121
         J4 = 4*( N0-2 ) - PP
122
         J4P2 = J4 + 2*PP - 1
123
         Z( J4-2 ) = DNM2 + Z( J4P2 )
124
         Z( J4 ) = Z( J4P2+2 )*( Z( J4P2 ) / Z( J4-2 ) )
125
         DNM1 = Z( J4P2+2 )*( DNM2 / Z( J4-2 ) ) - TAU
126
         DMIN = MIN( DMIN, DNM1 )
127
*
128
         DMIN1 = DMIN
129
         J4 = J4 + 4
130
         J4P2 = J4 + 2*PP - 1
131
         Z( J4-2 ) = DNM1 + Z( J4P2 )
132
         Z( J4 ) = Z( J4P2+2 )*( Z( J4P2 ) / Z( J4-2 ) )
133
         DN = Z( J4P2+2 )*( DNM1 / Z( J4-2 ) ) - TAU
134
         DMIN = MIN( DMIN, DN )
135
*
136
      ELSE
137
*
138
*        Code for non IEEE arithmetic.
139
*
140
         IF( PP.EQ.0 ) THEN
141
            DO 30 J4 = 4*I0, 4*( N0-3 ), 4
142
               Z( J4-2 ) = D + Z( J4-1 ) 
143
               IF( D.LT.ZERO ) THEN
144
                  RETURN
145
               ELSE 
146
                  Z( J4 ) = Z( J4+1 )*( Z( J4-1 ) / Z( J4-2 ) )
147
                  D = Z( J4+1 )*( D / Z( J4-2 ) ) - TAU
148
               END IF
149
               DMIN = MIN( DMIN, D )
150
               EMIN = MIN( EMIN, Z( J4 ) )
151
   30       CONTINUE
152
         ELSE
153
            DO 40 J4 = 4*I0, 4*( N0-3 ), 4
154
               Z( J4-3 ) = D + Z( J4 ) 
155
               IF( D.LT.ZERO ) THEN
156
                  RETURN
157
               ELSE 
158
                  Z( J4-1 ) = Z( J4+2 )*( Z( J4 ) / Z( J4-3 ) )
159
                  D = Z( J4+2 )*( D / Z( J4-3 ) ) - TAU
160
               END IF
161
               DMIN = MIN( DMIN, D )
162
               EMIN = MIN( EMIN, Z( J4-1 ) )
163
   40       CONTINUE
164
         END IF
165
*
166
*        Unroll last two steps. 
167
*
168
         DNM2 = D
169
         DMIN2 = DMIN
170
         J4 = 4*( N0-2 ) - PP
171
         J4P2 = J4 + 2*PP - 1
172
         Z( J4-2 ) = DNM2 + Z( J4P2 )
173
         IF( DNM2.LT.ZERO ) THEN
174
            RETURN
175
         ELSE
176
            Z( J4 ) = Z( J4P2+2 )*( Z( J4P2 ) / Z( J4-2 ) )
177
            DNM1 = Z( J4P2+2 )*( DNM2 / Z( J4-2 ) ) - TAU
178
         END IF
179
         DMIN = MIN( DMIN, DNM1 )
180
*
181
         DMIN1 = DMIN
182
         J4 = J4 + 4
183
         J4P2 = J4 + 2*PP - 1
184
         Z( J4-2 ) = DNM1 + Z( J4P2 )
185
         IF( DNM1.LT.ZERO ) THEN
186
            RETURN
187
         ELSE
188
            Z( J4 ) = Z( J4P2+2 )*( Z( J4P2 ) / Z( J4-2 ) )
189
            DN = Z( J4P2+2 )*( DNM1 / Z( J4-2 ) ) - TAU
190
         END IF
191
         DMIN = MIN( DMIN, DN )
192
*
193
      END IF
194
*
195
      Z( J4+2 ) = DN
196
      Z( 4*N0-PP ) = EMIN
197
      RETURN
198
*
199
*     End of DLASQ5
200
*
201
      END