You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

ilaenv.f 11 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354
  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 December 2016
  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.7.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. * December 2016
  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 IPARMQ( ISPEC, NAME, OPTS, N, ILO, IHI, LWORK )
  255. *
  256. INTEGER INMIN, INWIN, INIBL, ISHFTS, IACC22
  257. PARAMETER ( INMIN = 12, INWIN = 13, INIBL = 14,
  258. $ ISHFTS = 15, IACC22 = 16 )
  259. INTEGER NMIN, K22MIN, KACMIN, NIBBLE, KNWSWP
  260. PARAMETER ( NMIN = 11, K22MIN = 14, KACMIN = 14,
  261. $ NIBBLE = 14, KNWSWP = 500 )
  262. REAL TWO
  263. PARAMETER ( TWO = 2.0 )
  264. * ..
  265. * .. Scalar Arguments ..
  266. INTEGER IHI, ILO, ISPEC, LWORK, N
  267. CHARACTER NAME*( * ), OPTS*( * )
  268. * ..
  269. * .. Local Scalars ..
  270. INTEGER NH, NS
  271. * ..
  272. * .. Intrinsic Functions ..
  273. INTRINSIC LOG, MAX, MOD, NINT, REAL
  274. * ..
  275. * .. Executable Statements ..
  276. IF( ( ISPEC.EQ.ISHFTS ) .OR. ( ISPEC.EQ.INWIN ) .OR.
  277. $ ( ISPEC.EQ.IACC22 ) ) THEN
  278. *
  279. * ==== Set the number simultaneous shifts ====
  280. *
  281. NH = IHI - ILO + 1
  282. NS = 2
  283. IF( NH.GE.30 )
  284. $ NS = 4
  285. IF( NH.GE.60 )
  286. $ NS = 10
  287. IF( NH.GE.150 )
  288. $ NS = MAX( 10, NH / NINT( LOG( REAL( NH ) ) / LOG( TWO ) ) )
  289. IF( NH.GE.590 )
  290. $ NS = 64
  291. IF( NH.GE.3000 )
  292. $ NS = 128
  293. IF( NH.GE.6000 )
  294. $ NS = 256
  295. NS = MAX( 2, NS-MOD( NS, 2 ) )
  296. END IF
  297. *
  298. IF( ISPEC.EQ.INMIN ) THEN
  299. *
  300. *
  301. * ===== Matrices of order smaller than NMIN get sent
  302. * . to LAHQR, the classic double shift algorithm.
  303. * . This must be at least 11. ====
  304. *
  305. IPARMQ = NMIN
  306. *
  307. ELSE IF( ISPEC.EQ.INIBL ) THEN
  308. *
  309. * ==== INIBL: skip a multi-shift qr iteration and
  310. * . whenever aggressive early deflation finds
  311. * . at least (NIBBLE*(window size)/100) deflations. ====
  312. *
  313. IPARMQ = NIBBLE
  314. *
  315. ELSE IF( ISPEC.EQ.ISHFTS ) THEN
  316. *
  317. * ==== NSHFTS: The number of simultaneous shifts =====
  318. *
  319. IPARMQ = NS
  320. *
  321. ELSE IF( ISPEC.EQ.INWIN ) THEN
  322. *
  323. * ==== NW: deflation window size. ====
  324. *
  325. IF( NH.LE.KNWSWP ) THEN
  326. IPARMQ = NS
  327. ELSE
  328. IPARMQ = 3*NS / 2
  329. END IF
  330. *
  331. ELSE IF( ISPEC.EQ.IACC22 ) THEN
  332. *
  333. * ==== IACC22: Whether to accumulate reflections
  334. * . before updating the far-from-diagonal elements
  335. * . and whether to use 2-by-2 block structure while
  336. * . doing it. A small amount of work could be saved
  337. * . by making this choice dependent also upon the
  338. * . NH=IHI-ILO+1.
  339. *
  340. IPARMQ = 0
  341. IF( NS.GE.KACMIN )
  342. $ IPARMQ = 1
  343. IF( NS.GE.K22MIN )
  344. $ IPARMQ = 2
  345. *
  346. ELSE
  347. * ===== invalid value of ispec =====
  348. IPARMQ = -1
  349. *
  350. END IF
  351. *
  352. * ==== End of IPARMQ ====
  353. *
  354. END