Mercurial > hg > qm-dsp
comparison ext/clapack/src/ilaenv.c @ 430:335af74a25b6
Merge from branch clapack-included
author | Chris Cannam <c.cannam@qmul.ac.uk> |
---|---|
date | Fri, 30 Sep 2016 16:24:24 +0100 |
parents | 68a41957200e |
children |
comparison
equal
deleted
inserted
replaced
426:a23b9f8b4a59 | 430:335af74a25b6 |
---|---|
1 #include "f2c.h" | |
2 #include "string.h" | |
3 | |
4 /* Table of constant values */ | |
5 | |
6 static integer c__0 = 0; | |
7 static real c_b163 = 0.f; | |
8 static real c_b164 = 1.f; | |
9 static integer c__1 = 1; | |
10 | |
11 integer ilaenv_(integer *ispec, char *name__, char *opts, integer *n1, | |
12 integer *n2, integer *n3, integer *n4) | |
13 { | |
14 /* System generated locals */ | |
15 integer ret_val; | |
16 | |
17 /* Builtin functions */ | |
18 /* Subroutine */ int s_copy(char *, char *, ftnlen, ftnlen); | |
19 integer s_cmp(char *, char *, ftnlen, ftnlen); | |
20 | |
21 /* Local variables */ | |
22 static integer i__; | |
23 static char c1[1], c2[2], c3[3], c4[2]; | |
24 static integer ic, nb, iz, nx; | |
25 static logical cname; | |
26 static integer nbmin; | |
27 static logical sname; | |
28 extern integer ieeeck_(integer *, real *, real *); | |
29 static char subnam[6]; | |
30 extern integer iparmq_(integer *, char *, char *, integer *, integer *, | |
31 integer *, integer *); | |
32 | |
33 ftnlen name_len, opts_len; | |
34 | |
35 name_len = strlen (name__); | |
36 opts_len = strlen (opts); | |
37 | |
38 | |
39 /* -- LAPACK auxiliary routine (version 3.1.1) -- */ | |
40 /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ | |
41 /* January 2007 */ | |
42 | |
43 /* .. Scalar Arguments .. */ | |
44 /* .. */ | |
45 | |
46 /* Purpose */ | |
47 /* ======= */ | |
48 | |
49 /* ILAENV is called from the LAPACK routines to choose problem-dependent */ | |
50 /* parameters for the local environment. See ISPEC for a description of */ | |
51 /* the parameters. */ | |
52 | |
53 /* ILAENV returns an INTEGER */ | |
54 /* if ILAENV >= 0: ILAENV returns the value of the parameter specified by ISPEC */ | |
55 /* if ILAENV < 0: if ILAENV = -k, the k-th argument had an illegal value. */ | |
56 | |
57 /* This version provides a set of parameters which should give good, */ | |
58 /* but not optimal, performance on many of the currently available */ | |
59 /* computers. Users are encouraged to modify this subroutine to set */ | |
60 /* the tuning parameters for their particular machine using the option */ | |
61 /* and problem size information in the arguments. */ | |
62 | |
63 /* This routine will not function correctly if it is converted to all */ | |
64 /* lower case. Converting it to all upper case is allowed. */ | |
65 | |
66 /* Arguments */ | |
67 /* ========= */ | |
68 | |
69 /* ISPEC (input) INTEGER */ | |
70 /* Specifies the parameter to be returned as the value of */ | |
71 /* ILAENV. */ | |
72 /* = 1: the optimal blocksize; if this value is 1, an unblocked */ | |
73 /* algorithm will give the best performance. */ | |
74 /* = 2: the minimum block size for which the block routine */ | |
75 /* should be used; if the usable block size is less than */ | |
76 /* this value, an unblocked routine should be used. */ | |
77 /* = 3: the crossover point (in a block routine, for N less */ | |
78 /* than this value, an unblocked routine should be used) */ | |
79 /* = 4: the number of shifts, used in the nonsymmetric */ | |
80 /* eigenvalue routines (DEPRECATED) */ | |
81 /* = 5: the minimum column dimension for blocking to be used; */ | |
82 /* rectangular blocks must have dimension at least k by m, */ | |
83 /* where k is given by ILAENV(2,...) and m by ILAENV(5,...) */ | |
84 /* = 6: the crossover point for the SVD (when reducing an m by n */ | |
85 /* matrix to bidiagonal form, if max(m,n)/min(m,n) exceeds */ | |
86 /* this value, a QR factorization is used first to reduce */ | |
87 /* the matrix to a triangular form.) */ | |
88 /* = 7: the number of processors */ | |
89 /* = 8: the crossover point for the multishift QR method */ | |
90 /* for nonsymmetric eigenvalue problems (DEPRECATED) */ | |
91 /* = 9: maximum size of the subproblems at the bottom of the */ | |
92 /* computation tree in the divide-and-conquer algorithm */ | |
93 /* (used by xGELSD and xGESDD) */ | |
94 /* =10: ieee NaN arithmetic can be trusted not to trap */ | |
95 /* =11: infinity arithmetic can be trusted not to trap */ | |
96 /* 12 <= ISPEC <= 16: */ | |
97 /* xHSEQR or one of its subroutines, */ | |
98 /* see IPARMQ for detailed explanation */ | |
99 | |
100 /* NAME (input) CHARACTER*(*) */ | |
101 /* The name of the calling subroutine, in either upper case or */ | |
102 /* lower case. */ | |
103 | |
104 /* OPTS (input) CHARACTER*(*) */ | |
105 /* The character options to the subroutine NAME, concatenated */ | |
106 /* into a single character string. For example, UPLO = 'U', */ | |
107 /* TRANS = 'T', and DIAG = 'N' for a triangular routine would */ | |
108 /* be specified as OPTS = 'UTN'. */ | |
109 | |
110 /* N1 (input) INTEGER */ | |
111 /* N2 (input) INTEGER */ | |
112 /* N3 (input) INTEGER */ | |
113 /* N4 (input) INTEGER */ | |
114 /* Problem dimensions for the subroutine NAME; these may not all */ | |
115 /* be required. */ | |
116 | |
117 /* Further Details */ | |
118 /* =============== */ | |
119 | |
120 /* The following conventions have been used when calling ILAENV from the */ | |
121 /* LAPACK routines: */ | |
122 /* 1) OPTS is a concatenation of all of the character options to */ | |
123 /* subroutine NAME, in the same order that they appear in the */ | |
124 /* argument list for NAME, even if they are not used in determining */ | |
125 /* the value of the parameter specified by ISPEC. */ | |
126 /* 2) The problem dimensions N1, N2, N3, N4 are specified in the order */ | |
127 /* that they appear in the argument list for NAME. N1 is used */ | |
128 /* first, N2 second, and so on, and unused problem dimensions are */ | |
129 /* passed a value of -1. */ | |
130 /* 3) The parameter value returned by ILAENV is checked for validity in */ | |
131 /* the calling subroutine. For example, ILAENV is used to retrieve */ | |
132 /* the optimal blocksize for STRTRI as follows: */ | |
133 | |
134 /* NB = ILAENV( 1, 'STRTRI', UPLO // DIAG, N, -1, -1, -1 ) */ | |
135 /* IF( NB.LE.1 ) NB = MAX( 1, N ) */ | |
136 | |
137 /* ===================================================================== */ | |
138 | |
139 /* .. Local Scalars .. */ | |
140 /* .. */ | |
141 /* .. Intrinsic Functions .. */ | |
142 /* .. */ | |
143 /* .. External Functions .. */ | |
144 /* .. */ | |
145 /* .. Executable Statements .. */ | |
146 | |
147 switch (*ispec) { | |
148 case 1: goto L10; | |
149 case 2: goto L10; | |
150 case 3: goto L10; | |
151 case 4: goto L80; | |
152 case 5: goto L90; | |
153 case 6: goto L100; | |
154 case 7: goto L110; | |
155 case 8: goto L120; | |
156 case 9: goto L130; | |
157 case 10: goto L140; | |
158 case 11: goto L150; | |
159 case 12: goto L160; | |
160 case 13: goto L160; | |
161 case 14: goto L160; | |
162 case 15: goto L160; | |
163 case 16: goto L160; | |
164 } | |
165 | |
166 /* Invalid value for ISPEC */ | |
167 | |
168 ret_val = -1; | |
169 return ret_val; | |
170 | |
171 L10: | |
172 | |
173 /* Convert NAME to upper case if the first character is lower case. */ | |
174 | |
175 ret_val = 1; | |
176 s_copy(subnam, name__, (ftnlen)6, name_len); | |
177 ic = *(unsigned char *)subnam; | |
178 iz = 'Z'; | |
179 if (iz == 90 || iz == 122) { | |
180 | |
181 /* ASCII character set */ | |
182 | |
183 if (ic >= 97 && ic <= 122) { | |
184 *(unsigned char *)subnam = (char) (ic - 32); | |
185 for (i__ = 2; i__ <= 6; ++i__) { | |
186 ic = *(unsigned char *)&subnam[i__ - 1]; | |
187 if (ic >= 97 && ic <= 122) { | |
188 *(unsigned char *)&subnam[i__ - 1] = (char) (ic - 32); | |
189 } | |
190 /* L20: */ | |
191 } | |
192 } | |
193 | |
194 } else if (iz == 233 || iz == 169) { | |
195 | |
196 /* EBCDIC character set */ | |
197 | |
198 if (ic >= 129 && ic <= 137 || ic >= 145 && ic <= 153 || ic >= 162 && | |
199 ic <= 169) { | |
200 *(unsigned char *)subnam = (char) (ic + 64); | |
201 for (i__ = 2; i__ <= 6; ++i__) { | |
202 ic = *(unsigned char *)&subnam[i__ - 1]; | |
203 if (ic >= 129 && ic <= 137 || ic >= 145 && ic <= 153 || ic >= | |
204 162 && ic <= 169) { | |
205 *(unsigned char *)&subnam[i__ - 1] = (char) (ic + 64); | |
206 } | |
207 /* L30: */ | |
208 } | |
209 } | |
210 | |
211 } else if (iz == 218 || iz == 250) { | |
212 | |
213 /* Prime machines: ASCII+128 */ | |
214 | |
215 if (ic >= 225 && ic <= 250) { | |
216 *(unsigned char *)subnam = (char) (ic - 32); | |
217 for (i__ = 2; i__ <= 6; ++i__) { | |
218 ic = *(unsigned char *)&subnam[i__ - 1]; | |
219 if (ic >= 225 && ic <= 250) { | |
220 *(unsigned char *)&subnam[i__ - 1] = (char) (ic - 32); | |
221 } | |
222 /* L40: */ | |
223 } | |
224 } | |
225 } | |
226 | |
227 *(unsigned char *)c1 = *(unsigned char *)subnam; | |
228 sname = *(unsigned char *)c1 == 'S' || *(unsigned char *)c1 == 'D'; | |
229 cname = *(unsigned char *)c1 == 'C' || *(unsigned char *)c1 == 'Z'; | |
230 if (! (cname || sname)) { | |
231 return ret_val; | |
232 } | |
233 s_copy(c2, subnam + 1, (ftnlen)2, (ftnlen)2); | |
234 s_copy(c3, subnam + 3, (ftnlen)3, (ftnlen)3); | |
235 s_copy(c4, c3 + 1, (ftnlen)2, (ftnlen)2); | |
236 | |
237 switch (*ispec) { | |
238 case 1: goto L50; | |
239 case 2: goto L60; | |
240 case 3: goto L70; | |
241 } | |
242 | |
243 L50: | |
244 | |
245 /* ISPEC = 1: block size */ | |
246 | |
247 /* In these examples, separate code is provided for setting NB for */ | |
248 /* real and complex. We assume that NB will take the same value in */ | |
249 /* single or double precision. */ | |
250 | |
251 nb = 1; | |
252 | |
253 if (s_cmp(c2, "GE", (ftnlen)2, (ftnlen)2) == 0) { | |
254 if (s_cmp(c3, "TRF", (ftnlen)3, (ftnlen)3) == 0) { | |
255 if (sname) { | |
256 nb = 64; | |
257 } else { | |
258 nb = 64; | |
259 } | |
260 } else if (s_cmp(c3, "QRF", (ftnlen)3, (ftnlen)3) == 0 || s_cmp(c3, | |
261 "RQF", (ftnlen)3, (ftnlen)3) == 0 || s_cmp(c3, "LQF", (ftnlen) | |
262 3, (ftnlen)3) == 0 || s_cmp(c3, "QLF", (ftnlen)3, (ftnlen)3) | |
263 == 0) { | |
264 if (sname) { | |
265 nb = 32; | |
266 } else { | |
267 nb = 32; | |
268 } | |
269 } else if (s_cmp(c3, "HRD", (ftnlen)3, (ftnlen)3) == 0) { | |
270 if (sname) { | |
271 nb = 32; | |
272 } else { | |
273 nb = 32; | |
274 } | |
275 } else if (s_cmp(c3, "BRD", (ftnlen)3, (ftnlen)3) == 0) { | |
276 if (sname) { | |
277 nb = 32; | |
278 } else { | |
279 nb = 32; | |
280 } | |
281 } else if (s_cmp(c3, "TRI", (ftnlen)3, (ftnlen)3) == 0) { | |
282 if (sname) { | |
283 nb = 64; | |
284 } else { | |
285 nb = 64; | |
286 } | |
287 } | |
288 } else if (s_cmp(c2, "PO", (ftnlen)2, (ftnlen)2) == 0) { | |
289 if (s_cmp(c3, "TRF", (ftnlen)3, (ftnlen)3) == 0) { | |
290 if (sname) { | |
291 nb = 64; | |
292 } else { | |
293 nb = 64; | |
294 } | |
295 } | |
296 } else if (s_cmp(c2, "SY", (ftnlen)2, (ftnlen)2) == 0) { | |
297 if (s_cmp(c3, "TRF", (ftnlen)3, (ftnlen)3) == 0) { | |
298 if (sname) { | |
299 nb = 64; | |
300 } else { | |
301 nb = 64; | |
302 } | |
303 } else if (sname && s_cmp(c3, "TRD", (ftnlen)3, (ftnlen)3) == 0) { | |
304 nb = 32; | |
305 } else if (sname && s_cmp(c3, "GST", (ftnlen)3, (ftnlen)3) == 0) { | |
306 nb = 64; | |
307 } | |
308 } else if (cname && s_cmp(c2, "HE", (ftnlen)2, (ftnlen)2) == 0) { | |
309 if (s_cmp(c3, "TRF", (ftnlen)3, (ftnlen)3) == 0) { | |
310 nb = 64; | |
311 } else if (s_cmp(c3, "TRD", (ftnlen)3, (ftnlen)3) == 0) { | |
312 nb = 32; | |
313 } else if (s_cmp(c3, "GST", (ftnlen)3, (ftnlen)3) == 0) { | |
314 nb = 64; | |
315 } | |
316 } else if (sname && s_cmp(c2, "OR", (ftnlen)2, (ftnlen)2) == 0) { | |
317 if (*(unsigned char *)c3 == 'G') { | |
318 if (s_cmp(c4, "QR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "RQ", | |
319 (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "LQ", (ftnlen)2, ( | |
320 ftnlen)2) == 0 || s_cmp(c4, "QL", (ftnlen)2, (ftnlen)2) == | |
321 0 || s_cmp(c4, "HR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp( | |
322 c4, "TR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "BR", ( | |
323 ftnlen)2, (ftnlen)2) == 0) { | |
324 nb = 32; | |
325 } | |
326 } else if (*(unsigned char *)c3 == 'M') { | |
327 if (s_cmp(c4, "QR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "RQ", | |
328 (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "LQ", (ftnlen)2, ( | |
329 ftnlen)2) == 0 || s_cmp(c4, "QL", (ftnlen)2, (ftnlen)2) == | |
330 0 || s_cmp(c4, "HR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp( | |
331 c4, "TR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "BR", ( | |
332 ftnlen)2, (ftnlen)2) == 0) { | |
333 nb = 32; | |
334 } | |
335 } | |
336 } else if (cname && s_cmp(c2, "UN", (ftnlen)2, (ftnlen)2) == 0) { | |
337 if (*(unsigned char *)c3 == 'G') { | |
338 if (s_cmp(c4, "QR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "RQ", | |
339 (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "LQ", (ftnlen)2, ( | |
340 ftnlen)2) == 0 || s_cmp(c4, "QL", (ftnlen)2, (ftnlen)2) == | |
341 0 || s_cmp(c4, "HR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp( | |
342 c4, "TR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "BR", ( | |
343 ftnlen)2, (ftnlen)2) == 0) { | |
344 nb = 32; | |
345 } | |
346 } else if (*(unsigned char *)c3 == 'M') { | |
347 if (s_cmp(c4, "QR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "RQ", | |
348 (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "LQ", (ftnlen)2, ( | |
349 ftnlen)2) == 0 || s_cmp(c4, "QL", (ftnlen)2, (ftnlen)2) == | |
350 0 || s_cmp(c4, "HR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp( | |
351 c4, "TR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "BR", ( | |
352 ftnlen)2, (ftnlen)2) == 0) { | |
353 nb = 32; | |
354 } | |
355 } | |
356 } else if (s_cmp(c2, "GB", (ftnlen)2, (ftnlen)2) == 0) { | |
357 if (s_cmp(c3, "TRF", (ftnlen)3, (ftnlen)3) == 0) { | |
358 if (sname) { | |
359 if (*n4 <= 64) { | |
360 nb = 1; | |
361 } else { | |
362 nb = 32; | |
363 } | |
364 } else { | |
365 if (*n4 <= 64) { | |
366 nb = 1; | |
367 } else { | |
368 nb = 32; | |
369 } | |
370 } | |
371 } | |
372 } else if (s_cmp(c2, "PB", (ftnlen)2, (ftnlen)2) == 0) { | |
373 if (s_cmp(c3, "TRF", (ftnlen)3, (ftnlen)3) == 0) { | |
374 if (sname) { | |
375 if (*n2 <= 64) { | |
376 nb = 1; | |
377 } else { | |
378 nb = 32; | |
379 } | |
380 } else { | |
381 if (*n2 <= 64) { | |
382 nb = 1; | |
383 } else { | |
384 nb = 32; | |
385 } | |
386 } | |
387 } | |
388 } else if (s_cmp(c2, "TR", (ftnlen)2, (ftnlen)2) == 0) { | |
389 if (s_cmp(c3, "TRI", (ftnlen)3, (ftnlen)3) == 0) { | |
390 if (sname) { | |
391 nb = 64; | |
392 } else { | |
393 nb = 64; | |
394 } | |
395 } | |
396 } else if (s_cmp(c2, "LA", (ftnlen)2, (ftnlen)2) == 0) { | |
397 if (s_cmp(c3, "UUM", (ftnlen)3, (ftnlen)3) == 0) { | |
398 if (sname) { | |
399 nb = 64; | |
400 } else { | |
401 nb = 64; | |
402 } | |
403 } | |
404 } else if (sname && s_cmp(c2, "ST", (ftnlen)2, (ftnlen)2) == 0) { | |
405 if (s_cmp(c3, "EBZ", (ftnlen)3, (ftnlen)3) == 0) { | |
406 nb = 1; | |
407 } | |
408 } | |
409 ret_val = nb; | |
410 return ret_val; | |
411 | |
412 L60: | |
413 | |
414 /* ISPEC = 2: minimum block size */ | |
415 | |
416 nbmin = 2; | |
417 if (s_cmp(c2, "GE", (ftnlen)2, (ftnlen)2) == 0) { | |
418 if (s_cmp(c3, "QRF", (ftnlen)3, (ftnlen)3) == 0 || s_cmp(c3, "RQF", ( | |
419 ftnlen)3, (ftnlen)3) == 0 || s_cmp(c3, "LQF", (ftnlen)3, ( | |
420 ftnlen)3) == 0 || s_cmp(c3, "QLF", (ftnlen)3, (ftnlen)3) == 0) | |
421 { | |
422 if (sname) { | |
423 nbmin = 2; | |
424 } else { | |
425 nbmin = 2; | |
426 } | |
427 } else if (s_cmp(c3, "HRD", (ftnlen)3, (ftnlen)3) == 0) { | |
428 if (sname) { | |
429 nbmin = 2; | |
430 } else { | |
431 nbmin = 2; | |
432 } | |
433 } else if (s_cmp(c3, "BRD", (ftnlen)3, (ftnlen)3) == 0) { | |
434 if (sname) { | |
435 nbmin = 2; | |
436 } else { | |
437 nbmin = 2; | |
438 } | |
439 } else if (s_cmp(c3, "TRI", (ftnlen)3, (ftnlen)3) == 0) { | |
440 if (sname) { | |
441 nbmin = 2; | |
442 } else { | |
443 nbmin = 2; | |
444 } | |
445 } | |
446 } else if (s_cmp(c2, "SY", (ftnlen)2, (ftnlen)2) == 0) { | |
447 if (s_cmp(c3, "TRF", (ftnlen)3, (ftnlen)3) == 0) { | |
448 if (sname) { | |
449 nbmin = 8; | |
450 } else { | |
451 nbmin = 8; | |
452 } | |
453 } else if (sname && s_cmp(c3, "TRD", (ftnlen)3, (ftnlen)3) == 0) { | |
454 nbmin = 2; | |
455 } | |
456 } else if (cname && s_cmp(c2, "HE", (ftnlen)2, (ftnlen)2) == 0) { | |
457 if (s_cmp(c3, "TRD", (ftnlen)3, (ftnlen)3) == 0) { | |
458 nbmin = 2; | |
459 } | |
460 } else if (sname && s_cmp(c2, "OR", (ftnlen)2, (ftnlen)2) == 0) { | |
461 if (*(unsigned char *)c3 == 'G') { | |
462 if (s_cmp(c4, "QR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "RQ", | |
463 (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "LQ", (ftnlen)2, ( | |
464 ftnlen)2) == 0 || s_cmp(c4, "QL", (ftnlen)2, (ftnlen)2) == | |
465 0 || s_cmp(c4, "HR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp( | |
466 c4, "TR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "BR", ( | |
467 ftnlen)2, (ftnlen)2) == 0) { | |
468 nbmin = 2; | |
469 } | |
470 } else if (*(unsigned char *)c3 == 'M') { | |
471 if (s_cmp(c4, "QR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "RQ", | |
472 (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "LQ", (ftnlen)2, ( | |
473 ftnlen)2) == 0 || s_cmp(c4, "QL", (ftnlen)2, (ftnlen)2) == | |
474 0 || s_cmp(c4, "HR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp( | |
475 c4, "TR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "BR", ( | |
476 ftnlen)2, (ftnlen)2) == 0) { | |
477 nbmin = 2; | |
478 } | |
479 } | |
480 } else if (cname && s_cmp(c2, "UN", (ftnlen)2, (ftnlen)2) == 0) { | |
481 if (*(unsigned char *)c3 == 'G') { | |
482 if (s_cmp(c4, "QR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "RQ", | |
483 (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "LQ", (ftnlen)2, ( | |
484 ftnlen)2) == 0 || s_cmp(c4, "QL", (ftnlen)2, (ftnlen)2) == | |
485 0 || s_cmp(c4, "HR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp( | |
486 c4, "TR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "BR", ( | |
487 ftnlen)2, (ftnlen)2) == 0) { | |
488 nbmin = 2; | |
489 } | |
490 } else if (*(unsigned char *)c3 == 'M') { | |
491 if (s_cmp(c4, "QR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "RQ", | |
492 (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "LQ", (ftnlen)2, ( | |
493 ftnlen)2) == 0 || s_cmp(c4, "QL", (ftnlen)2, (ftnlen)2) == | |
494 0 || s_cmp(c4, "HR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp( | |
495 c4, "TR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "BR", ( | |
496 ftnlen)2, (ftnlen)2) == 0) { | |
497 nbmin = 2; | |
498 } | |
499 } | |
500 } | |
501 ret_val = nbmin; | |
502 return ret_val; | |
503 | |
504 L70: | |
505 | |
506 /* ISPEC = 3: crossover point */ | |
507 | |
508 nx = 0; | |
509 if (s_cmp(c2, "GE", (ftnlen)2, (ftnlen)2) == 0) { | |
510 if (s_cmp(c3, "QRF", (ftnlen)3, (ftnlen)3) == 0 || s_cmp(c3, "RQF", ( | |
511 ftnlen)3, (ftnlen)3) == 0 || s_cmp(c3, "LQF", (ftnlen)3, ( | |
512 ftnlen)3) == 0 || s_cmp(c3, "QLF", (ftnlen)3, (ftnlen)3) == 0) | |
513 { | |
514 if (sname) { | |
515 nx = 128; | |
516 } else { | |
517 nx = 128; | |
518 } | |
519 } else if (s_cmp(c3, "HRD", (ftnlen)3, (ftnlen)3) == 0) { | |
520 if (sname) { | |
521 nx = 128; | |
522 } else { | |
523 nx = 128; | |
524 } | |
525 } else if (s_cmp(c3, "BRD", (ftnlen)3, (ftnlen)3) == 0) { | |
526 if (sname) { | |
527 nx = 128; | |
528 } else { | |
529 nx = 128; | |
530 } | |
531 } | |
532 } else if (s_cmp(c2, "SY", (ftnlen)2, (ftnlen)2) == 0) { | |
533 if (sname && s_cmp(c3, "TRD", (ftnlen)3, (ftnlen)3) == 0) { | |
534 nx = 32; | |
535 } | |
536 } else if (cname && s_cmp(c2, "HE", (ftnlen)2, (ftnlen)2) == 0) { | |
537 if (s_cmp(c3, "TRD", (ftnlen)3, (ftnlen)3) == 0) { | |
538 nx = 32; | |
539 } | |
540 } else if (sname && s_cmp(c2, "OR", (ftnlen)2, (ftnlen)2) == 0) { | |
541 if (*(unsigned char *)c3 == 'G') { | |
542 if (s_cmp(c4, "QR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "RQ", | |
543 (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "LQ", (ftnlen)2, ( | |
544 ftnlen)2) == 0 || s_cmp(c4, "QL", (ftnlen)2, (ftnlen)2) == | |
545 0 || s_cmp(c4, "HR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp( | |
546 c4, "TR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "BR", ( | |
547 ftnlen)2, (ftnlen)2) == 0) { | |
548 nx = 128; | |
549 } | |
550 } | |
551 } else if (cname && s_cmp(c2, "UN", (ftnlen)2, (ftnlen)2) == 0) { | |
552 if (*(unsigned char *)c3 == 'G') { | |
553 if (s_cmp(c4, "QR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "RQ", | |
554 (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "LQ", (ftnlen)2, ( | |
555 ftnlen)2) == 0 || s_cmp(c4, "QL", (ftnlen)2, (ftnlen)2) == | |
556 0 || s_cmp(c4, "HR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp( | |
557 c4, "TR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, "BR", ( | |
558 ftnlen)2, (ftnlen)2) == 0) { | |
559 nx = 128; | |
560 } | |
561 } | |
562 } | |
563 ret_val = nx; | |
564 return ret_val; | |
565 | |
566 L80: | |
567 | |
568 /* ISPEC = 4: number of shifts (used by xHSEQR) */ | |
569 | |
570 ret_val = 6; | |
571 return ret_val; | |
572 | |
573 L90: | |
574 | |
575 /* ISPEC = 5: minimum column dimension (not used) */ | |
576 | |
577 ret_val = 2; | |
578 return ret_val; | |
579 | |
580 L100: | |
581 | |
582 /* ISPEC = 6: crossover point for SVD (used by xGELSS and xGESVD) */ | |
583 | |
584 ret_val = (integer) ((real) min(*n1,*n2) * 1.6f); | |
585 return ret_val; | |
586 | |
587 L110: | |
588 | |
589 /* ISPEC = 7: number of processors (not used) */ | |
590 | |
591 ret_val = 1; | |
592 return ret_val; | |
593 | |
594 L120: | |
595 | |
596 /* ISPEC = 8: crossover point for multishift (used by xHSEQR) */ | |
597 | |
598 ret_val = 50; | |
599 return ret_val; | |
600 | |
601 L130: | |
602 | |
603 /* ISPEC = 9: maximum size of the subproblems at the bottom of the */ | |
604 /* computation tree in the divide-and-conquer algorithm */ | |
605 /* (used by xGELSD and xGESDD) */ | |
606 | |
607 ret_val = 25; | |
608 return ret_val; | |
609 | |
610 L140: | |
611 | |
612 /* ISPEC = 10: ieee NaN arithmetic can be trusted not to trap */ | |
613 | |
614 /* ILAENV = 0 */ | |
615 ret_val = 1; | |
616 if (ret_val == 1) { | |
617 ret_val = ieeeck_(&c__0, &c_b163, &c_b164); | |
618 } | |
619 return ret_val; | |
620 | |
621 L150: | |
622 | |
623 /* ISPEC = 11: infinity arithmetic can be trusted not to trap */ | |
624 | |
625 /* ILAENV = 0 */ | |
626 ret_val = 1; | |
627 if (ret_val == 1) { | |
628 ret_val = ieeeck_(&c__1, &c_b163, &c_b164); | |
629 } | |
630 return ret_val; | |
631 | |
632 L160: | |
633 | |
634 /* 12 <= ISPEC <= 16: xHSEQR or one of its subroutines. */ | |
635 | |
636 ret_val = iparmq_(ispec, name__, opts, n1, n2, n3, n4) | |
637 ; | |
638 return ret_val; | |
639 | |
640 /* End of ILAENV */ | |
641 | |
642 } /* ilaenv_ */ |