Statistiques
| Révision :

root / src / lapack / double / dlasq6.f @ 10

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