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.

iparmq.f 14 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395
  1. *> \brief \b IPARMQ
  2. *
  3. * =========== DOCUMENTATION ===========
  4. *
  5. * Online html documentation available at
  6. * http://www.netlib.org/lapack/explore-html/
  7. *
  8. *> \htmlonly
  9. *> Download IPARMQ + dependencies
  10. *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/iparmq.f">
  11. *> [TGZ]</a>
  12. *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/iparmq.f">
  13. *> [ZIP]</a>
  14. *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/iparmq.f">
  15. *> [TXT]</a>
  16. *> \endhtmlonly
  17. *
  18. * Definition:
  19. * ===========
  20. *
  21. * INTEGER FUNCTION IPARMQ( ISPEC, NAME, OPTS, N, ILO, IHI, LWORK )
  22. *
  23. * .. Scalar Arguments ..
  24. * INTEGER IHI, ILO, ISPEC, LWORK, N
  25. * CHARACTER NAME*( * ), OPTS*( * )
  26. *
  27. *
  28. *> \par Purpose:
  29. * =============
  30. *>
  31. *> \verbatim
  32. *>
  33. *> This program sets problem and machine dependent parameters
  34. *> useful for xHSEQR and related subroutines for eigenvalue
  35. *> problems. It is called whenever
  36. *> IPARMQ is called with 12 <= ISPEC <= 16
  37. *> \endverbatim
  38. *
  39. * Arguments:
  40. * ==========
  41. *
  42. *> \param[in] ISPEC
  43. *> \verbatim
  44. *> ISPEC is INTEGER
  45. *> ISPEC specifies which tunable parameter IPARMQ should
  46. *> return.
  47. *>
  48. *> ISPEC=12: (INMIN) Matrices of order nmin or less
  49. *> are sent directly to xLAHQR, the implicit
  50. *> double shift QR algorithm. NMIN must be
  51. *> at least 11.
  52. *>
  53. *> ISPEC=13: (INWIN) Size of the deflation window.
  54. *> This is best set greater than or equal to
  55. *> the number of simultaneous shifts NS.
  56. *> Larger matrices benefit from larger deflation
  57. *> windows.
  58. *>
  59. *> ISPEC=14: (INIBL) Determines when to stop nibbling and
  60. *> invest in an (expensive) multi-shift QR sweep.
  61. *> If the aggressive early deflation subroutine
  62. *> finds LD converged eigenvalues from an order
  63. *> NW deflation window and LD > (NW*NIBBLE)/100,
  64. *> then the next QR sweep is skipped and early
  65. *> deflation is applied immediately to the
  66. *> remaining active diagonal block. Setting
  67. *> IPARMQ(ISPEC=14) = 0 causes TTQRE to skip a
  68. *> multi-shift QR sweep whenever early deflation
  69. *> finds a converged eigenvalue. Setting
  70. *> IPARMQ(ISPEC=14) greater than or equal to 100
  71. *> prevents TTQRE from skipping a multi-shift
  72. *> QR sweep.
  73. *>
  74. *> ISPEC=15: (NSHFTS) The number of simultaneous shifts in
  75. *> a multi-shift QR iteration.
  76. *>
  77. *> ISPEC=16: (IACC22) IPARMQ is set to 0, 1 or 2 with the
  78. *> following meanings.
  79. *> 0: During the multi-shift QR/QZ sweep,
  80. *> blocked eigenvalue reordering, blocked
  81. *> Hessenberg-triangular reduction,
  82. *> reflections and/or rotations are not
  83. *> accumulated when updating the
  84. *> far-from-diagonal matrix entries.
  85. *> 1: During the multi-shift QR/QZ sweep,
  86. *> blocked eigenvalue reordering, blocked
  87. *> Hessenberg-triangular reduction,
  88. *> reflections and/or rotations are
  89. *> accumulated, and matrix-matrix
  90. *> multiplication is used to update the
  91. *> far-from-diagonal matrix entries.
  92. *> 2: During the multi-shift QR/QZ sweep,
  93. *> blocked eigenvalue reordering, blocked
  94. *> Hessenberg-triangular reduction,
  95. *> reflections and/or rotations are
  96. *> accumulated, and 2-by-2 block structure
  97. *> is exploited during matrix-matrix
  98. *> multiplies.
  99. *> (If xTRMM is slower than xGEMM, then
  100. *> IPARMQ(ISPEC=16)=1 may be more efficient than
  101. *> IPARMQ(ISPEC=16)=2 despite the greater level of
  102. *> arithmetic work implied by the latter choice.)
  103. *> \endverbatim
  104. *>
  105. *> \param[in] NAME
  106. *> \verbatim
  107. *> NAME is CHARACTER string
  108. *> Name of the calling subroutine
  109. *> \endverbatim
  110. *>
  111. *> \param[in] OPTS
  112. *> \verbatim
  113. *> OPTS is CHARACTER string
  114. *> This is a concatenation of the string arguments to
  115. *> TTQRE.
  116. *> \endverbatim
  117. *>
  118. *> \param[in] N
  119. *> \verbatim
  120. *> N is INTEGER
  121. *> N is the order of the Hessenberg matrix H.
  122. *> \endverbatim
  123. *>
  124. *> \param[in] ILO
  125. *> \verbatim
  126. *> ILO is INTEGER
  127. *> \endverbatim
  128. *>
  129. *> \param[in] IHI
  130. *> \verbatim
  131. *> IHI is INTEGER
  132. *> It is assumed that H is already upper triangular
  133. *> in rows and columns 1:ILO-1 and IHI+1:N.
  134. *> \endverbatim
  135. *>
  136. *> \param[in] LWORK
  137. *> \verbatim
  138. *> LWORK is INTEGER
  139. *> The amount of workspace available.
  140. *> \endverbatim
  141. *
  142. * Authors:
  143. * ========
  144. *
  145. *> \author Univ. of Tennessee
  146. *> \author Univ. of California Berkeley
  147. *> \author Univ. of Colorado Denver
  148. *> \author NAG Ltd.
  149. *
  150. *> \date June 2017
  151. *
  152. *> \ingroup OTHERauxiliary
  153. *
  154. *> \par Further Details:
  155. * =====================
  156. *>
  157. *> \verbatim
  158. *>
  159. *> Little is known about how best to choose these parameters.
  160. *> It is possible to use different values of the parameters
  161. *> for each of CHSEQR, DHSEQR, SHSEQR and ZHSEQR.
  162. *>
  163. *> It is probably best to choose different parameters for
  164. *> different matrices and different parameters at different
  165. *> times during the iteration, but this has not been
  166. *> implemented --- yet.
  167. *>
  168. *>
  169. *> The best choices of most of the parameters depend
  170. *> in an ill-understood way on the relative execution
  171. *> rate of xLAQR3 and xLAQR5 and on the nature of each
  172. *> particular eigenvalue problem. Experiment may be the
  173. *> only practical way to determine which choices are most
  174. *> effective.
  175. *>
  176. *> Following is a list of default values supplied by IPARMQ.
  177. *> These defaults may be adjusted in order to attain better
  178. *> performance in any particular computational environment.
  179. *>
  180. *> IPARMQ(ISPEC=12) The xLAHQR vs xLAQR0 crossover point.
  181. *> Default: 75. (Must be at least 11.)
  182. *>
  183. *> IPARMQ(ISPEC=13) Recommended deflation window size.
  184. *> This depends on ILO, IHI and NS, the
  185. *> number of simultaneous shifts returned
  186. *> by IPARMQ(ISPEC=15). The default for
  187. *> (IHI-ILO+1) <= 500 is NS. The default
  188. *> for (IHI-ILO+1) > 500 is 3*NS/2.
  189. *>
  190. *> IPARMQ(ISPEC=14) Nibble crossover point. Default: 14.
  191. *>
  192. *> IPARMQ(ISPEC=15) Number of simultaneous shifts, NS.
  193. *> a multi-shift QR iteration.
  194. *>
  195. *> If IHI-ILO+1 is ...
  196. *>
  197. *> greater than ...but less ... the
  198. *> or equal to ... than default is
  199. *>
  200. *> 0 30 NS = 2+
  201. *> 30 60 NS = 4+
  202. *> 60 150 NS = 10
  203. *> 150 590 NS = **
  204. *> 590 3000 NS = 64
  205. *> 3000 6000 NS = 128
  206. *> 6000 infinity NS = 256
  207. *>
  208. *> (+) By default matrices of this order are
  209. *> passed to the implicit double shift routine
  210. *> xLAHQR. See IPARMQ(ISPEC=12) above. These
  211. *> values of NS are used only in case of a rare
  212. *> xLAHQR failure.
  213. *>
  214. *> (**) The asterisks (**) indicate an ad-hoc
  215. *> function increasing from 10 to 64.
  216. *>
  217. *> IPARMQ(ISPEC=16) Select structured matrix multiply.
  218. *> (See ISPEC=16 above for details.)
  219. *> Default: 3.
  220. *> \endverbatim
  221. *>
  222. * =====================================================================
  223. INTEGER FUNCTION IPARMQ( ISPEC, NAME, OPTS, N, ILO, IHI, LWORK )
  224. *
  225. * -- LAPACK auxiliary routine (version 3.7.1) --
  226. * -- LAPACK is a software package provided by Univ. of Tennessee, --
  227. * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
  228. * June 2017
  229. *
  230. * .. Scalar Arguments ..
  231. INTEGER IHI, ILO, ISPEC, LWORK, N
  232. CHARACTER NAME*( * ), OPTS*( * )
  233. *
  234. * ================================================================
  235. * .. Parameters ..
  236. INTEGER INMIN, INWIN, INIBL, ISHFTS, IACC22
  237. PARAMETER ( INMIN = 12, INWIN = 13, INIBL = 14,
  238. $ ISHFTS = 15, IACC22 = 16 )
  239. INTEGER NMIN, K22MIN, KACMIN, NIBBLE, KNWSWP
  240. PARAMETER ( NMIN = 75, K22MIN = 14, KACMIN = 14,
  241. $ NIBBLE = 14, KNWSWP = 500 )
  242. REAL TWO
  243. PARAMETER ( TWO = 2.0 )
  244. * ..
  245. * .. Local Scalars ..
  246. INTEGER NH, NS
  247. INTEGER I, IC, IZ
  248. CHARACTER SUBNAM*6
  249. * ..
  250. * .. Intrinsic Functions ..
  251. INTRINSIC LOG, MAX, MOD, NINT, REAL
  252. * ..
  253. * .. Executable Statements ..
  254. IF( ( ISPEC.EQ.ISHFTS ) .OR. ( ISPEC.EQ.INWIN ) .OR.
  255. $ ( ISPEC.EQ.IACC22 ) ) THEN
  256. *
  257. * ==== Set the number simultaneous shifts ====
  258. *
  259. NH = IHI - ILO + 1
  260. NS = 2
  261. IF( NH.GE.30 )
  262. $ NS = 4
  263. IF( NH.GE.60 )
  264. $ NS = 10
  265. IF( NH.GE.150 )
  266. $ NS = MAX( 10, NH / NINT( LOG( REAL( NH ) ) / LOG( TWO ) ) )
  267. IF( NH.GE.590 )
  268. $ NS = 64
  269. IF( NH.GE.3000 )
  270. $ NS = 128
  271. IF( NH.GE.6000 )
  272. $ NS = 256
  273. NS = MAX( 2, NS-MOD( NS, 2 ) )
  274. END IF
  275. *
  276. IF( ISPEC.EQ.INMIN ) THEN
  277. *
  278. *
  279. * ===== Matrices of order smaller than NMIN get sent
  280. * . to xLAHQR, the classic double shift algorithm.
  281. * . This must be at least 11. ====
  282. *
  283. IPARMQ = NMIN
  284. *
  285. ELSE IF( ISPEC.EQ.INIBL ) THEN
  286. *
  287. * ==== INIBL: skip a multi-shift qr iteration and
  288. * . whenever aggressive early deflation finds
  289. * . at least (NIBBLE*(window size)/100) deflations. ====
  290. *
  291. IPARMQ = NIBBLE
  292. *
  293. ELSE IF( ISPEC.EQ.ISHFTS ) THEN
  294. *
  295. * ==== NSHFTS: The number of simultaneous shifts =====
  296. *
  297. IPARMQ = NS
  298. *
  299. ELSE IF( ISPEC.EQ.INWIN ) THEN
  300. *
  301. * ==== NW: deflation window size. ====
  302. *
  303. IF( NH.LE.KNWSWP ) THEN
  304. IPARMQ = NS
  305. ELSE
  306. IPARMQ = 3*NS / 2
  307. END IF
  308. *
  309. ELSE IF( ISPEC.EQ.IACC22 ) THEN
  310. *
  311. * ==== IACC22: Whether to accumulate reflections
  312. * . before updating the far-from-diagonal elements
  313. * . and whether to use 2-by-2 block structure while
  314. * . doing it. A small amount of work could be saved
  315. * . by making this choice dependent also upon the
  316. * . NH=IHI-ILO+1.
  317. *
  318. *
  319. * Convert NAME to upper case if the first character is lower case.
  320. *
  321. IPARMQ = 0
  322. SUBNAM = NAME
  323. IC = ICHAR( SUBNAM( 1: 1 ) )
  324. IZ = ICHAR( 'Z' )
  325. IF( IZ.EQ.90 .OR. IZ.EQ.122 ) THEN
  326. *
  327. * ASCII character set
  328. *
  329. IF( IC.GE.97 .AND. IC.LE.122 ) THEN
  330. SUBNAM( 1: 1 ) = CHAR( IC-32 )
  331. DO I = 2, 6
  332. IC = ICHAR( SUBNAM( I: I ) )
  333. IF( IC.GE.97 .AND. IC.LE.122 )
  334. $ SUBNAM( I: I ) = CHAR( IC-32 )
  335. END DO
  336. END IF
  337. *
  338. ELSE IF( IZ.EQ.233 .OR. IZ.EQ.169 ) THEN
  339. *
  340. * EBCDIC character set
  341. *
  342. IF( ( IC.GE.129 .AND. IC.LE.137 ) .OR.
  343. $ ( IC.GE.145 .AND. IC.LE.153 ) .OR.
  344. $ ( IC.GE.162 .AND. IC.LE.169 ) ) THEN
  345. SUBNAM( 1: 1 ) = CHAR( IC+64 )
  346. DO I = 2, 6
  347. IC = ICHAR( SUBNAM( I: I ) )
  348. IF( ( IC.GE.129 .AND. IC.LE.137 ) .OR.
  349. $ ( IC.GE.145 .AND. IC.LE.153 ) .OR.
  350. $ ( IC.GE.162 .AND. IC.LE.169 ) )SUBNAM( I:
  351. $ I ) = CHAR( IC+64 )
  352. END DO
  353. END IF
  354. *
  355. ELSE IF( IZ.EQ.218 .OR. IZ.EQ.250 ) THEN
  356. *
  357. * Prime machines: ASCII+128
  358. *
  359. IF( IC.GE.225 .AND. IC.LE.250 ) THEN
  360. SUBNAM( 1: 1 ) = CHAR( IC-32 )
  361. DO I = 2, 6
  362. IC = ICHAR( SUBNAM( I: I ) )
  363. IF( IC.GE.225 .AND. IC.LE.250 )
  364. $ SUBNAM( I: I ) = CHAR( IC-32 )
  365. END DO
  366. END IF
  367. END IF
  368. *
  369. IF( SUBNAM( 2:6 ).EQ.'GGHRD' .OR.
  370. $ SUBNAM( 2:6 ).EQ.'GGHD3' ) THEN
  371. IPARMQ = 1
  372. IF( NH.GE.K22MIN )
  373. $ IPARMQ = 2
  374. ELSE IF ( SUBNAM( 4:6 ).EQ.'EXC' ) THEN
  375. IF( NH.GE.KACMIN )
  376. $ IPARMQ = 1
  377. IF( NH.GE.K22MIN )
  378. $ IPARMQ = 2
  379. ELSE IF ( SUBNAM( 2:6 ).EQ.'HSEQR' .OR.
  380. $ SUBNAM( 2:5 ).EQ.'LAQR' ) THEN
  381. IF( NS.GE.KACMIN )
  382. $ IPARMQ = 1
  383. IF( NS.GE.K22MIN )
  384. $ IPARMQ = 2
  385. END IF
  386. *
  387. ELSE
  388. * ===== invalid value of ispec =====
  389. IPARMQ = -1
  390. *
  391. END IF
  392. *
  393. * ==== End of IPARMQ ====
  394. *
  395. END