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.

dstegr.f 9.8 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293
  1. *> \brief \b DSTEGR
  2. *
  3. * =========== DOCUMENTATION ===========
  4. *
  5. * Online html documentation available at
  6. * http://www.netlib.org/lapack/explore-html/
  7. *
  8. *> \htmlonly
  9. *> Download DSTEGR + dependencies
  10. *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/dstegr.f">
  11. *> [TGZ]</a>
  12. *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/dstegr.f">
  13. *> [ZIP]</a>
  14. *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/dstegr.f">
  15. *> [TXT]</a>
  16. *> \endhtmlonly
  17. *
  18. * Definition:
  19. * ===========
  20. *
  21. * SUBROUTINE DSTEGR( JOBZ, RANGE, N, D, E, VL, VU, IL, IU,
  22. * ABSTOL, M, W, Z, LDZ, ISUPPZ, WORK, LWORK, IWORK,
  23. * LIWORK, INFO )
  24. *
  25. * .. Scalar Arguments ..
  26. * CHARACTER JOBZ, RANGE
  27. * INTEGER IL, INFO, IU, LDZ, LIWORK, LWORK, M, N
  28. * DOUBLE PRECISION ABSTOL, VL, VU
  29. * ..
  30. * .. Array Arguments ..
  31. * INTEGER ISUPPZ( * ), IWORK( * )
  32. * DOUBLE PRECISION D( * ), E( * ), W( * ), WORK( * )
  33. * DOUBLE PRECISION Z( LDZ, * )
  34. * ..
  35. *
  36. *
  37. *> \par Purpose:
  38. * =============
  39. *>
  40. *> \verbatim
  41. *>
  42. *> DSTEGR computes selected eigenvalues and, optionally, eigenvectors
  43. *> of a real symmetric tridiagonal matrix T. Any such unreduced matrix has
  44. *> a well defined set of pairwise different real eigenvalues, the corresponding
  45. *> real eigenvectors are pairwise orthogonal.
  46. *>
  47. *> The spectrum may be computed either completely or partially by specifying
  48. *> either an interval (VL,VU] or a range of indices IL:IU for the desired
  49. *> eigenvalues.
  50. *>
  51. *> DSTEGR is a compatability wrapper around the improved DSTEMR routine.
  52. *> See DSTEMR for further details.
  53. *>
  54. *> One important change is that the ABSTOL parameter no longer provides any
  55. *> benefit and hence is no longer used.
  56. *>
  57. *> Note : DSTEGR and DSTEMR work only on machines which follow
  58. *> IEEE-754 floating-point standard in their handling of infinities and
  59. *> NaNs. Normal execution may create these exceptiona values and hence
  60. *> may abort due to a floating point exception in environments which
  61. *> do not conform to the IEEE-754 standard.
  62. *> \endverbatim
  63. *
  64. * Arguments:
  65. * ==========
  66. *
  67. *> \param[in] JOBZ
  68. *> \verbatim
  69. *> JOBZ is CHARACTER*1
  70. *> = 'N': Compute eigenvalues only;
  71. *> = 'V': Compute eigenvalues and eigenvectors.
  72. *> \endverbatim
  73. *>
  74. *> \param[in] RANGE
  75. *> \verbatim
  76. *> RANGE is CHARACTER*1
  77. *> = 'A': all eigenvalues will be found.
  78. *> = 'V': all eigenvalues in the half-open interval (VL,VU]
  79. *> will be found.
  80. *> = 'I': the IL-th through IU-th eigenvalues will be found.
  81. *> \endverbatim
  82. *>
  83. *> \param[in] N
  84. *> \verbatim
  85. *> N is INTEGER
  86. *> The order of the matrix. N >= 0.
  87. *> \endverbatim
  88. *>
  89. *> \param[in,out] D
  90. *> \verbatim
  91. *> D is DOUBLE PRECISION array, dimension (N)
  92. *> On entry, the N diagonal elements of the tridiagonal matrix
  93. *> T. On exit, D is overwritten.
  94. *> \endverbatim
  95. *>
  96. *> \param[in,out] E
  97. *> \verbatim
  98. *> E is DOUBLE PRECISION array, dimension (N)
  99. *> On entry, the (N-1) subdiagonal elements of the tridiagonal
  100. *> matrix T in elements 1 to N-1 of E. E(N) need not be set on
  101. *> input, but is used internally as workspace.
  102. *> On exit, E is overwritten.
  103. *> \endverbatim
  104. *>
  105. *> \param[in] VL
  106. *> \verbatim
  107. *> VL is DOUBLE PRECISION
  108. *> \endverbatim
  109. *>
  110. *> \param[in] VU
  111. *> \verbatim
  112. *> VU is DOUBLE PRECISION
  113. *>
  114. *> If RANGE='V', the lower and upper bounds of the interval to
  115. *> be searched for eigenvalues. VL < VU.
  116. *> Not referenced if RANGE = 'A' or 'I'.
  117. *> \endverbatim
  118. *>
  119. *> \param[in] IL
  120. *> \verbatim
  121. *> IL is INTEGER
  122. *> \endverbatim
  123. *>
  124. *> \param[in] IU
  125. *> \verbatim
  126. *> IU is INTEGER
  127. *>
  128. *> If RANGE='I', the indices (in ascending order) of the
  129. *> smallest and largest eigenvalues to be returned.
  130. *> 1 <= IL <= IU <= N, if N > 0.
  131. *> Not referenced if RANGE = 'A' or 'V'.
  132. *> \endverbatim
  133. *>
  134. *> \param[in] ABSTOL
  135. *> \verbatim
  136. *> ABSTOL is DOUBLE PRECISION
  137. *> Unused. Was the absolute error tolerance for the
  138. *> eigenvalues/eigenvectors in previous versions.
  139. *> \endverbatim
  140. *>
  141. *> \param[out] M
  142. *> \verbatim
  143. *> M is INTEGER
  144. *> The total number of eigenvalues found. 0 <= M <= N.
  145. *> If RANGE = 'A', M = N, and if RANGE = 'I', M = IU-IL+1.
  146. *> \endverbatim
  147. *>
  148. *> \param[out] W
  149. *> \verbatim
  150. *> W is DOUBLE PRECISION array, dimension (N)
  151. *> The first M elements contain the selected eigenvalues in
  152. *> ascending order.
  153. *> \endverbatim
  154. *>
  155. *> \param[out] Z
  156. *> \verbatim
  157. *> Z is DOUBLE PRECISION array, dimension (LDZ, max(1,M) )
  158. *> If JOBZ = 'V', and if INFO = 0, then the first M columns of Z
  159. *> contain the orthonormal eigenvectors of the matrix T
  160. *> corresponding to the selected eigenvalues, with the i-th
  161. *> column of Z holding the eigenvector associated with W(i).
  162. *> If JOBZ = 'N', then Z is not referenced.
  163. *> Note: the user must ensure that at least max(1,M) columns are
  164. *> supplied in the array Z; if RANGE = 'V', the exact value of M
  165. *> is not known in advance and an upper bound must be used.
  166. *> Supplying N columns is always safe.
  167. *> \endverbatim
  168. *>
  169. *> \param[in] LDZ
  170. *> \verbatim
  171. *> LDZ is INTEGER
  172. *> The leading dimension of the array Z. LDZ >= 1, and if
  173. *> JOBZ = 'V', then LDZ >= max(1,N).
  174. *> \endverbatim
  175. *>
  176. *> \param[out] ISUPPZ
  177. *> \verbatim
  178. *> ISUPPZ is INTEGER ARRAY, dimension ( 2*max(1,M) )
  179. *> The support of the eigenvectors in Z, i.e., the indices
  180. *> indicating the nonzero elements in Z. The i-th computed eigenvector
  181. *> is nonzero only in elements ISUPPZ( 2*i-1 ) through
  182. *> ISUPPZ( 2*i ). This is relevant in the case when the matrix
  183. *> is split. ISUPPZ is only accessed when JOBZ is 'V' and N > 0.
  184. *> \endverbatim
  185. *>
  186. *> \param[out] WORK
  187. *> \verbatim
  188. *> WORK is DOUBLE PRECISION array, dimension (LWORK)
  189. *> On exit, if INFO = 0, WORK(1) returns the optimal
  190. *> (and minimal) LWORK.
  191. *> \endverbatim
  192. *>
  193. *> \param[in] LWORK
  194. *> \verbatim
  195. *> LWORK is INTEGER
  196. *> The dimension of the array WORK. LWORK >= max(1,18*N)
  197. *> if JOBZ = 'V', and LWORK >= max(1,12*N) if JOBZ = 'N'.
  198. *> If LWORK = -1, then a workspace query is assumed; the routine
  199. *> only calculates the optimal size of the WORK array, returns
  200. *> this value as the first entry of the WORK array, and no error
  201. *> message related to LWORK is issued by XERBLA.
  202. *> \endverbatim
  203. *>
  204. *> \param[out] IWORK
  205. *> \verbatim
  206. *> IWORK is INTEGER array, dimension (LIWORK)
  207. *> On exit, if INFO = 0, IWORK(1) returns the optimal LIWORK.
  208. *> \endverbatim
  209. *>
  210. *> \param[in] LIWORK
  211. *> \verbatim
  212. *> LIWORK is INTEGER
  213. *> The dimension of the array IWORK. LIWORK >= max(1,10*N)
  214. *> if the eigenvectors are desired, and LIWORK >= max(1,8*N)
  215. *> if only the eigenvalues are to be computed.
  216. *> If LIWORK = -1, then a workspace query is assumed; the
  217. *> routine only calculates the optimal size of the IWORK array,
  218. *> returns this value as the first entry of the IWORK array, and
  219. *> no error message related to LIWORK is issued by XERBLA.
  220. *> \endverbatim
  221. *>
  222. *> \param[out] INFO
  223. *> \verbatim
  224. *> INFO is INTEGER
  225. *> On exit, INFO
  226. *> = 0: successful exit
  227. *> < 0: if INFO = -i, the i-th argument had an illegal value
  228. *> > 0: if INFO = 1X, internal error in DLARRE,
  229. *> if INFO = 2X, internal error in DLARRV.
  230. *> Here, the digit X = ABS( IINFO ) < 10, where IINFO is
  231. *> the nonzero error code returned by DLARRE or
  232. *> DLARRV, respectively.
  233. *> \endverbatim
  234. *
  235. * Authors:
  236. * ========
  237. *
  238. *> \author Univ. of Tennessee
  239. *> \author Univ. of California Berkeley
  240. *> \author Univ. of Colorado Denver
  241. *> \author NAG Ltd.
  242. *
  243. *> \date November 2011
  244. *
  245. *> \ingroup doubleOTHERcomputational
  246. *
  247. *> \par Contributors:
  248. * ==================
  249. *>
  250. *> Inderjit Dhillon, IBM Almaden, USA \n
  251. *> Osni Marques, LBNL/NERSC, USA \n
  252. *> Christof Voemel, LBNL/NERSC, USA \n
  253. *
  254. * =====================================================================
  255. SUBROUTINE DSTEGR( JOBZ, RANGE, N, D, E, VL, VU, IL, IU,
  256. $ ABSTOL, M, W, Z, LDZ, ISUPPZ, WORK, LWORK, IWORK,
  257. $ LIWORK, INFO )
  258. *
  259. * -- LAPACK computational routine (version 3.4.0) --
  260. * -- LAPACK is a software package provided by Univ. of Tennessee, --
  261. * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
  262. * November 2011
  263. *
  264. * .. Scalar Arguments ..
  265. CHARACTER JOBZ, RANGE
  266. INTEGER IL, INFO, IU, LDZ, LIWORK, LWORK, M, N
  267. DOUBLE PRECISION ABSTOL, VL, VU
  268. * ..
  269. * .. Array Arguments ..
  270. INTEGER ISUPPZ( * ), IWORK( * )
  271. DOUBLE PRECISION D( * ), E( * ), W( * ), WORK( * )
  272. DOUBLE PRECISION Z( LDZ, * )
  273. * ..
  274. *
  275. * =====================================================================
  276. *
  277. * .. Local Scalars ..
  278. LOGICAL TRYRAC
  279. * ..
  280. * .. External Subroutines ..
  281. EXTERNAL DSTEMR
  282. * ..
  283. * .. Executable Statements ..
  284. INFO = 0
  285. TRYRAC = .FALSE.
  286. CALL DSTEMR( JOBZ, RANGE, N, D, E, VL, VU, IL, IU,
  287. $ M, W, Z, LDZ, N, ISUPPZ, TRYRAC, WORK, LWORK,
  288. $ IWORK, LIWORK, INFO )
  289. *
  290. * End of DSTEGR
  291. *
  292. END