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.

sget22.f 11 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382
  1. *> \brief \b SGET22
  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 SGET22( TRANSA, TRANSE, TRANSW, N, A, LDA, E, LDE, WR,
  12. * WI, WORK, RESULT )
  13. *
  14. * .. Scalar Arguments ..
  15. * CHARACTER TRANSA, TRANSE, TRANSW
  16. * INTEGER LDA, LDE, N
  17. * ..
  18. * .. Array Arguments ..
  19. * REAL A( LDA, * ), E( LDE, * ), RESULT( 2 ), WI( * ),
  20. * $ WORK( * ), WR( * )
  21. * ..
  22. *
  23. *
  24. *> \par Purpose:
  25. * =============
  26. *>
  27. *> \verbatim
  28. *>
  29. *> SGET22 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. If an eigenvector is complex, as determined from WI(j)
  42. *> nonzero, then the max-norm of the vector ( er + i*ei ) is the maximum
  43. *> of
  44. *> |er(1)| + |ei(1)|, ... , |er(n)| + |ei(n)|
  45. *>
  46. *> W is a block diagonal matrix, with a 1 by 1 block for each real
  47. *> eigenvalue and a 2 by 2 block for each complex conjugate pair.
  48. *> If eigenvalues j and j+1 are a complex conjugate pair, so that
  49. *> WR(j) = WR(j+1) = wr and WI(j) = - WI(j+1) = wi, then the 2 by 2
  50. *> block corresponding to the pair will be:
  51. *>
  52. *> ( wr wi )
  53. *> ( -wi wr )
  54. *>
  55. *> Such a block multiplying an n by 2 matrix ( ur ui ) on the right
  56. *> will be the same as multiplying ur + i*ui by wr + i*wi.
  57. *>
  58. *> To handle various schemes for storage of left eigenvectors, there are
  59. *> options to use A-transpose instead of A, E-transpose instead of E,
  60. *> and/or W-transpose instead of W.
  61. *> \endverbatim
  62. *
  63. * Arguments:
  64. * ==========
  65. *
  66. *> \param[in] TRANSA
  67. *> \verbatim
  68. *> TRANSA is CHARACTER*1
  69. *> Specifies whether or not A is transposed.
  70. *> = 'N': No transpose
  71. *> = 'T': Transpose
  72. *> = 'C': Conjugate transpose (= Transpose)
  73. *> \endverbatim
  74. *>
  75. *> \param[in] TRANSE
  76. *> \verbatim
  77. *> TRANSE is CHARACTER*1
  78. *> Specifies whether or not E is transposed.
  79. *> = 'N': No transpose, eigenvectors are in columns of E
  80. *> = 'T': Transpose, eigenvectors are in rows of E
  81. *> = 'C': Conjugate transpose (= Transpose)
  82. *> \endverbatim
  83. *>
  84. *> \param[in] TRANSW
  85. *> \verbatim
  86. *> TRANSW is CHARACTER*1
  87. *> Specifies whether or not W is transposed.
  88. *> = 'N': No transpose
  89. *> = 'T': Transpose, use -WI(j) instead of WI(j)
  90. *> = 'C': Conjugate transpose, use -WI(j) instead of WI(j)
  91. *> \endverbatim
  92. *>
  93. *> \param[in] N
  94. *> \verbatim
  95. *> N is INTEGER
  96. *> The order of the matrix A. N >= 0.
  97. *> \endverbatim
  98. *>
  99. *> \param[in] A
  100. *> \verbatim
  101. *> A is REAL array, dimension (LDA,N)
  102. *> The matrix whose eigenvectors are in E.
  103. *> \endverbatim
  104. *>
  105. *> \param[in] LDA
  106. *> \verbatim
  107. *> LDA is INTEGER
  108. *> The leading dimension of the array A. LDA >= max(1,N).
  109. *> \endverbatim
  110. *>
  111. *> \param[in] E
  112. *> \verbatim
  113. *> E is REAL array, dimension (LDE,N)
  114. *> The matrix of eigenvectors. If TRANSE = 'N', the eigenvectors
  115. *> are stored in the columns of E, if TRANSE = 'T' or 'C', the
  116. *> eigenvectors are stored in the rows of E.
  117. *> \endverbatim
  118. *>
  119. *> \param[in] LDE
  120. *> \verbatim
  121. *> LDE is INTEGER
  122. *> The leading dimension of the array E. LDE >= max(1,N).
  123. *> \endverbatim
  124. *>
  125. *> \param[in] WR
  126. *> \verbatim
  127. *> WR is REAL array, dimension (N)
  128. *> \endverbatim
  129. *>
  130. *> \param[in] WI
  131. *> \verbatim
  132. *> WI is REAL array, dimension (N)
  133. *>
  134. *> The real and imaginary parts of the eigenvalues of A.
  135. *> Purely real eigenvalues are indicated by WI(j) = 0.
  136. *> Complex conjugate pairs are indicated by WR(j)=WR(j+1) and
  137. *> WI(j) = - WI(j+1) non-zero; the real part is assumed to be
  138. *> stored in the j-th row/column and the imaginary part in
  139. *> the (j+1)-th row/column.
  140. *> \endverbatim
  141. *>
  142. *> \param[out] WORK
  143. *> \verbatim
  144. *> WORK is REAL array, dimension (N*(N+1))
  145. *> \endverbatim
  146. *>
  147. *> \param[out] RESULT
  148. *> \verbatim
  149. *> RESULT is REAL array, dimension (2)
  150. *> RESULT(1) = | A E - E W | / ( |A| |E| ulp )
  151. *> RESULT(2) = max | m-norm(E(j)) - 1 | / ( n ulp )
  152. *> j
  153. *> \endverbatim
  154. *
  155. * Authors:
  156. * ========
  157. *
  158. *> \author Univ. of Tennessee
  159. *> \author Univ. of California Berkeley
  160. *> \author Univ. of Colorado Denver
  161. *> \author NAG Ltd.
  162. *
  163. *> \ingroup single_eig
  164. *
  165. * =====================================================================
  166. SUBROUTINE SGET22( TRANSA, TRANSE, TRANSW, N, A, LDA, E, LDE, WR,
  167. $ WI, WORK, RESULT )
  168. *
  169. * -- LAPACK test routine --
  170. * -- LAPACK is a software package provided by Univ. of Tennessee, --
  171. * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
  172. *
  173. * .. Scalar Arguments ..
  174. CHARACTER TRANSA, TRANSE, TRANSW
  175. INTEGER LDA, LDE, N
  176. * ..
  177. * .. Array Arguments ..
  178. REAL A( LDA, * ), E( LDE, * ), RESULT( 2 ), WI( * ),
  179. $ WORK( * ), WR( * )
  180. * ..
  181. *
  182. * =====================================================================
  183. *
  184. * .. Parameters ..
  185. REAL ZERO, ONE
  186. PARAMETER ( ZERO = 0.0, ONE = 1.0 )
  187. * ..
  188. * .. Local Scalars ..
  189. CHARACTER NORMA, NORME
  190. INTEGER IECOL, IEROW, INCE, IPAIR, ITRNSE, J, JCOL,
  191. $ JVEC
  192. REAL ANORM, ENORM, ENRMAX, ENRMIN, ERRNRM, TEMP1,
  193. $ ULP, UNFL
  194. * ..
  195. * .. Local Arrays ..
  196. REAL WMAT( 2, 2 )
  197. * ..
  198. * .. External Functions ..
  199. LOGICAL LSAME
  200. REAL SLAMCH, SLANGE
  201. EXTERNAL LSAME, SLAMCH, SLANGE
  202. * ..
  203. * .. External Subroutines ..
  204. EXTERNAL SAXPY, SGEMM, SLASET
  205. * ..
  206. * .. Intrinsic Functions ..
  207. INTRINSIC ABS, MAX, MIN, REAL
  208. * ..
  209. * .. Executable Statements ..
  210. *
  211. * Initialize RESULT (in case N=0)
  212. *
  213. RESULT( 1 ) = ZERO
  214. RESULT( 2 ) = ZERO
  215. IF( N.LE.0 )
  216. $ RETURN
  217. *
  218. UNFL = SLAMCH( 'Safe minimum' )
  219. ULP = SLAMCH( 'Precision' )
  220. *
  221. ITRNSE = 0
  222. INCE = 1
  223. NORMA = 'O'
  224. NORME = 'O'
  225. *
  226. IF( LSAME( TRANSA, 'T' ) .OR. LSAME( TRANSA, 'C' ) ) THEN
  227. NORMA = 'I'
  228. END IF
  229. IF( LSAME( TRANSE, 'T' ) .OR. LSAME( TRANSE, 'C' ) ) THEN
  230. NORME = 'I'
  231. ITRNSE = 1
  232. INCE = LDE
  233. END IF
  234. *
  235. * Check normalization of E
  236. *
  237. ENRMIN = ONE / ULP
  238. ENRMAX = ZERO
  239. IF( ITRNSE.EQ.0 ) THEN
  240. *
  241. * Eigenvectors are column vectors.
  242. *
  243. IPAIR = 0
  244. DO 30 JVEC = 1, N
  245. TEMP1 = ZERO
  246. IF( IPAIR.EQ.0 .AND. JVEC.LT.N .AND. WI( JVEC ).NE.ZERO )
  247. $ IPAIR = 1
  248. IF( IPAIR.EQ.1 ) THEN
  249. *
  250. * Complex eigenvector
  251. *
  252. DO 10 J = 1, N
  253. TEMP1 = MAX( TEMP1, ABS( E( J, JVEC ) )+
  254. $ ABS( E( J, JVEC+1 ) ) )
  255. 10 CONTINUE
  256. ENRMIN = MIN( ENRMIN, TEMP1 )
  257. ENRMAX = MAX( ENRMAX, TEMP1 )
  258. IPAIR = 2
  259. ELSE IF( IPAIR.EQ.2 ) THEN
  260. IPAIR = 0
  261. ELSE
  262. *
  263. * Real eigenvector
  264. *
  265. DO 20 J = 1, N
  266. TEMP1 = MAX( TEMP1, ABS( E( J, JVEC ) ) )
  267. 20 CONTINUE
  268. ENRMIN = MIN( ENRMIN, TEMP1 )
  269. ENRMAX = MAX( ENRMAX, TEMP1 )
  270. IPAIR = 0
  271. END IF
  272. 30 CONTINUE
  273. *
  274. ELSE
  275. *
  276. * Eigenvectors are row vectors.
  277. *
  278. DO 40 JVEC = 1, N
  279. WORK( JVEC ) = ZERO
  280. 40 CONTINUE
  281. *
  282. DO 60 J = 1, N
  283. IPAIR = 0
  284. DO 50 JVEC = 1, N
  285. IF( IPAIR.EQ.0 .AND. JVEC.LT.N .AND. WI( JVEC ).NE.ZERO )
  286. $ IPAIR = 1
  287. IF( IPAIR.EQ.1 ) THEN
  288. WORK( JVEC ) = MAX( WORK( JVEC ),
  289. $ ABS( E( J, JVEC ) )+ABS( E( J,
  290. $ JVEC+1 ) ) )
  291. WORK( JVEC+1 ) = WORK( JVEC )
  292. ELSE IF( IPAIR.EQ.2 ) THEN
  293. IPAIR = 0
  294. ELSE
  295. WORK( JVEC ) = MAX( WORK( JVEC ),
  296. $ ABS( E( J, JVEC ) ) )
  297. IPAIR = 0
  298. END IF
  299. 50 CONTINUE
  300. 60 CONTINUE
  301. *
  302. DO 70 JVEC = 1, N
  303. ENRMIN = MIN( ENRMIN, WORK( JVEC ) )
  304. ENRMAX = MAX( ENRMAX, WORK( JVEC ) )
  305. 70 CONTINUE
  306. END IF
  307. *
  308. * Norm of A:
  309. *
  310. ANORM = MAX( SLANGE( NORMA, N, N, A, LDA, WORK ), UNFL )
  311. *
  312. * Norm of E:
  313. *
  314. ENORM = MAX( SLANGE( NORME, N, N, E, LDE, WORK ), ULP )
  315. *
  316. * Norm of error:
  317. *
  318. * Error = AE - EW
  319. *
  320. CALL SLASET( 'Full', N, N, ZERO, ZERO, WORK, N )
  321. *
  322. IPAIR = 0
  323. IEROW = 1
  324. IECOL = 1
  325. *
  326. DO 80 JCOL = 1, N
  327. IF( ITRNSE.EQ.1 ) THEN
  328. IEROW = JCOL
  329. ELSE
  330. IECOL = JCOL
  331. END IF
  332. *
  333. IF( IPAIR.EQ.0 .AND. WI( JCOL ).NE.ZERO )
  334. $ IPAIR = 1
  335. *
  336. IF( IPAIR.EQ.1 ) THEN
  337. WMAT( 1, 1 ) = WR( JCOL )
  338. WMAT( 2, 1 ) = -WI( JCOL )
  339. WMAT( 1, 2 ) = WI( JCOL )
  340. WMAT( 2, 2 ) = WR( JCOL )
  341. CALL SGEMM( TRANSE, TRANSW, N, 2, 2, ONE, E( IEROW, IECOL ),
  342. $ LDE, WMAT, 2, ZERO, WORK( N*( JCOL-1 )+1 ), N )
  343. IPAIR = 2
  344. ELSE IF( IPAIR.EQ.2 ) THEN
  345. IPAIR = 0
  346. *
  347. ELSE
  348. *
  349. CALL SAXPY( N, WR( JCOL ), E( IEROW, IECOL ), INCE,
  350. $ WORK( N*( JCOL-1 )+1 ), 1 )
  351. IPAIR = 0
  352. END IF
  353. *
  354. 80 CONTINUE
  355. *
  356. CALL SGEMM( TRANSA, TRANSE, N, N, N, ONE, A, LDA, E, LDE, -ONE,
  357. $ WORK, N )
  358. *
  359. ERRNRM = SLANGE( 'One', N, N, WORK, N, WORK( N*N+1 ) ) / ENORM
  360. *
  361. * Compute RESULT(1) (avoiding under/overflow)
  362. *
  363. IF( ANORM.GT.ERRNRM ) THEN
  364. RESULT( 1 ) = ( ERRNRM / ANORM ) / ULP
  365. ELSE
  366. IF( ANORM.LT.ONE ) THEN
  367. RESULT( 1 ) = ONE / ULP
  368. ELSE
  369. RESULT( 1 ) = MIN( ERRNRM / ANORM, ONE ) / ULP
  370. END IF
  371. END IF
  372. *
  373. * Compute RESULT(2) : the normalization error in E.
  374. *
  375. RESULT( 2 ) = MAX( ABS( ENRMAX-ONE ), ABS( ENRMIN-ONE ) ) /
  376. $ ( REAL( N )*ULP )
  377. *
  378. RETURN
  379. *
  380. * End of SGET22
  381. *
  382. END