MoDeNa  1.0
Software framework facilitating sequential multi-scale modelling
dlasq5.f
1 *> \brief \b DLASQ5
2 *
3 * =========== DOCUMENTATION ===========
4 *
5 * Online html documentation available at
6 * http://www.netlib.org/lapack/explore-html/
7 *
8 *> \htmlonly
9 *> Download DLASQ5 + dependencies
10 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/dlasq5.f">
11 *> [TGZ]</a>
12 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/dlasq5.f">
13 *> [ZIP]</a>
14 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/dlasq5.f">
15 *> [TXT]</a>
16 *> \endhtmlonly
17 *
18 * Definition:
19 * ===========
20 *
21 * SUBROUTINE DLASQ5( I0, N0, Z, PP, TAU, DMIN, DMIN1, DMIN2, DN,
22 * DNM1, DNM2, IEEE )
23 *
24 * .. Scalar Arguments ..
25 * LOGICAL IEEE
26 * INTEGER I0, N0, PP
27 * DOUBLE PRECISION DMIN, DMIN1, DMIN2, DN, DNM1, DNM2, TAU
28 * ..
29 * .. Array Arguments ..
30 * DOUBLE PRECISION Z( * )
31 * ..
32 *
33 *
34 *> \par Purpose:
35 * =============
36 *>
37 *> \verbatim
38 *>
39 *> DLASQ5 computes one dqds transform in ping-pong form, one
40 *> version for IEEE machines another for non IEEE machines.
41 *> \endverbatim
42 *
43 * Arguments:
44 * ==========
45 *
46 *> \param[in] I0
47 *> \verbatim
48 *> I0 is INTEGER
49 *> First index.
50 *> \endverbatim
51 *>
52 *> \param[in] N0
53 *> \verbatim
54 *> N0 is INTEGER
55 *> Last index.
56 *> \endverbatim
57 *>
58 *> \param[in] Z
59 *> \verbatim
60 *> Z is DOUBLE PRECISION array, dimension ( 4*N )
61 *> Z holds the qd array. EMIN is stored in Z(4*N0) to avoid
62 *> an extra argument.
63 *> \endverbatim
64 *>
65 *> \param[in] PP
66 *> \verbatim
67 *> PP is INTEGER
68 *> PP=0 for ping, PP=1 for pong.
69 *> \endverbatim
70 *>
71 *> \param[in] TAU
72 *> \verbatim
73 *> TAU is DOUBLE PRECISION
74 *> This is the shift.
75 *> \endverbatim
76 *>
77 *> \param[out] DMIN
78 *> \verbatim
79 *> DMIN is DOUBLE PRECISION
80 *> Minimum value of d.
81 *> \endverbatim
82 *>
83 *> \param[out] DMIN1
84 *> \verbatim
85 *> DMIN1 is DOUBLE PRECISION
86 *> Minimum value of d, excluding D( N0 ).
87 *> \endverbatim
88 *>
89 *> \param[out] DMIN2
90 *> \verbatim
91 *> DMIN2 is DOUBLE PRECISION
92 *> Minimum value of d, excluding D( N0 ) and D( N0-1 ).
93 *> \endverbatim
94 *>
95 *> \param[out] DN
96 *> \verbatim
97 *> DN is DOUBLE PRECISION
98 *> d(N0), the last value of d.
99 *> \endverbatim
100 *>
101 *> \param[out] DNM1
102 *> \verbatim
103 *> DNM1 is DOUBLE PRECISION
104 *> d(N0-1).
105 *> \endverbatim
106 *>
107 *> \param[out] DNM2
108 *> \verbatim
109 *> DNM2 is DOUBLE PRECISION
110 *> d(N0-2).
111 *> \endverbatim
112 *>
113 *> \param[in] IEEE
114 *> \verbatim
115 *> IEEE is LOGICAL
116 *> Flag for IEEE or non IEEE arithmetic.
117 *> \endverbatim
118 *
119 * Authors:
120 * ========
121 *
122 *> \author Univ. of Tennessee
123 *> \author Univ. of California Berkeley
124 *> \author Univ. of Colorado Denver
125 *> \author NAG Ltd.
126 *
127 *> \date November 2011
128 *
129 *> \ingroup auxOTHERcomputational
130 *
131 * =====================================================================
132  SUBROUTINE dlasq5( I0, N0, Z, PP, TAU, DMIN, DMIN1, DMIN2, DN,
133  $ DNM1, DNM2, IEEE )
134 *
135 * -- LAPACK computational routine (version 3.4.0) --
136 * -- LAPACK is a software package provided by Univ. of Tennessee, --
137 * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
138 * November 2011
139 *
140 * .. Scalar Arguments ..
141  LOGICAL ieee
142  INTEGER i0, n0, pp
143  DOUBLE PRECISION dmin, dmin1, dmin2, dn, dnm1, dnm2, tau
144 * ..
145 * .. Array Arguments ..
146  DOUBLE PRECISION z( * )
147 * ..
148 *
149 * =====================================================================
150 *
151 * .. Parameter ..
152  DOUBLE PRECISION zero
153  parameter( zero = 0.0d0 )
154 * ..
155 * .. Local Scalars ..
156  INTEGER j4, j4p2
157  DOUBLE PRECISION d, emin, temp
158 * ..
159 * .. Intrinsic Functions ..
160  INTRINSIC min
161 * ..
162 * .. Executable Statements ..
163 *
164  IF( ( n0-i0-1 ).LE.0 )
165  $ RETURN
166 *
167  j4 = 4*i0 + pp - 3
168  emin = z( j4+4 )
169  d = z( j4 ) - tau
170  dmin = d
171  dmin1 = -z( j4 )
172 *
173  IF( ieee ) THEN
174 *
175 * Code for IEEE arithmetic.
176 *
177  IF( pp.EQ.0 ) THEN
178  DO 10 j4 = 4*i0, 4*( n0-3 ), 4
179  z( j4-2 ) = d + z( j4-1 )
180  temp = z( j4+1 ) / z( j4-2 )
181  d = d*temp - tau
182  dmin = min( dmin, d )
183  z( j4 ) = z( j4-1 )*temp
184  emin = min( z( j4 ), emin )
185  10 CONTINUE
186  ELSE
187  DO 20 j4 = 4*i0, 4*( n0-3 ), 4
188  z( j4-3 ) = d + z( j4 )
189  temp = z( j4+2 ) / z( j4-3 )
190  d = d*temp - tau
191  dmin = min( dmin, d )
192  z( j4-1 ) = z( j4 )*temp
193  emin = min( z( j4-1 ), emin )
194  20 CONTINUE
195  END IF
196 *
197 * Unroll last two steps.
198 *
199  dnm2 = d
200  dmin2 = dmin
201  j4 = 4*( n0-2 ) - pp
202  j4p2 = j4 + 2*pp - 1
203  z( j4-2 ) = dnm2 + z( j4p2 )
204  z( j4 ) = z( j4p2+2 )*( z( j4p2 ) / z( j4-2 ) )
205  dnm1 = z( j4p2+2 )*( dnm2 / z( j4-2 ) ) - tau
206  dmin = min( dmin, dnm1 )
207 *
208  dmin1 = dmin
209  j4 = j4 + 4
210  j4p2 = j4 + 2*pp - 1
211  z( j4-2 ) = dnm1 + z( j4p2 )
212  z( j4 ) = z( j4p2+2 )*( z( j4p2 ) / z( j4-2 ) )
213  dn = z( j4p2+2 )*( dnm1 / z( j4-2 ) ) - tau
214  dmin = min( dmin, dn )
215 *
216  ELSE
217 *
218 * Code for non IEEE arithmetic.
219 *
220  IF( pp.EQ.0 ) THEN
221  DO 30 j4 = 4*i0, 4*( n0-3 ), 4
222  z( j4-2 ) = d + z( j4-1 )
223  IF( d.LT.zero ) THEN
224  RETURN
225  ELSE
226  z( j4 ) = z( j4+1 )*( z( j4-1 ) / z( j4-2 ) )
227  d = z( j4+1 )*( d / z( j4-2 ) ) - tau
228  END IF
229  dmin = min( dmin, d )
230  emin = min( emin, z( j4 ) )
231  30 CONTINUE
232  ELSE
233  DO 40 j4 = 4*i0, 4*( n0-3 ), 4
234  z( j4-3 ) = d + z( j4 )
235  IF( d.LT.zero ) THEN
236  RETURN
237  ELSE
238  z( j4-1 ) = z( j4+2 )*( z( j4 ) / z( j4-3 ) )
239  d = z( j4+2 )*( d / z( j4-3 ) ) - tau
240  END IF
241  dmin = min( dmin, d )
242  emin = min( emin, z( j4-1 ) )
243  40 CONTINUE
244  END IF
245 *
246 * Unroll last two steps.
247 *
248  dnm2 = d
249  dmin2 = dmin
250  j4 = 4*( n0-2 ) - pp
251  j4p2 = j4 + 2*pp - 1
252  z( j4-2 ) = dnm2 + z( j4p2 )
253  IF( dnm2.LT.zero ) THEN
254  RETURN
255  ELSE
256  z( j4 ) = z( j4p2+2 )*( z( j4p2 ) / z( j4-2 ) )
257  dnm1 = z( j4p2+2 )*( dnm2 / z( j4-2 ) ) - tau
258  END IF
259  dmin = min( dmin, dnm1 )
260 *
261  dmin1 = dmin
262  j4 = j4 + 4
263  j4p2 = j4 + 2*pp - 1
264  z( j4-2 ) = dnm1 + z( j4p2 )
265  IF( dnm1.LT.zero ) THEN
266  RETURN
267  ELSE
268  z( j4 ) = z( j4p2+2 )*( z( j4p2 ) / z( j4-2 ) )
269  dn = z( j4p2+2 )*( dnm1 / z( j4-2 ) ) - tau
270  END IF
271  dmin = min( dmin, dn )
272 *
273  END IF
274 *
275  z( j4+2 ) = dn
276  z( 4*n0-pp ) = emin
277  RETURN
278 *
279 * End of DLASQ5
280 *
281  END