Statistiques
| Révision :

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

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

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