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.

zget22.f 8.6 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317
  1. *> \brief \b ZGET22
  2. *
  3. * =========== DOCUMENTATION ===========
  4. *
  5. * Online html documentation available at
  6. * http://www.netlib.org/lapack/explore-html/
  7. *
  8. * Definition:
  9. * ===========
  10. *
  11. * SUBROUTINE ZGET22( TRANSA, TRANSE, TRANSW, N, A, LDA, E, LDE, W,
  12. * WORK, RWORK, RESULT )
  13. *
  14. * .. Scalar Arguments ..
  15. * CHARACTER TRANSA, TRANSE, TRANSW
  16. * INTEGER LDA, LDE, N
  17. * ..
  18. * .. Array Arguments ..
  19. * DOUBLE PRECISION RESULT( 2 ), RWORK( * )
  20. * COMPLEX*16 A( LDA, * ), E( LDE, * ), W( * ), WORK( * )
  21. * ..
  22. *
  23. *
  24. *> \par Purpose:
  25. * =============
  26. *>
  27. *> \verbatim
  28. *>
  29. *> ZGET22 does an eigenvector check.
  30. *>
  31. *> The basic test is:
  32. *>
  33. *> RESULT(1) = | A E - E W | / ( |A| |E| ulp )
  34. *>
  35. *> using the 1-norm. It also tests the normalization of E:
  36. *>
  37. *> RESULT(2) = max | m-norm(E(j)) - 1 | / ( n ulp )
  38. *> j
  39. *>
  40. *> where E(j) is the j-th eigenvector, and m-norm is the max-norm of a
  41. *> vector. The max-norm of a complex n-vector x in this case is the
  42. *> maximum of |re(x(i)| + |im(x(i)| over i = 1, ..., n.
  43. *> \endverbatim
  44. *
  45. * Arguments:
  46. * ==========
  47. *
  48. *> \param[in] TRANSA
  49. *> \verbatim
  50. *> TRANSA is CHARACTER*1
  51. *> Specifies whether or not A is transposed.
  52. *> = 'N': No transpose
  53. *> = 'T': Transpose
  54. *> = 'C': Conjugate transpose
  55. *> \endverbatim
  56. *>
  57. *> \param[in] TRANSE
  58. *> \verbatim
  59. *> TRANSE is CHARACTER*1
  60. *> Specifies whether or not E is transposed.
  61. *> = 'N': No transpose, eigenvectors are in columns of E
  62. *> = 'T': Transpose, eigenvectors are in rows of E
  63. *> = 'C': Conjugate transpose, eigenvectors are in rows of E
  64. *> \endverbatim
  65. *>
  66. *> \param[in] TRANSW
  67. *> \verbatim
  68. *> TRANSW is CHARACTER*1
  69. *> Specifies whether or not W is transposed.
  70. *> = 'N': No transpose
  71. *> = 'T': Transpose, same as TRANSW = 'N'
  72. *> = 'C': Conjugate transpose, use -WI(j) instead of WI(j)
  73. *> \endverbatim
  74. *>
  75. *> \param[in] N
  76. *> \verbatim
  77. *> N is INTEGER
  78. *> The order of the matrix A. N >= 0.
  79. *> \endverbatim
  80. *>
  81. *> \param[in] A
  82. *> \verbatim
  83. *> A is COMPLEX*16 array, dimension (LDA,N)
  84. *> The matrix whose eigenvectors are in E.
  85. *> \endverbatim
  86. *>
  87. *> \param[in] LDA
  88. *> \verbatim
  89. *> LDA is INTEGER
  90. *> The leading dimension of the array A. LDA >= max(1,N).
  91. *> \endverbatim
  92. *>
  93. *> \param[in] E
  94. *> \verbatim
  95. *> E is COMPLEX*16 array, dimension (LDE,N)
  96. *> The matrix of eigenvectors. If TRANSE = 'N', the eigenvectors
  97. *> are stored in the columns of E, if TRANSE = 'T' or 'C', the
  98. *> eigenvectors are stored in the rows of E.
  99. *> \endverbatim
  100. *>
  101. *> \param[in] LDE
  102. *> \verbatim
  103. *> LDE is INTEGER
  104. *> The leading dimension of the array E. LDE >= max(1,N).
  105. *> \endverbatim
  106. *>
  107. *> \param[in] W
  108. *> \verbatim
  109. *> W is COMPLEX*16 array, dimension (N)
  110. *> The eigenvalues of A.
  111. *> \endverbatim
  112. *>
  113. *> \param[out] WORK
  114. *> \verbatim
  115. *> WORK is COMPLEX*16 array, dimension (N*N)
  116. *> \endverbatim
  117. *>
  118. *> \param[out] RWORK
  119. *> \verbatim
  120. *> RWORK is DOUBLE PRECISION array, dimension (N)
  121. *> \endverbatim
  122. *>
  123. *> \param[out] RESULT
  124. *> \verbatim
  125. *> RESULT is DOUBLE PRECISION array, dimension (2)
  126. *> RESULT(1) = | A E - E W | / ( |A| |E| ulp )
  127. *> RESULT(2) = max | m-norm(E(j)) - 1 | / ( n ulp )
  128. *> \endverbatim
  129. *
  130. * Authors:
  131. * ========
  132. *
  133. *> \author Univ. of Tennessee
  134. *> \author Univ. of California Berkeley
  135. *> \author Univ. of Colorado Denver
  136. *> \author NAG Ltd.
  137. *
  138. *> \date December 2016
  139. *
  140. *> \ingroup complex16_eig
  141. *
  142. * =====================================================================
  143. SUBROUTINE ZGET22( TRANSA, TRANSE, TRANSW, N, A, LDA, E, LDE, W,
  144. $ WORK, RWORK, RESULT )
  145. *
  146. * -- LAPACK test routine (version 3.7.0) --
  147. * -- LAPACK is a software package provided by Univ. of Tennessee, --
  148. * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
  149. * December 2016
  150. *
  151. * .. Scalar Arguments ..
  152. CHARACTER TRANSA, TRANSE, TRANSW
  153. INTEGER LDA, LDE, N
  154. * ..
  155. * .. Array Arguments ..
  156. DOUBLE PRECISION RESULT( 2 ), RWORK( * )
  157. COMPLEX*16 A( LDA, * ), E( LDE, * ), W( * ), WORK( * )
  158. * ..
  159. *
  160. * =====================================================================
  161. *
  162. * .. Parameters ..
  163. DOUBLE PRECISION ZERO, ONE
  164. PARAMETER ( ZERO = 0.0D+0, ONE = 1.0D+0 )
  165. COMPLEX*16 CZERO, CONE
  166. PARAMETER ( CZERO = ( 0.0D+0, 0.0D+0 ),
  167. $ CONE = ( 1.0D+0, 0.0D+0 ) )
  168. * ..
  169. * .. Local Scalars ..
  170. CHARACTER NORMA, NORME
  171. INTEGER ITRNSE, ITRNSW, J, JCOL, JOFF, JROW, JVEC
  172. DOUBLE PRECISION ANORM, ENORM, ENRMAX, ENRMIN, ERRNRM, TEMP1,
  173. $ ULP, UNFL
  174. COMPLEX*16 WTEMP
  175. * ..
  176. * .. External Functions ..
  177. LOGICAL LSAME
  178. DOUBLE PRECISION DLAMCH, ZLANGE
  179. EXTERNAL LSAME, DLAMCH, ZLANGE
  180. * ..
  181. * .. External Subroutines ..
  182. EXTERNAL ZGEMM, ZLASET
  183. * ..
  184. * .. Intrinsic Functions ..
  185. INTRINSIC ABS, DBLE, DCONJG, DIMAG, MAX, MIN
  186. * ..
  187. * .. Executable Statements ..
  188. *
  189. * Initialize RESULT (in case N=0)
  190. *
  191. RESULT( 1 ) = ZERO
  192. RESULT( 2 ) = ZERO
  193. IF( N.LE.0 )
  194. $ RETURN
  195. *
  196. UNFL = DLAMCH( 'Safe minimum' )
  197. ULP = DLAMCH( 'Precision' )
  198. *
  199. ITRNSE = 0
  200. ITRNSW = 0
  201. NORMA = 'O'
  202. NORME = 'O'
  203. *
  204. IF( LSAME( TRANSA, 'T' ) .OR. LSAME( TRANSA, 'C' ) ) THEN
  205. NORMA = 'I'
  206. END IF
  207. *
  208. IF( LSAME( TRANSE, 'T' ) ) THEN
  209. ITRNSE = 1
  210. NORME = 'I'
  211. ELSE IF( LSAME( TRANSE, 'C' ) ) THEN
  212. ITRNSE = 2
  213. NORME = 'I'
  214. END IF
  215. *
  216. IF( LSAME( TRANSW, 'C' ) ) THEN
  217. ITRNSW = 1
  218. END IF
  219. *
  220. * Normalization of E:
  221. *
  222. ENRMIN = ONE / ULP
  223. ENRMAX = ZERO
  224. IF( ITRNSE.EQ.0 ) THEN
  225. DO 20 JVEC = 1, N
  226. TEMP1 = ZERO
  227. DO 10 J = 1, N
  228. TEMP1 = MAX( TEMP1, ABS( DBLE( E( J, JVEC ) ) )+
  229. $ ABS( DIMAG( E( J, JVEC ) ) ) )
  230. 10 CONTINUE
  231. ENRMIN = MIN( ENRMIN, TEMP1 )
  232. ENRMAX = MAX( ENRMAX, TEMP1 )
  233. 20 CONTINUE
  234. ELSE
  235. DO 30 JVEC = 1, N
  236. RWORK( JVEC ) = ZERO
  237. 30 CONTINUE
  238. *
  239. DO 50 J = 1, N
  240. DO 40 JVEC = 1, N
  241. RWORK( JVEC ) = MAX( RWORK( JVEC ),
  242. $ ABS( DBLE( E( JVEC, J ) ) )+
  243. $ ABS( DIMAG( E( JVEC, J ) ) ) )
  244. 40 CONTINUE
  245. 50 CONTINUE
  246. *
  247. DO 60 JVEC = 1, N
  248. ENRMIN = MIN( ENRMIN, RWORK( JVEC ) )
  249. ENRMAX = MAX( ENRMAX, RWORK( JVEC ) )
  250. 60 CONTINUE
  251. END IF
  252. *
  253. * Norm of A:
  254. *
  255. ANORM = MAX( ZLANGE( NORMA, N, N, A, LDA, RWORK ), UNFL )
  256. *
  257. * Norm of E:
  258. *
  259. ENORM = MAX( ZLANGE( NORME, N, N, E, LDE, RWORK ), ULP )
  260. *
  261. * Norm of error:
  262. *
  263. * Error = AE - EW
  264. *
  265. CALL ZLASET( 'Full', N, N, CZERO, CZERO, WORK, N )
  266. *
  267. JOFF = 0
  268. DO 100 JCOL = 1, N
  269. IF( ITRNSW.EQ.0 ) THEN
  270. WTEMP = W( JCOL )
  271. ELSE
  272. WTEMP = DCONJG( W( JCOL ) )
  273. END IF
  274. *
  275. IF( ITRNSE.EQ.0 ) THEN
  276. DO 70 JROW = 1, N
  277. WORK( JOFF+JROW ) = E( JROW, JCOL )*WTEMP
  278. 70 CONTINUE
  279. ELSE IF( ITRNSE.EQ.1 ) THEN
  280. DO 80 JROW = 1, N
  281. WORK( JOFF+JROW ) = E( JCOL, JROW )*WTEMP
  282. 80 CONTINUE
  283. ELSE
  284. DO 90 JROW = 1, N
  285. WORK( JOFF+JROW ) = DCONJG( E( JCOL, JROW ) )*WTEMP
  286. 90 CONTINUE
  287. END IF
  288. JOFF = JOFF + N
  289. 100 CONTINUE
  290. *
  291. CALL ZGEMM( TRANSA, TRANSE, N, N, N, CONE, A, LDA, E, LDE, -CONE,
  292. $ WORK, N )
  293. *
  294. ERRNRM = ZLANGE( 'One', N, N, WORK, N, RWORK ) / ENORM
  295. *
  296. * Compute RESULT(1) (avoiding under/overflow)
  297. *
  298. IF( ANORM.GT.ERRNRM ) THEN
  299. RESULT( 1 ) = ( ERRNRM / ANORM ) / ULP
  300. ELSE
  301. IF( ANORM.LT.ONE ) THEN
  302. RESULT( 1 ) = ( MIN( ERRNRM, ANORM ) / ANORM ) / ULP
  303. ELSE
  304. RESULT( 1 ) = MIN( ERRNRM / ANORM, ONE ) / ULP
  305. END IF
  306. END IF
  307. *
  308. * Compute RESULT(2) : the normalization error in E.
  309. *
  310. RESULT( 2 ) = MAX( ABS( ENRMAX-ONE ), ABS( ENRMIN-ONE ) ) /
  311. $ ( DBLE( N )*ULP )
  312. *
  313. RETURN
  314. *
  315. * End of ZGET22
  316. *
  317. END