LAPACK  3.8.0
LAPACK: Linear Algebra PACKage
ilaenv.f
Go to the documentation of this file.
1 *> \brief \b ILAENV
2 *
3 * =========== DOCUMENTATION ===========
4 *
5 * Online html documentation available at
6 * http://www.netlib.org/lapack/explore-html/
7 *
8 * Definition:
9 * ===========
10 *
11 * INTEGER FUNCTION ILAENV( ISPEC, NAME, OPTS, N1, N2, N3,
12 * N4 )
13 *
14 * .. Scalar Arguments ..
15 * CHARACTER*( * ) NAME, OPTS
16 * INTEGER ISPEC, N1, N2, N3, N4
17 * ..
18 *
19 *
20 *> \par Purpose:
21 * =============
22 *>
23 *> \verbatim
24 *>
25 *> ILAENV returns problem-dependent parameters for the local
26 *> environment. See ISPEC for a description of the parameters.
27 *>
28 *> In this version, the problem-dependent parameters are contained in
29 *> the integer array IPARMS in the common block CLAENV and the value
30 *> with index ISPEC is copied to ILAENV. This version of ILAENV is
31 *> to be used in conjunction with XLAENV in TESTING and TIMING.
32 *> \endverbatim
33 *
34 * Arguments:
35 * ==========
36 *
37 *> \param[in] ISPEC
38 *> \verbatim
39 *> ISPEC is INTEGER
40 *> Specifies the parameter to be returned as the value of
41 *> ILAENV.
42 *> = 1: the optimal blocksize; if this value is 1, an unblocked
43 *> algorithm will give the best performance.
44 *> = 2: the minimum block size for which the block routine
45 *> should be used; if the usable block size is less than
46 *> this value, an unblocked routine should be used.
47 *> = 3: the crossover point (in a block routine, for N less
48 *> than this value, an unblocked routine should be used)
49 *> = 4: the number of shifts, used in the nonsymmetric
50 *> eigenvalue routines
51 *> = 5: the minimum column dimension for blocking to be used;
52 *> rectangular blocks must have dimension at least k by m,
53 *> where k is given by ILAENV(2,...) and m by ILAENV(5,...)
54 *> = 6: the crossover point for the SVD (when reducing an m by n
55 *> matrix to bidiagonal form, if max(m,n)/min(m,n) exceeds
56 *> this value, a QR factorization is used first to reduce
57 *> the matrix to a triangular form.)
58 *> = 7: the number of processors
59 *> = 8: the crossover point for the multishift QR and QZ methods
60 *> for nonsymmetric eigenvalue problems.
61 *> = 9: maximum size of the subproblems at the bottom of the
62 *> computation tree in the divide-and-conquer algorithm
63 *> =10: ieee NaN arithmetic can be trusted not to trap
64 *> =11: infinity arithmetic can be trusted not to trap
65 *> 12 <= ISPEC <= 16:
66 *> xHSEQR or one of its subroutines,
67 *> see IPARMQ for detailed explanation
68 *>
69 *> Other specifications (up to 100) can be added later.
70 *> \endverbatim
71 *>
72 *> \param[in] NAME
73 *> \verbatim
74 *> NAME is CHARACTER*(*)
75 *> The name of the calling subroutine.
76 *> \endverbatim
77 *>
78 *> \param[in] OPTS
79 *> \verbatim
80 *> OPTS is CHARACTER*(*)
81 *> The character options to the subroutine NAME, concatenated
82 *> into a single character string. For example, UPLO = 'U',
83 *> TRANS = 'T', and DIAG = 'N' for a triangular routine would
84 *> be specified as OPTS = 'UTN'.
85 *> \endverbatim
86 *>
87 *> \param[in] N1
88 *> \verbatim
89 *> N1 is INTEGER
90 *> \endverbatim
91 *>
92 *> \param[in] N2
93 *> \verbatim
94 *> N2 is INTEGER
95 *> \endverbatim
96 *>
97 *> \param[in] N3
98 *> \verbatim
99 *> N3 is INTEGER
100 *> \endverbatim
101 *>
102 *> \param[in] N4
103 *> \verbatim
104 *> N4 is INTEGER
105 *>
106 *> Problem dimensions for the subroutine NAME; these may not all
107 *> be required.
108 *> \endverbatim
109 *>
110 *> \result ILAENV
111 *> \verbatim
112 *> ILAENV is INTEGER
113 *> >= 0: the value of the parameter specified by ISPEC
114 *> < 0: if ILAENV = -k, the k-th argument had an illegal value.
115 *> \endverbatim
116 *
117 * Authors:
118 * ========
119 *
120 *> \author Univ. of Tennessee
121 *> \author Univ. of California Berkeley
122 *> \author Univ. of Colorado Denver
123 *> \author NAG Ltd.
124 *
125 *> \date November 2017
126 *
127 *> \ingroup OTHERauxiliary
128 *
129 *> \par Further Details:
130 * =====================
131 *>
132 *> \verbatim
133 *>
134 *> The following conventions have been used when calling ILAENV from the
135 *> LAPACK routines:
136 *> 1) OPTS is a concatenation of all of the character options to
137 *> subroutine NAME, in the same order that they appear in the
138 *> argument list for NAME, even if they are not used in determining
139 *> the value of the parameter specified by ISPEC.
140 *> 2) The problem dimensions N1, N2, N3, N4 are specified in the order
141 *> that they appear in the argument list for NAME. N1 is used
142 *> first, N2 second, and so on, and unused problem dimensions are
143 *> passed a value of -1.
144 *> 3) The parameter value returned by ILAENV is checked for validity in
145 *> the calling subroutine. For example, ILAENV is used to retrieve
146 *> the optimal blocksize for STRTRI as follows:
147 *>
148 *> NB = ILAENV( 1, 'STRTRI', UPLO // DIAG, N, -1, -1, -1 )
149 *> IF( NB.LE.1 ) NB = MAX( 1, N )
150 *> \endverbatim
151 *>
152 * =====================================================================
153  INTEGER FUNCTION ilaenv( ISPEC, NAME, OPTS, N1, N2, N3,
154  $ N4 )
155 *
156 * -- LAPACK test routine (version 3.8.0) --
157 * -- LAPACK is a software package provided by Univ. of Tennessee, --
158 * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
159 * November 2017
160 *
161 * .. Scalar Arguments ..
162  CHARACTER*( * ) name, opts
163  INTEGER ispec, n1, n2, n3, n4
164 * ..
165 *
166 * =====================================================================
167 *
168 * .. Intrinsic Functions ..
169  INTRINSIC int, min, real
170 * ..
171 * .. External Functions ..
172  INTEGER ieeeck, iparam2stage
173  EXTERNAL ieeeck, iparam2stage
174 * ..
175 * .. Arrays in Common ..
176  INTEGER iparms( 100 )
177 * ..
178 * .. Common blocks ..
179  COMMON / claenv / iparms
180 * ..
181 * .. Save statement ..
182  SAVE / claenv /
183 * ..
184 * .. Executable Statements ..
185 *
186  IF( ispec.GE.1 .AND. ispec.LE.5 ) THEN
187 *
188 * Return a value from the common block.
189 *
190  ilaenv = iparms( ispec )
191 *
192  ELSE IF( ispec.EQ.6 ) THEN
193 *
194 * Compute SVD crossover point.
195 *
196  ilaenv = int( REAL( MIN( N1, N2 ) )*1.6e0 )
197 *
198  ELSE IF( ispec.GE.7 .AND. ispec.LE.9 ) THEN
199 *
200 * Return a value from the common block.
201 *
202  ilaenv = iparms( ispec )
203 *
204  ELSE IF( ispec.EQ.10 ) THEN
205 *
206 * IEEE NaN arithmetic can be trusted not to trap
207 *
208 C ILAENV = 0
209  ilaenv = 1
210  IF( ilaenv.EQ.1 ) THEN
211  ilaenv = ieeeck( 1, 0.0, 1.0 )
212  END IF
213 *
214  ELSE IF( ispec.EQ.11 ) THEN
215 *
216 * Infinity arithmetic can be trusted not to trap
217 *
218 C ILAENV = 0
219  ilaenv = 1
220  IF( ilaenv.EQ.1 ) THEN
221  ilaenv = ieeeck( 0, 0.0, 1.0 )
222  END IF
223 *
224  ELSE IF(( ispec.GE.12 ) .AND. (ispec.LE.16)) THEN
225 *
226 * 12 <= ISPEC <= 16: xHSEQR or one of its subroutines.
227 *
228  ilaenv = iparms( ispec )
229 * WRITE(*,*) 'ISPEC = ',ISPEC,' ILAENV =',ILAENV
230 * ILAENV = IPARMQ( ISPEC, NAME, OPTS, N1, N2, N3, N4 )
231 *
232  ELSE IF(( ispec.GE.17 ) .AND. (ispec.LE.21)) THEN
233 *
234 * 17 <= ISPEC <= 21: 2stage eigenvalues SVD routines.
235 *
236  IF( ispec.EQ.17 ) THEN
237  ilaenv = iparms( 1 )
238  ELSE
239  ilaenv = iparam2stage( ispec, name, opts, n1, n2, n3, n4 )
240  ENDIF
241 *
242  ELSE
243 *
244 * Invalid value for ISPEC
245 *
246  ilaenv = -1
247  END IF
248 *
249  RETURN
250 *
251 * End of ILAENV
252 *
253  END
254  INTEGER FUNCTION ilaenv2stage( ISPEC, NAME, OPTS, N1, N2,
255  $ N3, N4 )
256 * .. Scalar Arguments ..
257  CHARACTER*( * ) NAME, OPTS
258  INTEGER ISPEC, N1, N2, N3, N4
259 * ..
260 *
261 * =====================================================================
262 *
263 * .. Local variables ..
264  INTEGER IISPEC
265 * .. External Functions ..
266  INTEGER IPARAM2STAGE
267  EXTERNAL iparam2stage
268 * ..
269 * .. Arrays in Common ..
270  INTEGER IPARMS( 100 )
271 * ..
272 * .. Common blocks ..
273  COMMON / claenv / iparms
274 * ..
275 * .. Save statement ..
276  SAVE / claenv /
277 * ..
278 * .. Executable Statements ..
279 *
280  IF(( ispec.GE.1 ) .AND. (ispec.LE.5)) THEN
281 *
282 * 1 <= ISPEC <= 5: 2stage eigenvalues SVD routines.
283 *
284  IF( ispec.EQ.1 ) THEN
285  ilaenv2stage = iparms( 1 )
286  ELSE
287  iispec = 16 + ispec
288  ilaenv2stage = iparam2stage( iispec, name, opts,
289  $ n1, n2, n3, n4 )
290  ENDIF
291 *
292  ELSE
293 *
294 * Invalid value for ISPEC
295 *
296  ilaenv2stage = -1
297  END IF
298 *
299  RETURN
300  END
301  INTEGER FUNCTION iparmq( ISPEC, NAME, OPTS, N, ILO, IHI, LWORK )
302 *
303  INTEGER INMIN, INWIN, INIBL, ISHFTS, IACC22
304  parameter( inmin = 12, inwin = 13, inibl = 14,
305  $ ishfts = 15, iacc22 = 16 )
306  INTEGER NMIN, K22MIN, KACMIN, NIBBLE, KNWSWP
307  parameter( nmin = 11, k22min = 14, kacmin = 14,
308  $ nibble = 14, knwswp = 500 )
309  REAL TWO
310  parameter( two = 2.0 )
311 * ..
312 * .. Scalar Arguments ..
313  INTEGER IHI, ILO, ISPEC, LWORK, N
314  CHARACTER NAME*( * ), OPTS*( * )
315 * ..
316 * .. Local Scalars ..
317  INTEGER NH, NS
318 * ..
319 * .. Intrinsic Functions ..
320  INTRINSIC log, max, mod, nint, real
321 * ..
322 * .. Executable Statements ..
323  IF( ( ispec.EQ.ishfts ) .OR. ( ispec.EQ.inwin ) .OR.
324  $ ( ispec.EQ.iacc22 ) ) THEN
325 *
326 * ==== Set the number simultaneous shifts ====
327 *
328  nh = ihi - ilo + 1
329  ns = 2
330  IF( nh.GE.30 )
331  $ ns = 4
332  IF( nh.GE.60 )
333  $ ns = 10
334  IF( nh.GE.150 )
335  $ ns = max( 10, nh / nint( log( REAL( NH ) ) / log( TWO ) ) )
336  IF( nh.GE.590 )
337  $ ns = 64
338  IF( nh.GE.3000 )
339  $ ns = 128
340  IF( nh.GE.6000 )
341  $ ns = 256
342  ns = max( 2, ns-mod( ns, 2 ) )
343  END IF
344 *
345  IF( ispec.EQ.inmin ) THEN
346 *
347 *
348 * ===== Matrices of order smaller than NMIN get sent
349 * . to LAHQR, the classic double shift algorithm.
350 * . This must be at least 11. ====
351 *
352  iparmq = nmin
353 *
354  ELSE IF( ispec.EQ.inibl ) THEN
355 *
356 * ==== INIBL: skip a multi-shift qr iteration and
357 * . whenever aggressive early deflation finds
358 * . at least (NIBBLE*(window size)/100) deflations. ====
359 *
360  iparmq = nibble
361 *
362  ELSE IF( ispec.EQ.ishfts ) THEN
363 *
364 * ==== NSHFTS: The number of simultaneous shifts =====
365 *
366  iparmq = ns
367 *
368  ELSE IF( ispec.EQ.inwin ) THEN
369 *
370 * ==== NW: deflation window size. ====
371 *
372  IF( nh.LE.knwswp ) THEN
373  iparmq = ns
374  ELSE
375  iparmq = 3*ns / 2
376  END IF
377 *
378  ELSE IF( ispec.EQ.iacc22 ) THEN
379 *
380 * ==== IACC22: Whether to accumulate reflections
381 * . before updating the far-from-diagonal elements
382 * . and whether to use 2-by-2 block structure while
383 * . doing it. A small amount of work could be saved
384 * . by making this choice dependent also upon the
385 * . NH=IHI-ILO+1.
386 *
387  iparmq = 0
388  IF( ns.GE.kacmin )
389  $ iparmq = 1
390  IF( ns.GE.k22min )
391  $ iparmq = 2
392 *
393  ELSE
394 * ===== invalid value of ispec =====
395  iparmq = -1
396 *
397  END IF
398 *
399 * ==== End of IPARMQ ====
400 *
401  END
integer function ieeeck(ISPEC, ZERO, ONE)
Definition: tstiee.f:626
integer function ilaenv(ISPEC, NAME, OPTS, N1, N2, N3, N4)
ILAENV
Definition: tstiee.f:83
integer function ilaenv2stage(ISPEC, NAME, OPTS, N1, N2, N3, N4)
ILAENV2STAGE
Definition: ilaenv2stage.f:151
integer function iparmq(ISPEC, NAME, OPTS, N, ILO, IHI, LWORK)
IPARMQ
Definition: iparmq.f:224